2019/03/24

T2-Macでもシングルユーザモードを(mojave)...

single-user mode

T2チップ搭載*1のMacでも、設定変更によってシングルユーザモードで起動できる
(部/外部ボリューム問わずシングルユーザモード起動が可能)
変更は上のように、macOS復元(cmd + r 起動)し、起動セキュリティユーティリティを起動して行い、「安全な起動」欄で「セキュリティなし」を選択することでシングルユーザーモードでブート出来るようになる
(外部ボリュームでも可能にしたい場合は、(当然)起動セキュリティユーティリティの「外部起動」欄も「外部メディアからの起動を許可」に変更しておくこと)


BootSecUtility

但し、外部ボリュームから起動している場合は、一度、内部ボリュームから起動し直した後に、macOS復元起動しないと、起動セキュリティユーティリティのアカウント認証時に失敗するようです
これは
Secure Enclave に送信される「復元時認証」資格情報をドライブの「Preboot」APFS ボリュームに保存する場合にのみサポートされるため..(macOS導入リファレンスより抜粋)
からで、Secure Bootの効かない外部(Preboot)ボリュームではなく、起動時に読み込むPrebootボリュームに保存しないとイケナイから...です
またこれは、Prebootボリュームの存在しないHFS+ではSecureBootは出来ないということになります

-参照:起動セキュリティユーティリティ-macOS導入リファレンス


SingleUserMode

補1)
シングルユーザモードでfsckをかける場合も、上の表示を見る限りでは
$ fsck -fy
だけで(fsck_apfsとしなくても)apfsのチェックも行っているようだ
...そして-fオプションは無効と怒られる^^///




補2)
シングルユーザモード抑制は、先の「安全な起動欄」設定で行なうべき*2だが、旧来からの方法で(疑似的に)行なうことも出来ないことはない

シングルユーザモードではOpenDirectoryでなく /etc/passwd , /etc/group , /etc/master.passwd を見ているので root の情報を見てみると/var/root:/bin/sh (ホームディレクトリ:ログインシェル)となっている
そこで /var/root/.profileをつくり下のように強制的にrebootさせることでシングルユーザーモードを擬似的に抑制することも出来る
$ cat /var/root/.profile
#!/bin/sh
/sbin/reboot
補3)
逆にシングルユーザで起動させる方法は、起動ユーティリティで許されていれば、NVRAMに書き込む方法
$ sudo nvram boot-args="-s"

/Library/Preferences/SystemConfiguration/com.apple.Boot.plist
に起動時オプション(Kernel Flags/-s)を書き込むという手もある(SIPプロテクト外すことに注意! /macOS復元起動で $csrutil disable)


ref.
*1 安全についてはSecureBoot,StorageEncryption,TouchIDなどを担当
*2 「起動セキュリティ」の「安全な起動」欄が「完全なセキュリティ」「中程度のセキュリティ」だとシングルユーザモードで起動出来ない(「セキュリティなし」設定のみシングルユーザモードで起動できる)

-起動セキュリティについて
https://support.apple.com/ja-jp/HT208198

-Apple T2 セキュリティチップについて
https://support.apple.com/ja-jp/HT208862

以上.




2019/03/19

拡張xx属性系(movaje)

snapshot/TimeMachineで拡張属性(EA/ExtendedAttribute)が出てきたので拡張xx属性系のメモ
何をもって拡張かというのはあるけれど^^...ざっくりと


(拡張)アクセス権(ACL)
$ ls -le
拡張属性
$ ls -l@
メタデータ属性(拡張属性のスーパセット)
 $ mdls
属性(MacOS/旧来からの)
$ GetFileInfo
ファイルフラグ
$ ls -lO

(homebrew/GNU版ls入れてる場合はTypeコマンド等で調べて...
$ type -a ls
ls is /usr/local/opt/coreutils/libexec/gnubin/ls
ls is /bin/ls
)

特にMacOS/旧来からの属性値は要注意
例えば,不可視属性は
$ SetFile -a V file
でも
$ chflags hidden file
でも設定できるけれど,各々互換性がない


