Создайте RAM-диск APFS на macOS High Sierra

обычно создание RAM-дисков работает со следующими командами

hdid -nomount ram://<blocksize>

Возвращает, например. /DEV/disk 2 Затем я отформатировал диск, скажем

newfs_hfs /dev/disk2

а затем установите его:

mount -t hfs /dev/disk2 /some/mount/target

Эта процедура не работает с APFS. Я нахожусь в High Sierra beta 9. Команда mount не выводит никаких ошибок, но путь не монтируется.

В моем случае, после завершения команды hdid, newfs_apfs -i /dev/disk2 дает

nx_kernel_mount:1364: checkpoint search: largest xid 1, best xid 1 @ 1
nx_kernel_mount:1422: sanity checking all nx state... please be patient.
spaceman_metazone_init:278: no metazone for device 0, of size 209715200 bytes, block_size 4096
apfs_newfs:18075: FS will NOT be encrypted.

Когда я вхожу в mount -t apfs /dev/disk2 /some/target/path, тогда команды монтирования работают в течение 2 секунд, не дают никакого выхода, и mount не был успешным.

Может ли кто-нибудь сказать мне, как на самом деле сделать RAM-диск APFS s.t. оно работает?: Р

PS: Я также пробовал что-то вроде diskutil partitionDisk /dev/disk2 GPT APFS myvolumename 0b, которое монтирует том в /Volumes/myvolumename, но создает еще один диск (disk3 в этом случае), который кажется мне странным!

Ответ 1

Найдено решение:

hdid -nomount ram://<blocksize>
diskutil erasedisk <format> <diskname> <output path of previous hdid command>

где <format> берется из diskutil listFilesystems из столбца "Личность". Да, мне кажется странным, что вам, возможно, придется процитировать этот параметр, например. при указании вариантов, чувствительных к регистру, но хорошо...

<blocksize> составляет 2048 * desired size in megabytes

Последняя команда форматирует RAM-диск и монтирует его на /Volumes/<diskname>

Кажется, что при входе diskutil list вы увидите два новых диска, один hdid и синтезированный.

Чтобы уничтожить RAM-диск снова, вызовите diskutil eject <output path of previous hdid command>, например. diskutil eject /dev/disk2

Это сделает всю работу за вас, размонтирует путь /Volumes/<diskname> и уничтожит два диска, освободив вашу память.

Имейте в виду, что минимальные/максимальные значения для <blocksize> зависят от выбранного <format>. Кроме того, <diskname> не всегда выбирается произвольно. Пример: FAT32 требует, чтобы он состоял из прописных букв!

Ура!

Ответ 2

@Glyph предоставил лучший ответ в комментарии к принятому ответу, но он заслуживает собственного ответа:

diskutil partitionDisk $(hdiutil attach -nomount ram://2048000) 1 GPTFormat APFS 'ramdisk' '100%'

Я обновил Glyph-ответ, чтобы немного упростить название тома.

Ответ 3

Кроме того, информация для удаления/уничтожения RAM-диска должна быть исправлена. ramdisk будет создан в пути /Volumes/'ramdisk', поэтому команда выглядит так:

diskutil eject /Volumes/'ramdisk'