Sending NVMe Admin Commands

Hi,

I’m currently working on a project to sanitize data (Remove customer data) on MacBook storage devices (Refurbish). The NVMe SSD is embedded on the motherboard. I’ve created a simple proof-of-concept code (Running in terminal) with the following steps:

Check and Match the NVMe Device: Verify that the physical drive (disk0) exists on the system. Open the Connection: Establish a connection to the device (disk0). Send NVMe Admin Commands: For testing, I sent the IDENTIFY (0x06) command to confirm that the connection to the device works. Close the Service and Connection: Terminate the connection after the test. However, during runtime, I encountered an error when sending the command: Error: Failed to send NVMe Admin Command with error: -536870206 ((iokit/common) invalid argument)

I’m unsure why this results in an "Invalid argument" error. Is the method I’m using to send the Admin Command incorrect? If so, what is the proper function call to use in the IOKit framework? Alternatively, are there any other recommended methods to achieve this?

In the future, I also need to send commands like ‘Sanitize (84h)’ and ‘Format NVM (80h).’ Since I’m new to macOS development, I’d greatly appreciate any advice or guidance from experts in this area.

I have attached the source code and related ioreg file for 'IOMedia' and 'IONVMeController' for you guy reference.

+-o APPLE SSD AP1024R Media  
  | {
  |   "Content" = "GUID_partition_scheme"
  |   "Removable" = No
  |   "Whole" = Yes
  |   "Leaf" = No
  |   "BSD Name" = "disk0"
  |   "Ejectable" = No
  |   "Preferred Block Size" = 4096
  |   "IOMediaIcon" = {"IOBundleResourceFile"="Internal.icns","CFBundleIdentifier"="com.apple.iokit.IOStorageFamily"}
  |   "BSD Minor" = 0
  |   "IOGeneralInterest" = "IOCommand is not serializable"
  |   "Writable" = Yes
  |   "BSD Major" = 1
  |   "Size" = 1000555581440
  |   "IOBusyInterest" = "IOCommand is not serializable"
  |   "Open" = Yes
  |   "Content Hint" = ""
  |   "BSD Unit" = 0
  | }
  | 
  +-o IOMediaBSDClient  
  +-o IOGUIDPartitionScheme  
    +-o iBootSystemContainer@1  
    | | {
    | |   "Open" = Yes
    | |   "Preferred Block Size" = 4096
    | |   "Base" = 24576
    | |   "Writable" = Yes
    | |   "IOBusyInterest" = "IOCommand is not serializable"
    | |   "Size" = 524288000
    | |   "Content" = "69646961-6700-11AA-AA11-00306543ECAC"
    | |   "BSD Minor" = 2
    | |   "Whole" = No
    | |   "Removable" = No
    | |   "UUID" = "83E93B73-39E4-4A20-8854-2030E6BBC236"
    | |   "BSD Unit" = 0
    | |   "BSD Major" = 1
    | |   "Ejectable" = No
    | |   "BSD Name" = "disk0s1"
    | |   "Partition ID" = 1
    | |   "IOGeneralInterest" = "IOCommand is not serializable"
    | |   "GPT Attributes" = 0
    | |   "Content Hint" = "69646961-6700-11AA-AA11-00306543ECAC"
    | |   "Leaf" = No
    | |   "TierType" = "Main"
    | | }
    | | 
    | +-o IOMediaBSDClient  
    | +-o AppleAPFSContainerScheme  
    |   +-o AppleAPFSMedia  
    |     | {
    |     |   "Logical Block Size" = 4096
    |     |   "Open" = Yes
    |     |   "Preferred Block Size" = 4096
    |     |   "Writable" = Yes
    |     |   "IOBusyInterest" = "IOCommand is not serializable"
    |     |   "Size" = 524288000
    |     |   "Content" = "EF57347C-0000-11AA-AA11-00306543ECAC"
    |     |   "BSD Minor" = 4
    |     |   "Whole" = Yes
    |     |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |     |   "Removable" = No
    |     |   "EncryptionBlockSize" = 4096
    |     |   "UUID" = "6D69BF99-B3F6-4B21-80FB-230D13EA3E7E"
    |     |   "BSD Unit" = 1
    |     |   "BSD Major" = 1
    |     |   "Ejectable" = No
    |     |   "BSD Name" = "disk1"
    |     |   "Physical Block Size" = 4096
    |     |   "IOGeneralInterest" = "IOCommand is not serializable"
    |     |   "Content Hint" = "EF57347C-0000-11AA-AA11-00306543ECAC"
    |     |   "Leaf" = No
    |     |   "OSInternal" = Yes
    |     | }
    |     | 
    |     +-o AppleAPFSMediaBSDClient  
    |     +-o AppleAPFSContainer  
    |       +-o iSCPreboot@1  
    |       | | {
    |       | |   "Logical Block Size" = 4096
    |       | |   "Open" = Yes
    |       | |   "Preferred Block Size" = 4096
    |       | |   "RoleValue" = 16
    |       | |   "Writable" = Yes
    |       | |   "IncompatibleFeatures" = 1
    |       | |   "Sealed" = "No"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "FullName" = "iSCPreboot"
    |       | |   "Size" = 524288000
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "BSD Minor" = 5
    |       | |   "FormattedBy" = "newfs_apfs (1933.41.2)"
    |       | |   "Whole" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "Removable" = No
    |       | |   "UUID" = "55238314-8925-476F-954F-B7B7675623D7"
    |       | |   "CaseSensitive" = No
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=73728,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=182,"Calls to VNOP_GETATTRLISTBULK"=23,"Calls to VNOP_CLOSE"=235,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=173,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=168,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=11,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=22,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=31,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=0,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=168,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=16384,"Calls to VNOP_READLINK"=1,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=0,"Calls to VNOP_READDIR"=0,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=235,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=12,"Read requests sent to block device"=11,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=16384,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=11,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=178,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=560269,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=0,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=24,"Calls to VNOP_GETATTR"=101370,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=0,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "BSD Unit" = 1
    |       | |   "Ejectable" = No
    |       | |   "Role" = ("Preboot")
    |       | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |       | |   "BSD Name" = "disk1s1"
    |       | |   "BSD Major" = 1
    |       | |   "Physical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "autodiskmount" = No
    |       | |   "Status" = "Online"
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "Leaf" = Yes
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o xART@2  
    |       | | {
    |       | |   "Logical Block Size" = 4096
    |       | |   "Open" = Yes
    |       | |   "Preferred Block Size" = 4096
    |       | |   "RoleValue" = 256
    |       | |   "Writable" = Yes
    |       | |   "IncompatibleFeatures" = 1
    |       | |   "Sealed" = "No"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "FullName" = "xART"
    |       | |   "Size" = 524288000
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "BSD Minor" = 8
    |       | |   "FormattedBy" = "newfs_apfs (1933.41.2)"
    |       | |   "Whole" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "Removable" = No
    |       | |   "UUID" = "BDBFA8E1-6949-469E-9A66-A531CEC0DAF4"
    |       | |   "CaseSensitive" = No
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=0,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=66,"Calls to VNOP_GETATTRLISTBULK"=2,"Calls to VNOP_CLOSE"=44,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=0,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=0,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=0,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=0,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=0,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=1,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=0,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=0,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=0,"Calls to VNOP_READDIR"=0,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=45,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=2,"Read requests sent to block device"=0,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=0,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=0,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=87,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=0,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=0,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=6,"Calls to VNOP_GETATTR"=43719,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=0,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "BSD Unit" = 1
    |       | |   "Ejectable" = No
    |       | |   "Role" = ("xART")
    |       | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |       | |   "BSD Name" = "disk1s2"
    |       | |   "BSD Major" = 1
    |       | |   "Physical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "autodiskmount" = No
    |       | |   "Status" = "Online"
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "Leaf" = Yes
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o Hardware@3  
    |       | | {
    |       | |   "Logical Block Size" = 4096
    |       | |   "Open" = Yes
    |       | |   "Preferred Block Size" = 4096
    |       | |   "RoleValue" = 320
    |       | |   "Writable" = Yes
    |       | |   "IncompatibleFeatures" = 1
    |       | |   "Sealed" = "No"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "FullName" = "Hardware"
    |       | |   "Size" = 524288000
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "BSD Minor" = 7
    |       | |   "FormattedBy" = "newfs_apfs (1933.41.2)"
    |       | |   "Whole" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "Removable" = No
    |       | |   "UUID" = "D9E0F26F-4031-4971-944F-1C8EC3B81C01"
    |       | |   "CaseSensitive" = No
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=352256,"Bytes read from block device"=2203648,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=277,"Calls to VNOP_GETATTRLISTBULK"=4,"Calls to VNOP_CLOSE"=188,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=135,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=120,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=96,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=71,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=39,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=47,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=120,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=48,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=24576,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=880640,"Calls to VNOP_READDIR"=2,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=18033,"Calls to VNOP_OPEN"=188,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=47,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=9,"Read requests sent to block device"=49,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=24576,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=96,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=238,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=5801833,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=192512,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=47,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=0,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=176128,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=18,"Calls to VNOP_GETATTR"=103474,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=47,"Metadata: Number of omap bytes written"=176128,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "BSD Unit" = 1
    |       | |   "Ejectable" = No
    |       | |   "Role" = ("Hardware")
    |       | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |       | |   "BSD Name" = "disk1s3"
    |       | |   "BSD Major" = 1
    |       | |   "Physical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "autodiskmount" = No
    |       | |   "Status" = "Online"
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "Leaf" = Yes
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o Recovery@4  
    |         | {
    |         |   "Logical Block Size" = 4096
    |         |   "Open" = No
    |         |   "Preferred Block Size" = 4096
    |         |   "RoleValue" = 4
    |         |   "Writable" = Yes
    |         |   "IncompatibleFeatures" = 1
    |         |   "Sealed" = "No"
    |         |   "IOBusyInterest" = "IOCommand is not serializable"
    |         |   "FullName" = "Recovery"
    |         |   "Size" = 524288000
    |         |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |         |   "BSD Minor" = 6
    |         |   "FormattedBy" = "newfs_apfs (1933.41.2)"
    |         |   "Whole" = No
    |         |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |         |   "Removable" = No
    |         |   "UUID" = "5F7B631D-0925-4DD6-ADCE-723EFE40F434"
    |         |   "CaseSensitive" = No
    |         |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=0,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=0,"Calls to VNOP_GETATTRLISTBULK"=0,"Calls to VNOP_CLOSE"=0,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=0,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=0,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=0,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=0,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=0,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=0,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=0,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=0,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=0,"Calls to VNOP_READDIR"=0,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=0,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=0,"Read requests sent to block device"=0,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=0,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=0,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=0,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=0,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=0,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=0,"Calls to VNOP_GETATTR"=0,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=0,"Calls to VNOP_PAGEOUT"=0}
    |         |   "BSD Unit" = 1
    |         |   "Ejectable" = No
    |         |   "Role" = ("Recovery")
    |         |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |         |   "BSD Name" = "disk1s4"
    |         |   "BSD Major" = 1
    |         |   "Physical Block Size" = 4096
    |         |   "IOGeneralInterest" = "IOCommand is not serializable"
    |         |   "autodiskmount" = No
    |         |   "Status" = "Online"
    |         |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |         |   "Leaf" = Yes
    |         | }
    |         | 
    |         +-o AppleAPFSVolumeBSDClient  
    +-o Untitled 2@2  
    | | {
    | |   "Open" = Yes
    | |   "Preferred Block Size" = 4096
    | |   "Base" = 524312576
    | |   "Writable" = Yes
    | |   "IOBusyInterest" = "IOCommand is not serializable"
    | |   "Size" = 994662584320
    | |   "Content" = "7C3457EF-0000-11AA-AA11-00306543ECAC"
    | |   "BSD Minor" = 3
    | |   "Whole" = No
    | |   "Removable" = No
    | |   "UUID" = "098FE86E-B260-4B8B-80D3-ED14D506A6E5"
    | |   "BSD Unit" = 0
    | |   "BSD Major" = 1
    | |   "Ejectable" = No
    | |   "BSD Name" = "disk0s2"
    | |   "Partition ID" = 2
    | |   "IOGeneralInterest" = "IOCommand is not serializable"
    | |   "GPT Attributes" = 0
    | |   "Content Hint" = "7C3457EF-0000-11AA-AA11-00306543ECAC"
    | |   "Leaf" = No
    | |   "TierType" = "Main"
    | | }
    | | 
    | +-o IOMediaBSDClient  
    | +-o AppleAPFSContainerScheme  
    |   +-o AppleAPFSMedia  
    |     | {
    |     |   "Logical Block Size" = 4096
    |     |   "Open" = Yes
    |     |   "Preferred Block Size" = 4096
    |     |   "Writable" = Yes
    |     |   "IOBusyInterest" = "IOCommand is not serializable"
    |     |   "Size" = 994662584320
    |     |   "Content" = "EF57347C-0000-11AA-AA11-00306543ECAC"
    |     |   "BSD Minor" = 12
    |     |   "Whole" = Yes
    |     |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |     |   "Removable" = No
    |     |   "EncryptionBlockSize" = 4096
    |     |   "UUID" = "DFA52161-6510-4A08-BF53-A574180A0201"
    |     |   "BSD Unit" = 3
    |     |   "BSD Major" = 1
    |     |   "Ejectable" = No
    |     |   "BSD Name" = "disk3"
    |     |   "Physical Block Size" = 4096
    |     |   "IOGeneralInterest" = "IOCommand is not serializable"
    |     |   "Content Hint" = "EF57347C-0000-11AA-AA11-00306543ECAC"
    |     |   "Leaf" = No
    |     | }
    |     | 
    |     +-o AppleAPFSMediaBSDClient  
    |     +-o AppleAPFSContainer  
    |       +-o Macintosh HD - Data@1  
    |       | | {
    |       | |   "FormattedBy" = "newfs_apfs (2236.120.10.0.1)"
    |       | |   "RoleValue" = 64
    |       | |   "IncompatibleFeatures" = 65
    |       | |   "Locked" = No
    |       | |   "Writable" = Yes
    |       | |   "BSD Unit" = 3
    |       | |   "EncryptionType" = "ScalablePFK"
    |       | |   "BSD Name" = "disk3s1"
    |       | |   "Size" = 994662584320
    |       | |   "Whole" = No
    |       | |   "Open" = Yes
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "Physical Block Size" = 4096
    |       | |   "Status" = "Online"
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=140640256,"Bytes read from block device"=3110699008,"Calls to VNOP_ALLOCATE"=256,"Calls to VNOP_LOOKUP"=1151264,"Calls to VNOP_GETATTRLISTBULK"=341409,"Calls to VNOP_CLOSE"=1331313,"Calls to VNOP_MNOMAP"=510687,"Calls to VNOP_INACTIVE"=469849,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=2861385,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=164419,"Calls to VNOP_CREATE"=17785,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=109113,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=41415,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=54107,"Calls to VNOP_MMAP_CHECK"=605259,"Calls to VNOP_MMAP"=624473,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=4,"Read requests received from user"=2614142,"Calls to VNOP_RENAME"=14295,"Calls to VNOP_SETATTR"=641272,"Calls to VNOP_MKDIR"=8122,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=173236224,"Calls to VNOP_READLINK"=1108501,"Calls to VNOP_LINK"=112,"Metadata: Number of bytes written"=351547392,"Calls to VNOP_READDIR"=71147,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=12675019473,"Calls to VNOP_OPEN"=1333285,"Calls to VNOP_MAKENAMEDSTREAM"=4,"Write requests sent to block device"=88643,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=1987,"Read requests sent to block device"=72978,"Calls to VNOP_SYMLINK"=683,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=157495296,"Metadata: Number of omap bytes read"=4452352,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=4480,"Calls to VNOP_STRATEGY"=161621,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=1186727,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=11288576,"Calls to VNOP_CLONEFILE"=376,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=29154812343,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=8309911552,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=84,"Calls to VNOP_WRITE"=1071374,"Calls to VNOP_REMOVE"=3556,"Calls to VNOP_PAGEIN"=33770,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=16469,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=107126784,"Calls to VNOP_RENAMEX"=14416,"Calls to VNOP_IOCTL"=50299,"Calls to VNOP_GETATTR"=11955761,"Calls to VNOP_SETXATTR"=4485,"Write requests received from user"=1071326,"Metadata: Number of omap bytes written"=93622272,"Calls to VNOP_PAGEOUT"=5489}
    |       | |   "UUID" = "06716F3E-6C7F-45E8-A717-5C0E6F92F0F1"
    |       | |   "Encrypted" = Yes
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "CaseSensitive" = No
    |       | |   "Ejectable" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "VolGroupMntFromName" = "/dev/disk3s1"
    |       | |   "Sealed" = "No"
    |       | |   "BSD Major" = 1
    |       | |   "Preferred Block Size" = 4096
    |       | |   "Leaf" = Yes
    |       | |   "VolGroupUUID" = "06716F3E-6C7F-45E8-A717-5C0E6F92F0F1"
    |       | |   "FullName" = "Macintosh HD - Data"
    |       | |   "Logical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "Removable" = No
    |       | |   "Role" = ("Data")
    |       | |   "BSD Minor" = 13
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o Update@2  
    |       | | {
    |       | |   "Logical Block Size" = 4096
    |       | |   "Open" = Yes
    |       | |   "Preferred Block Size" = 4096
    |       | |   "RoleValue" = 192
    |       | |   "Writable" = Yes
    |       | |   "IncompatibleFeatures" = 1
    |       | |   "Sealed" = "No"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "FullName" = "Update"
    |       | |   "Size" = 994662584320
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "BSD Minor" = 14
    |       | |   "FormattedBy" = "com.apple.MobileSof (1933.80.3)"
    |       | |   "Whole" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "Removable" = No
    |       | |   "UUID" = "330A3E56-7E6F-40CA-AFB3-B11BC4736689"
    |       | |   "CaseSensitive" = No
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=126976,"Bytes read from block device"=32768,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=469,"Calls to VNOP_GETATTRLISTBULK"=124,"Calls to VNOP_CLOSE"=235,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=99,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=5,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=10,"Calls to VNOP_CREATE"=2,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=5,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=2,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=13,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=5,"Calls to VNOP_RENAME"=2,"Calls to VNOP_SETATTR"=53,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=57344,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=339968,"Calls to VNOP_READDIR"=2,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=28531,"Calls to VNOP_OPEN"=236,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=7,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=2,"Read requests sent to block device"=3,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=57344,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=10,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=250,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=36698,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=90112,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=272,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=2,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=8192,"Calls to VNOP_RENAMEX"=2,"Calls to VNOP_IOCTL"=7,"Calls to VNOP_GETATTR"=107760,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=272,"Metadata: Number of omap bytes written"=102400,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "BSD Unit" = 3
    |       | |   "Ejectable" = No
    |       | |   "Role" = ("Update")
    |       | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |       | |   "BSD Name" = "disk3s2"
    |       | |   "BSD Major" = 1
    |       | |   "Physical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "autodiskmount" = No
    |       | |   "Status" = "Online"
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "Leaf" = Yes
    |       | |   "OSInternal" = Yes
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o Macintosh HD@3  
    |       | | {
    |       | |   "FormattedBy" = "com.apple.MobileSof (1933.80.3)"
    |       | |   "RoleValue" = 1
    |       | |   "IncompatibleFeatures" = 33
    |       | |   "Writable" = Yes
    |       | |   "BSD Unit" = 3
    |       | |   "VolBootable" = Yes
    |       | |   "BSD Name" = "disk3s3"
    |       | |   "Size" = 994662584320
    |       | |   "Whole" = No
    |       | |   "Open" = Yes
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "Physical Block Size" = 4096
    |       | |   "Status" = "Online"
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=880652288,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=1660958,"Calls to VNOP_GETATTRLISTBULK"=43611,"Calls to VNOP_CLOSE"=469352,"Calls to VNOP_MNOMAP"=13521,"Calls to VNOP_INACTIVE"=62861,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=228301,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=33513,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=82101,"File defrag: Number of blocks reallocated"=0,"AuthAPFS: Number of times digest did not match"=0,"Calls to VNOP_LISTXATTR"=3834,"Calls to VNOP_SEARCHFS"=0,"AuthAPFS: Number of bytes read synchronously"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=25,"Calls to VNOP_MMAP_CHECK"=29247,"Calls to VNOP_MMAP"=96507,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=6,"Read requests received from user"=16869,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=119173120,"Calls to VNOP_READLINK"=503206,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=16560128,"Calls to VNOP_READDIR"=184245,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"AuthAPFS: Number of times file data was validated"=37939,"Calls to VNOP_OPEN"=476146,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"AuthAPFS: Number of bytes returned synchronously"=0,"Calls to VNOP_PATHCONF"=9,"AuthAPFS: Number of bytes validated"=1371566080,"Read requests sent to block device"=33418,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=95850496,"Metadata: Number of omap bytes read"=7147520,"Metadata: Number of snapmeta bytes read"=36864,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=33418,"Metadata: Number of snapmeta bytes written"=8192,"Calls to VNOP_GETXATTR"=1585177,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=12288,"AuthAPFS: Number of times read was done synchronously"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=116891255,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=22358,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=18,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=8192,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=364,"Calls to VNOP_GETATTR"=4514839,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=110592,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "UUID" = "872E1CD4-3197-432A-BA97-14C8B36E84DB"
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "CaseSensitive" = No
    |       | |   "Ejectable" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "VolGroupMntFromName" = "/dev/disk3s3s1"
    |       | |   "Sealed" = "Yes"
    |       | |   "BSD Major" = 1
    |       | |   "Preferred Block Size" = 4096
    |       | |   "Leaf" = Yes
    |       | |   "VolGroupUUID" = "06716F3E-6C7F-45E8-A717-5C0E6F92F0F1"
    |       | |   "FullName" = "Macintosh HD"
    |       | |   "Logical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "Removable" = No
    |       | |   "Role" = ("System")
    |       | |   "BSD Minor" = 16
    |       | |   "autodiskmount" = No
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       | +-o com.apple.os.update-80465671D7D1CD9F89F66E0C36576E4BB8426AC40A79244BB878F21D6381A4B7@1  
    |       |   | {
    |       |   |   "Logical Block Size" = 4096
    |       |   |   "Open" = Yes
    |       |   |   "Preferred Block Size" = 4096
    |       |   |   "Writable" = No
    |       |   |   "Sealed" = "Yes"
    |       |   |   "IOBusyInterest" = "IOCommand is not serializable"
    |       |   |   "FullName" = "com.apple.os.update-80465671D7D1CD9F89F66E0C36576E4BB8426AC40A79244BB878F21D6381A4B7"
    |       |   |   "Size" = 994662584320
    |       |   |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       |   |   "BSD Minor" = 19
    |       |   |   "FormattedBy" = "com.apple.MobileSof (1933.80.3)"
    |       |   |   "Whole" = No
    |       |   |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       |   |   "Removable" = No
    |       |   |   "UUID" = "3E9A4229-9730-4183-B3F1-67944E0F4259"
    |       |   |   "BSD Unit" = 3
    |       |   |   "BSD Major" = 1
    |       |   |   "Ejectable" = No
    |       |   |   "VolGroupUUID" = "06716F3E-6C7F-45E8-A717-5C0E6F92F0F1"
    |       |   |   "BSD Name" = "disk3s3s1"
    |       |   |   "Physical Block Size" = 4096
    |       |   |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       |   |   "Status" = "Online"
    |       |   |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       |   |   "Leaf" = Yes
    |       |   | }
    |       |   | 
    |       |   +-o IOMediaBSDClient  
    |       +-o Preboot@4  
    |       | | {
    |       | |   "Logical Block Size" = 4096
    |       | |   "Open" = Yes
    |       | |   "Preferred Block Size" = 4096
    |       | |   "RoleValue" = 16
    |       | |   "Writable" = Yes
    |       | |   "IncompatibleFeatures" = 1
    |       | |   "Sealed" = "No"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "FullName" = "Preboot"
    |       | |   "Size" = 994662584320
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "BSD Minor" = 15
    |       | |   "FormattedBy" = "com.apple.MobileSof (1933.80.3)"
    |       | |   "Whole" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "Removable" = No
    |       | |   "UUID" = "DEC84AFF-AF04-420D-AF25-605BA08F3540"
    |       | |   "CaseSensitive" = No
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=122880,"Bytes read from block device"=32747520,"Calls to VNOP_ALLOCATE"=19,"Calls to VNOP_LOOKUP"=109171,"Calls to VNOP_GETATTRLISTBULK"=9868,"Calls to VNOP_CLOSE"=68048,"Calls to VNOP_MNOMAP"=7718,"Calls to VNOP_INACTIVE"=5863,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=6459,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=32345,"Calls to VNOP_CREATE"=11,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=67703,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=39,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=198,"Calls to VNOP_MMAP_CHECK"=36971,"Calls to VNOP_MMAP"=62044,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=3,"Read requests received from user"=1895,"Calls to VNOP_RENAME"=9,"Calls to VNOP_SETATTR"=37130,"Calls to VNOP_MKDIR"=2,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=389120,"Calls to VNOP_READLINK"=2537,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=319488,"Calls to VNOP_READDIR"=2586,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=50341183,"Calls to VNOP_OPEN"=68056,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=698,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=58,"Read requests sent to block device"=272,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=323584,"Metadata: Number of omap bytes read"=49152,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=2,"Calls to VNOP_STRATEGY"=970,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=182873,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=2,"Metadata: Number of blockref bytes read"=16384,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=7654645,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=52981760,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=220,"Calls to VNOP_REMOVE"=2,"Calls to VNOP_PAGEIN"=33770,"Calls to VNOP_BLKTOOFF"=2,"Calls to VNOP_RECLAIM"=13,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=65536,"Calls to VNOP_RENAMEX"=9,"Calls to VNOP_IOCTL"=41,"Calls to VNOP_GETATTR"=348887,"Calls to VNOP_SETXATTR"=1,"Write requests received from user"=220,"Metadata: Number of omap bytes written"=94208,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "BSD Unit" = 3
    |       | |   "Ejectable" = No
    |       | |   "Role" = ("Preboot")
    |       | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |       | |   "BSD Name" = "disk3s4"
    |       | |   "BSD Major" = 1
    |       | |   "Physical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "autodiskmount" = No
    |       | |   "Status" = "Online"
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "Leaf" = Yes
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o Recovery@5  
    |       | | {
    |       | |   "Logical Block Size" = 4096
    |       | |   "Open" = No
    |       | |   "Preferred Block Size" = 4096
    |       | |   "RoleValue" = 4
    |       | |   "Writable" = Yes
    |       | |   "IncompatibleFeatures" = 1
    |       | |   "Sealed" = "No"
    |       | |   "IOBusyInterest" = "IOCommand is not serializable"
    |       | |   "FullName" = "Recovery"
    |       | |   "Size" = 994662584320
    |       | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "BSD Minor" = 18
    |       | |   "FormattedBy" = "com.apple.MobileSof (1933.80.3)"
    |       | |   "Whole" = No
    |       | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |       | |   "Removable" = No
    |       | |   "UUID" = "8704F7B5-364E-402D-A4A7-9D56BAB4BEA4"
    |       | |   "CaseSensitive" = No
    |       | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=72470528,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=23,"Calls to VNOP_GETATTRLISTBULK"=2,"Calls to VNOP_CLOSE"=8,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=21,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=1477,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=1531,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=707,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=0,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=23,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=0,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=4096,"Calls to VNOP_READLINK"=4,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=0,"Calls to VNOP_READDIR"=0,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=6,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=2,"Read requests sent to block device"=1531,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=4096,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=1531,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=4189,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=0,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=23,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=3,"Calls to VNOP_GETATTR"=164,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=0,"Calls to VNOP_PAGEOUT"=0}
    |       | |   "BSD Unit" = 3
    |       | |   "Ejectable" = No
    |       | |   "Role" = ("Recovery")
    |       | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |       | |   "BSD Name" = "disk3s5"
    |       | |   "BSD Major" = 1
    |       | |   "Physical Block Size" = 4096
    |       | |   "IOGeneralInterest" = "IOCommand is not serializable"
    |       | |   "autodiskmount" = No
    |       | |   "Status" = "Online"
    |       | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |       | |   "Leaf" = Yes
    |       | | }
    |       | | 
    |       | +-o AppleAPFSVolumeBSDClient  
    |       +-o VM@6  
    |         | {
    |         |   "Logical Block Size" = 4096
    |         |   "Open" = Yes
    |         |   "Preferred Block Size" = 4096
    |         |   "RoleValue" = 8
    |         |   "Writable" = Yes
    |         |   "IncompatibleFeatures" = 1
    |         |   "Sealed" = "No"
    |         |   "IOBusyInterest" = "IOCommand is not serializable"
    |         |   "FullName" = "VM"
    |         |   "Size" = 994662584320
    |         |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
    |         |   "BSD Minor" = 17
    |         |   "FormattedBy" = "com.apple.MobileSof (1933.80.3)"
    |         |   "Whole" = No
    |         |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
    |         |   "Removable" = No
    |         |   "UUID" = "FDAFAC78-B0BA-4F20-9450-D264CFA6237F"
    |         |   "CaseSensitive" = No
    |         |   "Statistics" = {"Metadata: Number of fsroot bytes written"=8192,"Bytes read from block device"=0,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=69,"Calls to VNOP_GETATTRLISTBULK"=2,"Calls to VNOP_CLOSE"=46,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=2,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=0,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=0,"Calls to VNOP_CREATE"=1,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=0,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=0,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=1,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=0,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=1,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=0,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=24576,"Calls to VNOP_READDIR"=1,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=46,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=2,"Read requests sent to block device"=0,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=0,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=0,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=89,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=0,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=1,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=1,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=4,"Calls to VNOP_GETATTR"=105635,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=8192,"Calls to VNOP_PAGEOUT"=0}
    |         |   "BSD Unit" = 3
    |         |   "Ejectable" = No
    |         |   "Role" = ("VM")
    |         |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
    |         |   "BSD Name" = "disk3s6"
    |         |   "BSD Major" = 1
    |         |   "Physical Block Size" = 4096
    |         |   "IOGeneralInterest" = "IOCommand is not serializable"
    |         |   "autodiskmount" = No
    |         |   "Status" = "Online"
    |         |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
    |         |   "Leaf" = Yes
    |         | }
    |         | 
    |         +-o AppleAPFSVolumeBSDClient  
    +-o RecoveryOSContainer@3  
      | {
      |   "Open" = No
      |   "Preferred Block Size" = 4096
      |   "Base" = 995186896896
      |   "Writable" = Yes
      |   "IOBusyInterest" = "IOCommand is not serializable"
      |   "Size" = 5368664064
      |   "Content" = "52637672-7900-11AA-AA11-00306543ECAC"
      |   "BSD Minor" = 1
      |   "Whole" = No
      |   "Removable" = No
      |   "UUID" = "B08DDA66-507E-4DA1-B9AA-224878244001"
      |   "BSD Unit" = 0
      |   "BSD Major" = 1
      |   "Ejectable" = No
      |   "BSD Name" = "disk0s3"
      |   "Partition ID" = 3
      |   "IOGeneralInterest" = "IOCommand is not serializable"
      |   "GPT Attributes" = 0
      |   "Content Hint" = "52637672-7900-11AA-AA11-00306543ECAC"
      |   "Leaf" = No
      |   "TierType" = "Main"
      | }
      | 
      +-o IOMediaBSDClient  
      +-o AppleAPFSContainerScheme  
        +-o AppleAPFSMedia  
          | {
          |   "Logical Block Size" = 4096
          |   "Open" = No
          |   "Preferred Block Size" = 4096
          |   "Writable" = Yes
          |   "IOBusyInterest" = "IOCommand is not serializable"
          |   "Size" = 5368664064
          |   "Content" = "EF57347C-0000-11AA-AA11-00306543ECAC"
          |   "BSD Minor" = 9
          |   "Whole" = Yes
          |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
          |   "Removable" = No
          |   "EncryptionBlockSize" = 4096
          |   "UUID" = "0FA8EDED-1874-4518-AA28-E54A0A8B6CC6"
          |   "BSD Unit" = 2
          |   "BSD Major" = 1
          |   "Ejectable" = No
          |   "BSD Name" = "disk2"
          |   "Physical Block Size" = 4096
          |   "IOGeneralInterest" = "IOCommand is not serializable"
          |   "Content Hint" = "EF57347C-0000-11AA-AA11-00306543ECAC"
          |   "Leaf" = No
          |   "OSInternal" = Yes
          | }
          | 
          +-o AppleAPFSMediaBSDClient  
          +-o AppleAPFSContainer  
            +-o Recovery@1  
            | | {
            | |   "Logical Block Size" = 4096
            | |   "Open" = No
            | |   "Preferred Block Size" = 4096
            | |   "RoleValue" = 4
            | |   "Writable" = Yes
            | |   "IncompatibleFeatures" = 1
            | |   "Sealed" = "No"
            | |   "IOBusyInterest" = "IOCommand is not serializable"
            | |   "FullName" = "Recovery"
            | |   "Size" = 5368664064
            | |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
            | |   "BSD Minor" = 10
            | |   "FormattedBy" = "newfs_apfs (1933.41.2)"
            | |   "Whole" = No
            | |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
            | |   "Removable" = No
            | |   "UUID" = "2056A4FB-4424-4713-B4B6-E088D6DAD54D"
            | |   "CaseSensitive" = No
            | |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=0,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=0,"Calls to VNOP_GETATTRLISTBULK"=0,"Calls to VNOP_CLOSE"=0,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=0,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=0,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=0,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=0,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=0,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=0,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=0,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=0,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=0,"Calls to VNOP_READDIR"=0,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=0,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=0,"Read requests sent to block device"=0,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=0,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=0,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=0,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=0,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=0,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=0,"Calls to VNOP_GETATTR"=0,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=0,"Calls to VNOP_PAGEOUT"=0}
            | |   "BSD Unit" = 2
            | |   "Ejectable" = No
            | |   "Role" = ("Recovery")
            | |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
            | |   "BSD Name" = "disk2s1"
            | |   "BSD Major" = 1
            | |   "Physical Block Size" = 4096
            | |   "IOGeneralInterest" = "IOCommand is not serializable"
            | |   "autodiskmount" = No
            | |   "Status" = "Online"
            | |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
            | |   "Leaf" = Yes
            | | }
            | | 
            | +-o AppleAPFSVolumeBSDClient  
            +-o Update@2  
              | {
              |   "Logical Block Size" = 4096
              |   "Open" = No
              |   "Preferred Block Size" = 4096
              |   "RoleValue" = 192
              |   "Writable" = Yes
              |   "IncompatibleFeatures" = 1
              |   "Sealed" = "No"
              |   "IOBusyInterest" = "IOCommand is not serializable"
              |   "FullName" = "Update"
              |   "Size" = 5368664064
              |   "Content" = "41504653-0000-11AA-AA11-00306543ECAC"
              |   "BSD Minor" = 11
              |   "FormattedBy" = "com.apple.MobileSof (1933.41.2)"
              |   "Whole" = No
              |   "IOStorageFeatures" = {"Unmap"=Yes,"Priority"=Yes,"Barrier"=Yes}
              |   "Removable" = No
              |   "UUID" = "341B09FD-AEE8-47C4-A2D8-4CF626F8B7EE"
              |   "CaseSensitive" = No
              |   "Statistics" = {"Metadata: Number of fsroot bytes written"=0,"Bytes read from block device"=0,"Calls to VNOP_ALLOCATE"=0,"Calls to VNOP_LOOKUP"=0,"Calls to VNOP_GETATTRLISTBULK"=0,"Calls to VNOP_CLOSE"=0,"Calls to VNOP_MNOMAP"=0,"Calls to VNOP_INACTIVE"=0,"Calls to VNOP_REMOVENAMEDSTREAM"=0,"Calls to VNOP_READ"=0,"File defrag: Number of failed defrag attempts"=0,"Calls to VNOP_BLOCKMAP"=0,"Calls to VNOP_CREATE"=0,"Metadata: Number of objects failed to write"=0,"Calls to VNOP_VERIFY"=0,"File defrag: Number of blocks reallocated"=0,"Calls to VNOP_LISTXATTR"=0,"Calls to VNOP_SEARCHFS"=0,"Metadata: Number of gbitmap bytes written"=0,"Calls to VNOP_FSYNC"=0,"Calls to VNOP_MMAP_CHECK"=0,"Calls to VNOP_MMAP"=0,"File defrag: Number of fragmented files found that we couldn't track"=0,"Calls to VNOP_GETNAMEDSTREAM"=0,"Read requests received from user"=0,"Calls to VNOP_RENAME"=0,"Calls to VNOP_SETATTR"=0,"Calls to VNOP_MKDIR"=0,"File defrag: Number of files that finished defragmentation"=0,"Metadata: Number of bytes read"=0,"Calls to VNOP_READLINK"=0,"Calls to VNOP_LINK"=0,"Metadata: Number of bytes written"=0,"Calls to VNOP_READDIR"=0,"File defrag: Number of files scanned for fragmentation"=0,"File defrag: Number of fragmented files found during scans"=0,"File defrag: Number of file extents split"=0,"Bytes written by user"=0,"Calls to VNOP_OPEN"=0,"Calls to VNOP_MAKENAMEDSTREAM"=0,"Write requests sent to block device"=0,"File defrag: Number of file extents reallocated"=0,"Calls to VNOP_PATHCONF"=0,"Read requests sent to block device"=0,"Calls to VNOP_SYMLINK"=0,"Calls to VNOP_EXCHANGE"=0,"Metadata: Number of fsroot bytes read"=0,"Metadata: Number of omap bytes read"=0,"Metadata: Number of snapmeta bytes read"=0,"Calls to VNOP_RMDIR"=0,"Calls to VNOP_STRATEGY"=0,"Metadata: Number of snapmeta bytes written"=0,"Calls to VNOP_GETXATTR"=0,"Decmpfs errors"=0,"Calls to VNOP_OFFTOBLK"=0,"Metadata: Number of blockref bytes read"=0,"Calls to VNOP_CLONEFILE"=0,"Metadata: Number of objects failed to read"=0,"Bytes read by user"=0,"Calls to VNOP_MKNOD"=0,"Bytes written to block device"=0,"Metadata: Number of gbitmap bytes read"=0,"Calls to VNOP_REMOVEXATTR"=0,"Calls to VNOP_WRITE"=0,"Calls to VNOP_REMOVE"=0,"Calls to VNOP_PAGEIN"=0,"Calls to VNOP_BLKTOOFF"=0,"Calls to VNOP_RECLAIM"=0,"File defrag: Number of regions to defrag found during scans"=0,"Metadata: Number of blockref bytes written"=0,"Calls to VNOP_RENAMEX"=0,"Calls to VNOP_IOCTL"=0,"Calls to VNOP_GETATTR"=0,"Calls to VNOP_SETXATTR"=0,"Write requests received from user"=0,"Metadata: Number of omap bytes written"=0,"Calls to VNOP_PAGEOUT"=0}
              |   "BSD Unit" = 2
              |   "Ejectable" = No
              |   "Role" = ("Update")
              |   "VolGroupUUID" = "00000000-0000-0000-0000-000000000000"
              |   "BSD Name" = "disk2s2"
              |   "BSD Major" = 1
              |   "Physical Block Size" = 4096
              |   "IOGeneralInterest" = "IOCommand is not serializable"
              |   "autodiskmount" = No
              |   "Status" = "Online"
              |   "Content Hint" = "41504653-0000-11AA-AA11-00306543ECAC"
              |   "Leaf" = Yes
              |   "OSInternal" = Yes
              | }
              | 
              +-o AppleAPFSVolumeBSDClient  

+-o AppleANS3NVMeController  
  | {
  |   "IOMatchedAtBoot" = Yes
  |   "IOPolledInterface" = "IONVMeControllerPolledAdapter is not serializable"
  |   "IOMinimumSaturationByteCount" = 8388608
  |   "IOMinimumSegmentAlignmentByteCount" = 4096
  |   "IOMaximumByteCountWrite" = 1048576
  |   "Physical Interconnect" = "Apple Fabric"
  |   "Physical Interconnect Location" = "Internal"
  |   "Vendor Name" = "Apple"
  |   "Serial Number" = "0ba01612223d5016"
  |   "IOMaximumSegmentByteCountWrite" = 4096
  |   "IOMaximumByteCountRead" = 1048576
  |   "Model Number" = "APPLE SSD AP1024R"
  |   "IOPropertyMatch" = {"role"="ANS2"}
  |   "AppleNANDStatus" = "Ready"
  |   "IOCommandPoolSize" = 253
  |   "Chipset Name" = "SSD Controller"
  |   "IOPersonalityPublisher" = "com.apple.iokit.IONVMeFamily"
  |   "IOPowerManagement" = {"DevicePowerState"=1,"CurrentPowerState"=1,"CapabilityFlags"=32768,"MaxPowerState"=1,"DriverPowerState"=1}
  |   "Firmware Revision" = "499.0.9"
  |   "NVMe Revision Supported" = "1.10"
  |   "CFBundleIdentifier" = "com.apple.iokit.IONVMeFamily"
  |   "IOMaximumSegmentCountWrite" = 256
  |   "IOProviderClass" = "RTBuddyService"
  |   "IOReportLegendPublic" = Yes
  |   "IOMaximumSegmentByteCountRead" = 4096
  |   "IOClass" = "AppleANS3NVMeController"
  |   "CFBundleIdentifierKernel" = "com.apple.iokit.IONVMeFamily"
  |   "IOPlatformPanicAction" = 0
  |   "IOMaximumSegmentCountRead" = 256
  |   "DeviceOpenedByEventSystem" = Yes
  |   "IOReportLegend" = ({"IOReportChannels"=((5644784279684675442,8590065666,"NVMe Power States")),"IOReportGroupName"="NVMe","IOReportChannelInfo"={"IOReportChannelUnit"=72058115876454424}})
  |   "IOMatchCategory" = "IODefaultMatchCategory"
  |   "Controller Characteristics" = {"default-bits-per-cell"=3,"firmware-version"="499.0.9 ","controller-unique-id"="0ba01612223d5016    ","capacity"=1024000000000,"pages-per-block-mlc"=1152,"pages-in-read-verify"=384,"sec-per-full-band-slc"=98304,"pages-per-block0"=0,"cell-type"=3,"bytes-per-sec-meta"=16,"Preferred IO Size"=1048576,"program-scheme"=0,"bus-to-msp"=(0,0,1,1,2,2,3,3),"num-dip"=64,"nand-marketing-name"="itlc_3d_g4_2p_256               ","package_blocks_at_EOL"=58560,"sec-per-full-band"=294912,"cau-per-die"=2,"page-size"=16384,"pages-per-block-slc"=384,"sec-per-page"=4,"nand-device-desc"=2305843216584425571,"num-bus"=8,"block-pairing-scheme"=0,"chip-id"="S5E","Encryption Type"="AES-XTS","vendor-name"="Sandisk         ","blocks-per-cau"=974,"dies-per-bus"=(4,4,4,4,4,4,4,4),"msp-version"="2.8.10.2.0      ","manufacturer-id"=<453c98b3f6e30000>}
  |   "IOProbeScore" = 300000
  | }
  | 
  +-o AppleEmbeddedNVMeTemperatureSensor  
  | +-o IOHIDEventServiceUserClient  
  +-o NS_01@1  
  | +-o IOBlockStorageDriver  
  |   +-o APPLE SSD AP1024R Media  
  |     +-o IOMediaBSDClient  
  |     +-o IOGUIDPartitionScheme  
  |       +-o iBootSystemContainer@1  
  |       | +-o IOMediaBSDClient  
  |       | +-o AppleAPFSContainerScheme  
  |       |   +-o AppleAPFSMedia  
  |       |     +-o AppleAPFSMediaBSDClient  
  |       |     +-o AppleAPFSContainer  
  |       |       +-o iSCPreboot@1  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o xART@2  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o Hardware@3  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o Recovery@4  
  |       |         +-o AppleAPFSVolumeBSDClient  
  |       +-o Untitled 2@2  
  |       | +-o IOMediaBSDClient  
  |       | +-o AppleAPFSContainerScheme  
  |       |   +-o AppleAPFSMedia  
  |       |     +-o AppleAPFSMediaBSDClient  
  |       |     +-o AppleAPFSContainer  
  |       |       +-o Macintosh HD - Data@1  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o Update@2  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o Macintosh HD@3  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       | +-o com.apple.os.update-80465671D7D1CD9F89F66E0C36576E4BB8426AC40A79244BB878F21D6381A4B7@1  
  |       |       |   +-o IOMediaBSDClient  
  |       |       +-o Preboot@4  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o Recovery@5  
  |       |       | +-o AppleAPFSVolumeBSDClient  
  |       |       +-o VM@6  
  |       |         +-o AppleAPFSVolumeBSDClient  
  |       +-o RecoveryOSContainer@3  
  |         +-o IOMediaBSDClient  
  |         +-o AppleAPFSContainerScheme  
  |           +-o AppleAPFSMedia  
  |             +-o AppleAPFSMediaBSDClient  
  |             +-o AppleAPFSContainer  
  |               +-o Recovery@1  
  |               | +-o AppleAPFSVolumeBSDClient  
  |               +-o Update@2  
  |                 +-o AppleAPFSVolumeBSDClient  
  +-o NS_02  
  +-o NS_03  
    +-o AppleNVMeEANUC  

//Created by Winson on 23/01/2025
//Open NVMe Device and Send NVMe Commands

#include 
#include 
#include 
#include 
#include 
#include 
#include 

class NVMeDeviceHandler {
private:
    std::string deviceName;
    io_service_t deviceService;
    io_connect_t ioServiceConnection;

public:
    NVMeDeviceHandler(const std::string& name) : deviceName(name), deviceService(0), ioServiceConnection(0) {}

    ~NVMeDeviceHandler() {
        if (ioServiceConnection) {
            IOServiceClose(ioServiceConnection);
        }
        if (deviceService) {
            IOObjectRelease(deviceService);
        }
    }

    bool openDevice() {
        
        //Step 1: Match the I/O service for IOMedia devices
        CFMutableDictionaryRef matchingDict = IOServiceMatching("IOMedia");
        if (!matchingDict) {
            std::cerr << "Failed to create matching dictionary for IOMedia" << std::endl;
            return false;
        }

        // Step 2: Add device name filter to cross check disk# enter from command prompt is valid disk num.
        CFStringRef devName = CFStringCreateWithCString(kCFAllocatorDefault, deviceName.c_str(), kCFStringEncodingUTF8);
        CFDictionarySetValue(matchingDict, CFSTR("BSD Name"), devName); //BSD Name are ties to IOMedia objects(disk0,1,2,etc)
        CFRelease(devName);

        //Step 3: Get the matching device service
        deviceService = IOServiceGetMatchingService(kIOMainPortDefault, matchingDict);
        if (!deviceService) {
            std::cerr << "Physical device " << deviceName << " not found." << std::endl;
            return false;
        }
        
        // Step 4: Re-match again the I/O service for NVMe controller devices
        CFMutableDictionaryRef matchingDict1 = IOServiceMatching("IONVMeController");
        if (!matchingDict1) {
            std::cerr << "Error: Could not create matching dictionary." << std::endl;
            return false;
        }

        // Step 5: Get the matching device service
        io_service_t service = IOServiceGetMatchingService(kIOMainPortDefault, matchingDict1);
        if (!service) {
            std::cerr << "Error: Could not find NVMe controller device." << std::endl;
            return false;
        }

        // Step 6: Open a connection to the NVMe device
        kern_return_t result = IOServiceOpen(service, mach_task_self(), 0, &ioServiceConnection);
        if (result != KERN_SUCCESS) {
            std::cerr << "Failed to open device with error: "
                      << result << " (" << mach_error_string(result) << ")" << std::endl;
            IOObjectRelease(service);
            return false;
                
        }

        std::cout << "Successfully opened device " << deviceName << "." << std::endl;
        return true;
    }

    void performActions() {
		//TODO Data Wipe command
        // Placeholder for NVMe-specific commands< "..." << std::endl;
    }
    
    bool sendNVMeAdminCommand() {

        // Construct the NVMe Identify Controller command
        struct NVMeIdentifyCommand {
            uint32_t opcode;   // NVMe Admin Command Opcode
            uint32_t nsid;     // Namespace Identifier
            uint64_t reserved; // Reserved
        };

        
        NVMeIdentifyCommand identifyCommand = {};
        identifyCommand.opcode = 0x06; // Identify command
        identifyCommand.nsid = 0;      // For Identify Controller

        // Prepare input and output buffers
        uint64_t input[] = {identifyCommand.opcode, identifyCommand.nsid};
        uint32_t inputCount = sizeof(input) / sizeof(uint64_t);

        uint64_t output[16] = {}; // Response buffer for Identify data
        uint32_t outputCount = sizeof(output) / sizeof(uint64_t);

        // Call IOConnectCallMethod
        kern_return_t result = IOConnectCallMethod(
            ioServiceConnection, // Connection
            1,                   // Method selector (verify the correct ID in documentation)
            input,               // Input data
            inputCount,          // Input data count
            nullptr,             // No additional input structure
            0,                   // Size of additional input
            output,              // Output buffer
            &outputCount,        // Output buffer size
            nullptr,             // No additional output structure
            nullptr              // Size of additional output
        );

        // Check the result
        if (result != KERN_SUCCESS) {
            std::cerr << "Failed to send NVMe Admin Command with error: "
                      << result << " (" << mach_error_string(result) << ")" << std::endl;
            return false;
        }

        // Successfully sent the command and received the response
        std::cout << "NVMe Admin Command sent successfully. Processing the response..." << std::endl;

        // Optionally, print the output response data
        std::cout << "Response Data: ";
        for (size_t i = 0; i < outputCount; ++i) {
            std::cout << output[i] << " ";
        }
        std::cout << std::endl;

        return true;
    }
};

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " " << std::endl;
        return 1;
    }

    std::string deviceName = argv[1];
    NVMeDeviceHandler deviceHandler(deviceName);

    if (!deviceHandler.openDevice()) {
        return 1;
    }

	//Todo
    deviceHandler.performActions();
    
	//Proof the the connection is worked 
    // Send NVMe Admin Command to test device interaction
    if (deviceHandler.sendNVMeAdminCommand()) {
        std::cout << "NVMe Admin Command was successful!" << std::endl;
    } else {
        std::cerr << "NVMe Admin Command failed." << std::endl;
    }

    return 0;
}

Thank you so much for your help!

Regards, Winson

where do you get the documentation that tells you that the method selector should be 1, or that the parameters should be packed the way you have packed them?

In general, objects with class names beginning with"Apple" are private to Apple. You can probably do what you're trying to do if you replace the Apple driver, but not through the Apple driver.

However, it may not be necessary at all. If I understand this document correctly, all Macs with a T2 chip or M series processor encrypt the built-in storage, all the time. https://support.apple.com/guide/security/volume-encryption-with-filevault-sec4c6dc1b6e/web.

Hi ssmith_c / Apple Engineer,

Thank you for your reply.

I am entirely new to Apple development and currently uncertain about where to start coding. I’ve successfully completed a Data Wipe application for Linux and Windows platforms, and I wanted to expand to macOS, as I find Apple products more secure and challenging to learn the library. My goal is not to modify Apple drivers but simply to perform a full data wipe to ensure no customer data remains. This requires sending specific commands such as Write, Format NVM, or Sanitize to the storage device.

Could you guide me on where to find the method selectors or provide any pointers to start?

The purpose of this project is to wipe onboard storage (specifically NVMe SSDs) on MacBooks before sending them for recycling. While I understand that Apple provides an Erase utility to delete media, we need to ensure compliance with specific standards for data sanitization.

Questions:

  1. Apple Erase Utility Standards:

Which data-wiping standard does the default Apple Erase utility follow? Is it NIST, IEEE, or DoD?

  1. Sending Commands to Apple NVMe SSDs:

Is it possible to send NVMe Admin Commands or NVM Commands (e.g., Sanitize, Format NVM) to onboard Apple NVMe SSDs? If this is not possible, what is the best recommend to wipe the data? However, utilities like BitRaser seem to perform this wipe in recovery mode. Not sure how they achieve this?

  1. Development Environment:

I am using Xcode to develop a command-line application. Are there any official guides or resources you recommend for this?

  1. IOKit and Low-Level Commands:

Can we use IOKit to send low-level commands directly to the NVMe device? If not, what alternative APIs or frameworks should I explore?

  1. Running Scripts in Recovery Mode:

How can I run a data erase script on the physical drive (e.g., disk0)? It need to be in recovery mode, right?

We’ve tested with BitRaser, and it successfully performs a data wipe even with encryption in place, as you mentioned. So, i think drive not encrypt and accept erase/sanitize command.

We aim to develop our own application, similar to what we’ve achieved on Linux and Windows platforms, to meet our customers' requirements for NIST (Purge or Clear) and IEEE (Purge or Clear) data sanitization standards.

I hope someone with expertise in this area can guide me in the right direction. We already have an enterprise developer account under our company, and we pay $299 annually for it. I would greatly appreciate your support to help me complete this project.

Thank you so much for your time and assistance.

Best regards, Winson

Is it possible to send NVMe Admin Commands or NVM Commands (e.g., Sanitize, Format NVM) to onboard Apple NVMe SSDs?

We do not currently have a public API for this. If you'd like such an API, please file an enhancement request asking for us to add one.

I'll also note that attempting to interact with undocumented UserClient is both dangerous and unsupported.

One clarification here:

However, during runtime, I encountered an error when sending the command: Error: Failed to send NVMe Admin Command with error: -536870206 ((iokit/common) invalid argument)

I’m unsure why this results in an "Invalid argument" error.

For future reference, IOKit (and the broader kernel) use a structure error code format that makes FAR more sense in hexadecimal. In this case:

-536870206 -> 0xE00002C2

//From IOReturn.h:
#define kIOReturnBadArgument     iokit_common_err(0x2c2) // invalid argument

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

Hi DTS Engineer,

Thank you for your reply and for providing information that has helped shorten my research in locating the Apple documentation for sending NVMe commands via the API.

I have a couple of questions:

  1. Once we request access from Apple, will the API become "private" and used exclusively by our company?
  2. Besides using the API, is there any other way to send low-level NVMe Admin Commands directly to Apple storage devices (HDD, SSD, and onboard SSD), or are there alternative methods available?

I appreciate your help. Thanks!

Regards, Winson

Sending NVMe Admin Commands
 
 
Q