例)
旧来/MacOS属性で不可視にする
$ setfile -a V AAA
$ getfileinfo  AAA
file: "/Path/To/AAA"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: aVbstclinmedz <--- 不可視になっている
created: 02/09/2019 08:49:23
modified: 02/09/2019 08:49:23
$ ls -laO@ AAA
-rw-r--r--@ 1 my staff  - 16  2  9 08:49 AAA <--- フラグはそのまま
com.apple.finderinfo 32
com.apple.genstore.origposixname 3
com.apple.lastuseddate#ps 16
com.apple.metadata:kmdlabel_kefbpc2rbuhzkno4sj34i7atzy 89

旧来/MacOS属性で可視にする
$ setfile -a v AAA
$ getfileinfo  AAA
file: "/Path/to/AAA"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz <--- 可視になっている
created: 02/09/2019 08:49:23
modified: 02/09/2019 08:49:23
$ ls -lao@ AAA
-rw-r--r--@ 1 my  staff  - 16  2  9 08:49 AAA <--- フラグは変わらず
com.apple.genstore.origposixname 3
com.apple.lastuseddate#ps 16
com.apple.metadata:kmdlabel_kefbpc2rbuhzkno4sj34i7atzy 89

フラグで不可視にする
$ chflags hidden AAA
$ ls -lao@ AAA
-rw-r--r--@ 1 my  staff  hidden 16  2  9 08:49 AAA <--- 不可視になっている
com.apple.genstore.origposixname 3
com.apple.lastuseddate#PS 16
com.apple.metadata:kMDLabel_kefbpc2rbuhzkno4sj34i7atzy 89
$ GetFileInfo AAA
file: "/Path/To/AAA"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz <--- 属性は変わらず
created: 02/09/2019 08:49:23
modified: 02/09/2019 08:49:23

フラグで可視にする
$ chflags nohidden AAA
$ ls -laO@ AAA
-rw-r--r--@ 1 my  staff  - 16  2  9 08:49  <--- 可視になっている
com.apple.genstore.origposixname 3
com.apple.lastuseddate#PS 16
com.apple.metadata:kMDLabel_kefbpc2rbuhzkno4sj34i7atzy 89
$ GetFileInfo AAA
file: "/Path/To/AAA"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz <--- 属性はそのまま
created: 02/09/2019 08:49:23
modified: 02/09/2019 08:49:23

2019/03/18

TimeMachineの除外設定(APFS snapshot関連/Mojave)


TimeMachineの除外設定メモ
TimeMachineの除外設定には以下の3つがある

  1. OS(デフォルト)の設定
    • /System/Library/CoreServices/backupd.bundle/Contents/Resources/StdExclusions.plist 記載
  2. ユーザ設定:ボリューム,パス指定
    • /Library/Preferences/com.apple.TimeMachine.plist 記載
  3. ユーザ設定:ファイル指定
    • ファイルの拡張属性として保存
$ tmutil localsnapshot ...つまりsnapshotではこれら全ての設定が反映される訳ではないので注意!

1.確認


OS(デフォルト)の設定の確認
$ defaults read /System/Library/CoreServices/backupd.bundle/Contents/Resources/StdExclusions.plist

ユーザ設定:ボリューム,パス指定の確認
全体は..
$ defaults read /Library/Preferences/com.apple.TimeMachine.plist
内ボリュームの除外,対象設定は..
$ defaults read /Library/Preferences/com.apple.TimeMachine.plist ExcludedVolumeUUIDs <--除外設定
$ defaults read /Library/Preferences/com.apple.TimeMachine.plist IncludedVolumeUUIDs <--対象設定
ref.Volume UUID値で返答されるので,diskutil info diskXsX等で調べておくこと
特に利用しなくなったボリュームの設定は残ったままになっているので適時削除しておくこと
パス指定は..
$ defaults read /Library/Preferences/com.apple.TimeMachine.plist SkipPaths
ユーザー設定:ファイル指定の確認
$ mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'"

$ sudo find / -xattrname com.apple.metadata:com_apple_backup_excludeItem
などで

2.変更


基本的にはtmutilコマンドで..
$ tmutil addexclusion [-p | -v] /Path/To/Item
と設定($ tmutil isexcluded /Path/To/Itemで確認)
コマンドオプションの
 -p :パス指定で保存
 -v :Volume UUID指定指定で保存
何も付けない :ファイルの拡張属性指定で保存
(拡張属性だと移動/コピーしても引き継がれる)となる

