Ramdisk block device を応用、VirtualBox の仮想ドライブに RAM Disk を割り当て Linux をインストールしてみる

<font color=white>あけおめことよろ</font>

#　無　保　証　で　す
[当方執筆の技術情報に関するライセンス、免責事項、禁止事項](https://qiita.com/EarthSimilarityIndex/items/6b9bb2ccacb38aae15b1)

# 先行研究

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
 
https://www.virtualbox.org/manual/ch09.html#rawdisk

# RAM Disk block device の作成

>
2) 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)```な単位系](https://ja.wikipedia.org/wiki/2進接頭辞)と仮定）。

ホスト 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/

~~[キャタリナさん](https://dic.nicovideo.jp/a/%E3%82%AB%E3%82%BF%E3%83%AA%E3%83%8A%28%E3%82%B0%E3%83%A9%E3%83%B3%E3%83%96%E3%83%AB%E3%83%BC%E3%83%95%E3%82%A1%E3%83%B3%E3%82%BF%E3%82%B8%E3%83%BC%29)~~ OS 10.15 Catalina にも hdid や hdiutil が有りましたので恐らく大丈夫なはず。

## Windows10 ホスト
以下によると```ImDisk```がこの用途で使えそうです。
https://en.wikipedia.org/wiki/List_of_RAM_drive_software#Microsoft_Windows