あけおめことよろ
無 保 証 で す
先行研究
Ram Disk 上に仮想マシンを立てた時のコピー速度比較(Ram Disk、NvMe SSD、SSD、HDD、外付けHDD) - Qiita
https://qiita.com/takoyaki3/items/d1b2623c62aba5231f90
brd: メモリ上に作成するブロックデバイス - Qiita
https://qiita.com/satoru_takeuchi/items/6ea57ca74016d5d92425
動機
VirtualBox でオンメモリな仮想マシンを組んでみたかったので、つい。
※ ブロックデバイスを仮想 HDD として読み書き出来る仮想環境ならどれでも同じ用途で使えるはず。
環境
ホスト OS:modprobe brd
可能な、VirtualBox 導入済みの Linux
ゲスト OS:Slackware Linux 等のミニマル環境を組みやすい OS
※ Slackware 以外では、Debian や Arch、もしくは FreeBSD がミニマル環境を作りやすいと思います。Gentoo でやる場合はある程度割り当てるメモリに余裕を持たせた方が良さそう。
参考とした文献
RAM disk block device
How Linux kernel 3.x manage ramdisk as block device? - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/157041/how-linux-kernel-3-x-manage-ramdisk-as-block-device
Using the RAM disk block device with Linux — The Linux Kernel documentation
https://www.kernel.org/doc/html/latest/admin-guide/blockdev/ramdisk.html
brd.c は 550 行程のコードでした。
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/block/brd.c
VBoxManage internalcommands createrawvmdk
VBoxManage internalcommands createrawvmdk
https://www.serverwatch.com/server-tutorials/using-a-physical-hard-drive-with-a-virtualbox-vm.html
Chapter 9. Advanced Topics - Oracle® VM VirtualBox® User Manual
- 9.7. Advanced Storage Configuration
- 9.7.1. Using a Raw Host Hard Disk From a Guest
RAM Disk block device の作成
- Parameters
2a) Kernel Command Line Parameters
ramdisk_size=N
Size of the ramdisk.
This parameter tells the RAM disk driver to set up RAM disks of N k size. The default is 4096 (4 MB).
出典:https://www.kernel.org/doc/html/latest/admin-guide/blockdev/ramdisk.html#parameters
自分は 8G 程割り当てたかったので、1024(KiB)x8×2^10=8388608(KiB)
としました(割り当てが m×{(2^10)×n}
m×(2^10n)
な単位系と仮定)。
ホスト OS でのコマンドラインは以下
sudo modprobe brd rd_size=8388608
これで /dev/ramX(X には数字が入る)が現れます。
ramdisk の解放は /dev/ramX の umount 等の後、
sudo modprobe --remove brd
で良い気がする。
注意事項
ホスト OS のブロックデバイスの所有者が、例えば
$ ls -l /dev/ram0
brw-rw---- 1 root disk 1, 0 1月 1 11:08 /dev/ram0
のように設定されている場合、現在のユーザーをグループ "disk" に所属させれば root に昇格せずにブロックデバイスを読み書き出来ます。少し楽が出来ますが、うっかりdd if=/dev/zero of=/dev/sdX
等しないようお気をつけ下さい。
VirtualBox の仮想 HDD に物理ドライブを割り当てる機能を流用、RAM Disk を割り当て
以下は /dev/ram0 を読み書きする vmdk を$HOME/'VirtualBox VMs'/
以下に生成するコマンドラインの一例
VBoxManage internalcommands createrawvmdk -filename $HOME/'VirtualBox VMs'/ramdisk.vmdk -rawdisk /dev/ram0
この$HOME/'VirtualBox VMs'/ramdisk.vmdk
を VirtualBox 側で仮想マシンの HDD に指定すれば O.K. です。
※ OS のインストール時や仮想マシンの運用時にエラーが出る時はドライブのコントローラの「HOSTのIOキャッシュを使う」の ON、OFF を切り替えると良いかも。
仮想マシンへの OS インストール
通常の OS 導入手順で問題ありませんでした。
この手法では仮想 HDD に割り当て可能な容量が小さいので軽量 OS が向いていると思います。
面倒と感じた部分
ホストの再起動の度に /dev/ram0 を再生成するため、その度にデバイスの UUID が変わってしまう。
↓
そのつど vmdk の作り直しと仮想メディアマネージャーや仮想マシンへの登録し直しが必要。
この辺はシェルスクリプト化して自動化すれば良さそうです。
※ dd で /dev/ram0 をバックアップ、リストアすればずっと同じ UUID で行けそうな気もします。
FreeBSD とか macOS とか Windows とか
Linux 以外の OS をホストとする場合に同じ用途で使えそうなコマンド/アプリを検索してみました。
FreeBSD ホスト
以下によると、mdconfig
(md は恐らく memory disk の略)コマンドを用いて同じことが出来そうです。
https://www.freebsd.org/doc/handbook/disks-virtual.html
macOS ホスト
BSD系だし、mdconfig 入ってるかな?
mdconfig: command not found
orz
以下によると、hdid
やhdiutil
がこの用途で使えそうです。
https://www.cnet.com/news/how-to-make-ram-disks-in-os-x/
キャタリナさん OS 10.15 Catalina にも hdid や hdiutil が有りましたので恐らく大丈夫なはず。
Windows10 ホスト
以下によるとImDisk
がこの用途で使えそうです。
https://en.wikipedia.org/wiki/List_of_RAM_drive_software#Microsoft_Windows