defaultsコマンドは,tmutilで指定出来ない場合だけ利用する
<例えば...もう壊れて使えないHDDを除外設定したい場合など...

例)Volume UUID1 と Volume UUID2 (だけ)を除外する場合
$ sudo defaults write /Library/Preferences/com.apple.TimeMachine.plist ExcludedVolumeUUIDs -array "Volume UUID1" "Volume UUID2"
remark! : 要素を追加するオプション(-array-add hoge)はあるけれど要素削除するオプションは見当たらないので "上書き"する(対象要素をすべて書く) 

補1:
ちなみに拡張属性としては
$ xattr -pl com.apple.metadata:com_apple_backup_excludeItem /Path/To/Item
com.apple.metadata:com_apple_backup_excludeItem:
00000000  62 70 6C 69 73 74 30 30 5F 10 11 63 6F 6D 2E 61  |bplist00_..com.a|
00000010  70 70 6C 65 2E 62 61 63 6B 75 70 64 08 00 00 00  |pple.backupd....|
00000020  00 00 00 01 01 00 00 00 00 00 00 00 01 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00 00 00 00 00 1C           |.............|
0000003d
みたいになっている

補2:
Time Machine環境設定(GUI)のオプションの"バックアップ対象から除外する項目"で設定すると同じファイルを指定しても、パス指定(SkipPaths)になったり、拡張属性保存(com_apple_backup_excludeItem = com.apple.backupd)になったり...ちょっと変^^

補3:
バックアップログは
/Volumes/HDD-Name/Backups.backupdb/Vol-Name/Latest/
下にあり
.VolumeUUID.clonedb
.Backup.log
.com.apple.TMCheckpoint
.exclusions.plist
などがある

2019/03/16

APFSのsnapshotをCLI操作で(Mojave)

snapshot_apfs

APFSのsnapshotをCLI操作するメモ(Mojave版)

※SnapshotはOS verup(10.12〜10.14)でコマンドが変わり*1、以下ではマニュアルに記載されていないコマンドオプションも使うので諸々注意!
ref *1 apfs_snapshotはもうない
USB_snapshot
ちなみにAPFSのsnapshotはファイルシステムの機能としてあるものなので例えばUSBメモリーのsnapshot(TimeMachine関係なく)を自身内部にとることで,そのUSBメモリーだけを持ち運び,他のMac機でもマウント利用することも出来る(他人のMacへの持ち出し/マウントも可能だ)
ふと...APFSなUSBメモリーをiPhone/iPadでマウントしてsnapshot使うと^^,,,


--目次---

1.snapshot対象ボリュームを確認する

2.snapshot対象ボリュームにする

3.snapshot対象ボリュームから外す

4.snapshotを取る

5.snapshotを確認する

6.snapshotをマウントする

7.snapshotをアンマウントする

8.snapshotを個別に削除する

9.snapshot容量を減らす


—内容---

1.snapshot対象ボリュームを確認する*2

対象の場合:Included,否対象の場合:Excludedを返す
$ tmutil isexcluded volume_mount_point | Path/to/Volume
[ Included|Excluded ] volume_mount_point | Path/to/Volume

2.snapshot対象ボリュームにする*2

指定はマウントポイントで..
$ sudo tmutil removeexclusion -v volume_mount_point
ref.*2 Mojaveではtmutilを介さずにsnapshotを取る方法がなさそうなので,ここではTimeMachineの対象ボリュームか?を確認/設定しています<-他の方法で出来る|知っている人教えてください

3.snapshot対象ボリュームから外す

指定はマウントポイントで..
$ sudo tmutil addexclusion -v volume_mount_point

4.snapthotを取る*3

実際にはTimeMachine対象の全APFSボリュームのsnapshotを取ることに..
$ tmutil localsnapshot

Created local snapshot with date: yyyy-mm-dd-hhmmss
Ref.*3 ボリュームを指定してsnapshotを取る方法がなさそうです<-出来る|知っている人教えてください

5.snapshotを確認する

-tmutilでやる場合
指定はマウントポイントで..
$ tmutil listlocalsnapshots volume_mount_point

com.apple.TimeMachine.yyyy-mm-dd-hhmmss
com.apple.TimeMachine.yyyy-mm-dd-hhmmss

...
-数/snapshot時刻だけなら..
$ tmutil listlocalsnapshotdates [volume_mount_point]

