最低限文化的なマカーのためのAPFS入門
iOSでは10.
なぜ、
- APFSは事実上問答無用で現在サポートされているApple製品すべてで採用されたのか
- Fusion DriveやHDDを内蔵するMacはその例外となったのか
- 開発者たる我々はどのような点に気を付けたら良いのか
本記事を読めば、
Copy-on-Write=SwiftとAPFSの共通点
APFSの最大の特長は、
CoWとはいったい何なのでしょうか? 実はSwiftもCoWを採用しています。そのことを確認してみましょう。
extension String {
func peek() {
let type = (UInt, UInt, UInt).self
let (u0, u1, u2) = unsafeBitCast(self, to:type)
debugPrint(u0, u1, u2)
}
}
let orig = "Hello, playground"
var copy = orig
orig.peek()
copy.peek()
copy += " string"
orig.peek()
copy.peek()
SwiftのString
は抽象化されていて、unsafeBitCast
を使って覗いています。最初にpeek()
したときにはorig
もcopy
も同一だったのが、copy
に"string"
を追記したあとは内容が変わっていることが確認できます。
SwiftのString
構造体は常に24bit=ポインタ3つ分。この値が固定であることからも、copy = orig
した時点では変わらず、copy
に変更が加えられたあとに変わったというのはどういうことか。内容に変更がなされるときに初めてデータが複製され、
別の見方をすると、
これが何を意味するのか。元のデータへのポインタさえ残っていれば、orig
に相当します。
スナップショットがあると何がうれしいか。まず、copy = orig
するだけです。それがファイルシステム全体に対して行えるのです。
実際にやってみましょう。macOSにはv10.
まずは念のためにTime Machineを有効にしておきましょうsudo tmutil enable
を実行してもOKです。

これだけで、tmutil snap shot
で手動でスナップショットを取ることもできます。完了は一瞬です。CoWではデータの複製は書き込み時なのですから、
$ tmutil localsnapshot Created local snapshot with date: 2017-10-17-165216
スナップショットのリストは、tmutil listlocalsnapshots
のあとにマウントポイントを指定して見ることができます。
% tmutil listlocalsnapshots / com.apple.TimeMachine.2017-10-18-150407 com.apple.TimeMachine.2017-10-18-160303 com.apple.TimeMachine.2017-10-18-170437 com.apple.TimeMachine.2017-10-18-180253 com.apple.TimeMachine.2017-10-18-190345 com.apple.TimeMachine.2017-10-18-200341 com.apple.TimeMachine.2017-10-18-210231 com.apple.TimeMachine.2017-10-18-220244 com.apple.TimeMachine.2017-10-18-230916 com.apple.TimeMachine.2017-10-19-000459 com.apple.TimeMachine.2017-10-19-010440 com.apple.TimeMachine.2017-10-19-021104 com.apple.TimeMachine.2017-10-19-030708 com.apple.TimeMachine.2017-10-19-040243 com.apple.TimeMachine.2017-10-19-050420 com.apple.TimeMachine.2017-10-19-070312 com.apple.TimeMachine.2017-10-19-080249 com.apple.TimeMachine.2017-10-19-090235 com.apple.TimeMachine.2017-10-19-111504 com.apple.TimeMachine.2017-10-19-122825 com.apple.TimeMachine.2017-10-19-133025 com.apple.TimeMachine.2017-10-19-142826
スナップショットが作成されていることを確認したら、




あとはここからTime Machineを選択し、
ファイルシステム全体をスナップショットでundoする場合はリカバリーモードでの再起動が必要ですが、

なんだか良いことづくめのように思えるCoWですが、
macOSの実装は、
ちなみに、tmutil
コマンドで削除することもできます。tmutil deletelocalsnapshot YYYY-MM-DDhhmmss
で日付を指定して1つずつ消すこともできますし、tmutil thinlocalsnapshots
で
なお大事なことなのであらためて申し上げると、
CoWではないHFS+では、
残念ながら、
さよならパーティション
APFSのもう1つの特長は、
図7と図8は起動ヴォリュームと同じコンテナにヴォリュームを追加した例。どちらも総容量が一緒であることが確認できます。
APFSではヴォリュームが論理的な存在です。実はこのことが、
「APFS? 何それ知らない」と昔のハードウェアは言った
新開発のファイルシステムの導入はそれ自体がたいへんなものですが、
ここで、diskutil list
の表示結果です
/dev/disk0 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *68.7 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_HFS Macintosh HD 67.9 GB disk0s2 3: Apple_Boot Recovery HD 650.1 MB disk0s3
/dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *68.7 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_APFS Container disk1 68.5 GB disk0s2 /dev/disk1 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +68.5 GB disk1 Physical Store disk0s2 1: APFS Volume root 15.2 GB disk1s1 2: APFS Volume Preboot 19.9 MB disk1s2 3: APFS Volume Recovery 519.9 MB disk1s3 4: APFS Volume VM 20.5 KB disk1s4
High SierraではSierraのころにあったRecovery Partitionが消え、Preboot
とはいったい何でしょう?
実は、
Prebootの役割は、
さらに今日においては、
その仮想マシンにおけるAPFS Bootサポートですが、
次回予告
どんなにすばらしい建築物も、
本誌最新号をチェック!
Software Design 2022年9月号
2022年8月18日発売
B5判/
定価1,342円
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識 - 第2特集
「知りたい」 「使いたい」 「発信したい」 をかなえる
OSSソースコードリーディングのススメ - 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画] Red Hat Enterprise Linux 9最新ガイド - 短期連載
今さら聞けないSSH
[前編] リモートログインとコマンドの実行 - 短期連載
MySQLで学ぶ文字コード
[最終回] 文字コードのハマりどころTips集 - 短期連載
新生「Ansible」 徹底解説
[4] Playbookの実行環境 (基礎編)