yyyy-mm-dd-hhmmss
yyyy-mm-dd-hhmmss
...
-diskutilでやる場合*3
こちらだとXIDが表示される(<-apfs_mount時に何時時点のSnapshotかが解る)
$ diskutil apfs listsnapshots <device | volume_mount_point>

Snapshots for hoge (xx found)
|
+-- Name: com.apple.TimeMachine.yyyy-mm-dd-hhmmss
| XID: xxxx
| NOTE: This snapshot sets the minimal allowed size of APFS Container hoge
|
+-- Name: com.apple.TimeMachine.yyyy-mm-dd-hhmmss
| XID: xxx
...
-apfs_stats*4で(も)数だけなら見れる
以下は全ボリューム表示
$ apfs_stats |grep -e snapshots -e Volume

    Volume VolumeName VolumeUUID on device
     Number of snapshots = Num    <---------- ココ!
...

ref.

*3 diskutil apfs < listSnapshots | listVolumeSnapshots | snapshots >のコマンドポプションは同じ??

*4 /System/Library/Filesystems/apfs.fs/Contents/Resources/下にある

6.snapshotをマウントする

-tmutilでやる場合
マウントポイントは/Volumes/com.apple.TimeMachine.localsnapshots/下に固定,ボリュームは指定できるが,全時点のスナップショットがマウントされる
マウントするボリューム指定はマウントポイントで..
$ tmutil mountlocalsnapshots volume_mount_point

Mounted local snapshots: (
"/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/RootVolume/yyyy-mm-dd-hhmmss/Volume",
"/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/RootVolume/yyyy-mm-dd-hhmmss/Volume",
...
)

$ df
...
com.apple.TimeMachine.yyyy-mm-dd-hhmmss@/dev/diskXsX xxxxxx xxxxxx xxxxxx xx% xxx xxxxxxxxxxxx 0% /Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/RootVolumeName/yyyy-mm-dd-hhmms/Volume

com.apple.TimeMachine.yyyy-mm-dd-hhmmss@/dev/diskXsX xxxxxx xxxxxx xxxxxx xx% xxx xxxxxxxxxxxx 0% /Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/RootVolumeName/yyyy-mm-dd-hhmms/Volume

...

-mount_apfs*4でやる場合
tmutilと違って,どのボリュームのどの時点でのsnapshotをマウントするか?,また,どこにマウントするか?指定可能
以下は,com.apple.TimeMachine.yyyy-mm-dd-hhmmss時点の /Path/To/Volumeボリュームを volume_mount_pointにマウント
$ mkdir volume_mount_point
$ mount_apfs -s com.apple.TimeMachine.yyyy-mm-dd-hhmmss /Path/To/Volume volume_mount_point

mount_apfs: snapshot implicitly mounted readonly

$ df
...
com.apple.TimeMachine.yyyy-mm-dd-hhmmss@/dev/diskXsX xxxxxx xxxxxx xxxxxx xx% xxx xxxxxxxxxxxx 0% volume_mount_point
...
Remark! : mount_apfsの場合,Finder上では “VolumeName@snap-XID”で表示されるので注意! (XIDはdiskutil apfs listsnapshots <device | volume_mount_point>で日時と対応づける)

7.snapshotをアンマウントする

-tmutilの場合
$ tmutil unmountlocalsnapshots volume_mount_point

Unmounted local snapshots: (
"/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/RootVolume/yyyy-mm-dd-hhmmss/Volume",
"/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/RootVolume/yyyy-mm-dd-hhmmss/Volume",
...
)
-apfs_mountの場合
$ diskutil unmount volume_mount_point

Unmount successful for volume_mount_point

 

8.snapshotを個別に削除する

-tmutilの場合
snapshotはタイムスタンプ指定で..
$ tmutil deletelocalsnapshots yyyy-mm-dd-hhmmss

Deleted local snapshot 'yyyy-mm-dd-hhmmss' 


-diskutilの場合
デバイス名|マウントポイント と snapshot名|XID を指定して..
$ diskutil apfs deleteSnapshot

< device | volume_mount_point > <-xid XID | -name com.apple.TimeMachine.yyyy-mm-dd-hhmmss >

9.snapshot容量を減らす

ボリュームはマウントポイント指定,空ける容量:purge_bype,優先度(高1-4低):urgent_level
$ tmutil thinlocalsnapshots volume_mount_point [purge_byte] [urgent_level]

Thinned local snapshots:
com.apple.TimeMachine.yyyy-mm-dd-hhmmss
com.apple.TimeMachine.yyyy-mm-dd-hhmmss
...


--例---
$
Snapshot対象ボリュームを確認
$ tmutil isexcluded /Volumes/USB_APFS
[Excluded]    /Volumes/USB_APFS
$ tmutil isexcluded /
[Included]    /

ルートボリューム:対象,USBメモリー:否対象なので各々逆の設定にする
$ sudo tmutil removeexclusion -v /Volumes/USB_APFS
$ tmutil isexcluded /Volumes/USB_APFS
[Included]    /Volumes/USB_APFS
$ sudo tmutil addexclusion -v /
$ tmutil isexcluded /
[Excluded]    /

現時点でのsnapshotを調べる
$ diskutil apfs snapshots /Volumes/USB_APFS
Snapshots for disk4s1 (12 found)
|
+-- Name: com.apple.TimeMachine.2019-03-18-085140
|   XID:  3614
|
+-- Name: com.apple.TimeMachine.2019-03-18-102520
|   XID:  3836
|   NOTE: This snapshot sets the minimal allowed size of APFS Container disk4
|
+-- Name: com.apple.TimeMachine.2019-03-18-132018
|   XID:  3888
|
+-- Name: com.apple.TimeMachine.2019-03-18-132316
|   XID:  3893
|
+-- Name: com.apple.TimeMachine.2019-03-18-132337
|   XID:  3943
|
+-- Name: com.apple.TimeMachine.2019-03-18-132347
|   XID:  3949
|
+-- Name: com.apple.TimeMachine.2019-03-18-132358
|   XID:  3961
|
+-- Name: com.apple.TimeMachine.2019-03-18-132408
|   XID:  3973
|
+-- Name: com.apple.TimeMachine.2019-03-18-132418
|   XID:  3984
|
+-- Name: com.apple.TimeMachine.2019-03-18-132428
|   XID:  3986
|
+-- Name: com.apple.TimeMachine.2019-03-18-132439
|   XID:  3989
|
+-- Name: com.apple.TimeMachine.2019-03-18-132531
    XID:  4033

snapshotを取る
$ tmutil localsnapshot
Created local snapshot with date: 2019-03-18-134020

確認する
$ diskutil apfs snapshots /Volumes/USB_APFS
Snapshots for disk4s1 (13 found)
|
+-- Name: com.apple.TimeMachine.2019-03-18-085140
|   XID:  3614
|
+-- Name: com.apple.TimeMachine.2019-03-18-102520
|   XID:  3836
|   NOTE: This snapshot sets the minimal allowed size of APFS Container disk4
|
+-- Name: com.apple.TimeMachine.2019-03-18-132018
|   XID:  3888
|
+-- Name: com.apple.TimeMachine.2019-03-18-132316
|   XID:  3893
|
+-- Name: com.apple.TimeMachine.2019-03-18-132337
|   XID:  3943
|
+-- Name: com.apple.TimeMachine.2019-03-18-132347
|   XID:  3949
|
+-- Name: com.apple.TimeMachine.2019-03-18-132358
|   XID:  3961
|
+-- Name: com.apple.TimeMachine.2019-03-18-132408
|   XID:  3973
|
+-- Name: com.apple.TimeMachine.2019-03-18-132418
|   XID:  3984
|
+-- Name: com.apple.TimeMachine.2019-03-18-132428
|   XID:  3986
|
+-- Name: com.apple.TimeMachine.2019-03-18-132439
|   XID:  3989
|
+-- Name: com.apple.TimeMachine.2019-03-18-132531
|   XID:  4033
|
+-- Name: com.apple.TimeMachine.2019-03-18-134020
    XID:  4072
$ tmutil listlocalsnapshots /Volumes/USB_APFS
com.apple.TimeMachine.2019-03-18-085140
com.apple.TimeMachine.2019-03-18-102520
com.apple.TimeMachine.2019-03-18-132018
com.apple.TimeMachine.2019-03-18-132316
com.apple.TimeMachine.2019-03-18-132337
com.apple.TimeMachine.2019-03-18-132347
com.apple.TimeMachine.2019-03-18-132358
com.apple.TimeMachine.2019-03-18-132408
com.apple.TimeMachine.2019-03-18-132418
com.apple.TimeMachine.2019-03-18-132428
com.apple.TimeMachine.2019-03-18-132439
com.apple.TimeMachine.2019-03-18-132531
com.apple.TimeMachine.2019-03-18-134020
$ tmutil listlocalsnapshotdates /Volumes/USB_APFS
Snapshot dates for disk /Volumes/USB_APFS:
2019-03-18-085140
2019-03-18-102520
2019-03-18-132018
2019-03-18-132316
2019-03-18-132337
2019-03-18-132347
2019-03-18-132358
2019-03-18-132408
2019-03-18-132418
2019-03-18-132428
2019-03-18-132439
2019-03-18-132531
2019-03-18-134020
$ /System/Library/Filesystems/apfs.fs/Contents/Resources/apfs_stats |grep -e Volume -e snapshots
...
  Volume USB_APFS 0702E76A-6149-4E36-8161-51A60B650379 on disk4s1
    Number of snapshots = 13
...

マウントする(tmutil)
$ tmutil mountlocalsnapshots /Volumes/USB_APFS/
Mounted local snapshots: (
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-085140/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132428/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132531/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132418/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132439/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-134020/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132347/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132018/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132408/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132316/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132337/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132358/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-102520/USB_APFS"
)
$ tmutil unmountlocalsnapshots /Volumes/USB_APFS/
Unmounted local snapshots: (
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132531/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132358/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132428/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132018/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132418/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132316/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-085140/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132337/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132439/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132408/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-102520/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-134020/USB_APFS",
    "/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/Suzumebachi/2019-03-18-132347/USB_APFS"
)
マウントする(mount_apfs)
$ mkdir ~/tmp
$ mount_apfs -s com.apple.TimeMachine.2019-03-18-134020 /Volumes/USB_APFS/ ~/tmp/
mount_apfs: snapshot implicitly mounted readonly
$ df -h
...
com.apple.TimeMachine.2019-03-18-134020@/dev/disk4s1  7.1Gi  1.6Gi  5.4Gi    24%       96 9223372036854775711    0%   /Users/hoge/tmp
...
$ mount
...
/dev/disk4s1 on /Volumes/USB_APFS (apfs, local, nodev, nosuid, journaled, noowners)
com.apple.TimeMachine.2019-03-18-134020@/dev/disk4s1 on /Users/hoge/tmp (apfs, local, nodev, nosuid, read-only, journaled, mounted by hoge)
...
$ diskutil apfs unmount ~/tmp
Unmount successful for /Users/hoge/tmp
$ df -h |grep TimeMachine
$ mount |grep TimeMachine

削除する(tmutil)
$ tmutil deletelocalsnapshots com.apple.TimeMachine.2019-03-18-134020
Deleted local snapshot '2019-03-18-134020'
$ tmutil listlocalsnapshots /Volumes/USB_APFS
com.apple.TimeMachine.2019-03-18-085140
com.apple.TimeMachine.2019-03-18-102520
com.apple.TimeMachine.2019-03-18-132018
com.apple.TimeMachine.2019-03-18-132316
com.apple.TimeMachine.2019-03-18-132337
com.apple.TimeMachine.2019-03-18-132347
com.apple.TimeMachine.2019-03-18-132358
com.apple.TimeMachine.2019-03-18-132408
com.apple.TimeMachine.2019-03-18-132418
com.apple.TimeMachine.2019-03-18-132428
com.apple.TimeMachine.2019-03-18-132439
com.apple.TimeMachine.2019-03-18-132531
削除する(diskutil)
$ diskutil apfs deletesnapshot /Volumes/USB_APFS/ -name com.apple.TimeMachine.2019-03-18-132531
Deleting APFS Snapshot XID 4033 "com.apple.TimeMachine.2019-03-18-132531" from APFS Volume disk4s1
Started APFS operation
Finished APFS operation
$ diskutil apfs deletesnapshot /Volumes/USB_APFS/ -xid 3989
Deleting APFS Snapshot XID 3989 "com.apple.TimeMachine.2019-03-18-132439" from APFS Volume disk4s1
Started APFS operation
Finished APFS operation
$ diskutil apfs deletesnapshot disk4s1 -name com.apple.TimeMachine.2019-03-18-13242
Deleting APFS Snapshot XID 3986 "com.apple.TimeMachine.2019-03-18-132428" from APFS Volume disk4s1
Started APFS operation
Finished APFS operation
$ diskutil apfs deletesnapshot disk4s1 -xid 3984
Deleting APFS Snapshot XID 3984 "com.apple.TimeMachine.2019-03-18-132418" from APFS Volume disk4s1
Started APFS operation
Finished APFS operation
$ diskutil listlocalsnapshots /Volumes/USB_APFS/
com.apple.TimeMachine.2019-03-18-085140
com.apple.TimeMachine.2019-03-18-102520
com.apple.TimeMachine.2019-03-18-132018
com.apple.TimeMachine.2019-03-18-132316
com.apple.TimeMachine.2019-03-18-132337
com.apple.TimeMachine.2019-03-18-132347
com.apple.TimeMachine.2019-03-18-132358
com.apple.TimeMachine.2019-03-18-132408

snapshot容量を減らす
$ tmutil thinlocalsnapshots /Volumes/USB_APFS/ 2147483648 1
Thinned local snapshots:
com.apple.TimeMachine.2019-03-18-085140
com.apple.TimeMachine.2019-03-18-102520
com.apple.TimeMachine.2019-03-18-132018
com.apple.TimeMachine.2019-03-18-132316
com.apple.TimeMachine.2019-03-18-132337
com.apple.TimeMachine.2019-03-18-132347
com.apple.TimeMachine.2019-03-18-132358
com.apple.TimeMachine.2019-03-18-132408
$ tmutil listlocalsnapshots /Volumes/USB_APFS/
$ 全て削除された...
$

ref.
tmutil(1)

mount_apfs(1)

diskutil(1)

2019/03/08

APFS上とHFS+上のコピー比較テスト(Mojave,CLI)

 

APFS Clone1

macOS/MojaveのFinderコピー等は,ボリュームがAPFSの場合,cloneが使われている
本文書は,CLI/CopyでAPFS vs HFS+の速度と容量効率を比較テストしてみた時のメモ
テスト環境はUSBメモリー(16GB)を APFSとHFS+(Journal,Non-CS) の2ボリュームに分けて, 各ボリューム上で同じ操作をして比較
(速度比較と容量比較を実施した日が違うため,(図のように)ファイル名は同じでも違うファイルを使っています)

USBmemoryAPFS Clone0

速度: APFS上だとclonefileなのでかなり速い! <-当たり前!
(clonefileは $ cp -c SrcFile DstFile で..)

$ time cp -p /Volumes/USB_HFS+/test.fmp12 /Volumes/USB_HFS+/test-copy.fmp12
real	1m34.994s
user 0m0.009s
sys 0m0.799s

$ time cp -cp /Volumes/USB_APFS/test.fmp12 /Volumes/USB_APFS/test-copy.fmp12
real	0m0.009s
user 0m0.002s
sys 0m0.004s
$

APFS Clone2

データ領域(ブロック)共有: これはアプリによるけれど,ここではFilemakerでコピーしたファイルにデータ追記した場合,どれくらいデータ領域(ブロック)が共有されるか?のテスト
APFS上,HFS+上共に,元データ(A)660MBと追記後データ(B)1.58GBの2ファイルが存在
このテストでは結果として,APFS上では元データの9割に当たるデータ領域が共有されていて優秀/高効率利用!

$ df -h
Filesystem      Size   Used  Avail Capacity  iused               ifree %iused  Mounted on
...
/dev/disk3s2   7.1Gi  2.2Gi  4.8Gi    32%       92          4294967187    0%   /Volumes/USB_HFS+
/dev/disk4s1   7.1Gi  1.6Gi  5.4Gi    24%       86 9223372036854775721    0%   /Volumes/USB_APFS
$

いわゆる↓この辺(About Apple File Systemより抜粋)のことなのだけど,環境が許せばUSBメモリー等でももっと使ってよいかも>APFS

ref.
- Apple File System Reference
<https://developer.apple.com/support/apple-file-system/Apple-File-System-Reference.pdf>

- About Apple File System
<https://developer.apple.com/documentation/foundation/file_system/about_apple_file_system>


以上.