VirtualBox vs. VMWARE
speed
QEMU上で動かしているriscv版のOpenBSDなんだけど、どの環境(HostOS)が一番速いかコンペしてみる。
対象は簡単なコードのコンパイルスピード。時計はリアルな時刻を供給してくれる金魚時計が使われるはずなんで、まずは公平と思っていいだろう。
on FreeBSD(thinkpad sl510/32Bit)
riscv$ cat mytime.c #include <time.h> time_t tval; int main(){ time(&tval); } riscv$ riscv$ time cc mytime.c 0m23.03s real 0m04.50s user 0m11.18s system 0m12.70s real 0m04.13s user 0m07.26s system 0m13.12s real 0m04.55s user 0m07.60s system
on ArchLinux(VirtualBOX)
0m10.45s real 0m02.56s user 0m05.96s system 0m05.68s real 0m01.32s user 0m03.77s system 0m06.14s real 0m01.64s user 0m03.86s system
on ArchLinux(VEWARE) see below
0m08.53s real 0m01.72s user 0m04.20s system 0m03.93s real 0m00.83s user 0m02.76s system 0m03.81s real 0m00.87s user 0m02.59s system
on OpenBSD(VMWARE)
0m16.06s real 0m01.38s user 0m03.93s system 0m07.69s real 0m01.42s user 0m05.41s system 0m07.75s real 0m01.19s user 0m05.79s system
同じOpenBSD環境でゲストOSをi386にした、参考出品。
i386$ time cc mytime.c 0m15.12s real 0m00.40s user 0m01.83s system 0m05.13s real 0m00.44s user 0m01.91s system 0m05.05s real 0m00.43s user 0m01.98s system
今度は、より実用的な例って事で、今迄何度か登場したconfigのコンパイル時間の計測。lex,yaccも登場する奴。yaccで展開した後の全コード行数は12000行になってた。これを持ってカーネルのコンパイルの代用とする。time make; make cleanの繰返し結果。初回はメモリーに乘るのに時間がかかっている。
尚、debianはqemuでriscVが動いてくれないので、取り敢えず退役願った為、コンペには不参加です。次期のdebianに期待。
on VMWARE
1m05.29s real 0m28.26s user 0m29.57s system 1m00.95s real 0m27.14s user 0m29.17s system 1m00.34s real 0m26.76s user 0m28.92s system
on VirtualBox
1m31.56s real 0m39.29s user 0m43.27s system 1m25.76s real 0m36.75s user 0m41.73s system 1m25.26s real 0m35.96s user 0m42.20s system
結果は明かにVMWAREの勝利。同じQEMUを動かしその性能をゲストOSの処理速度で計測するって言う回りくどい事をやってる。肝心のQEMEを動かす仮想環境がVirtualBOXかVMWAREを使うかで、これだけの差が出たって事だ。
VirtualBOXではスナップショットが取れるとか、素のコンソールの解像度を変更出来るとか、種々のHDD用ツールが充実してるとかの魅力は有る、けど、スピードが正義って事からすると、脇役になるかな。
dvi to vmdk
ArchLinuxをVMWAREでも動かしてみたい。いちからインストールする? ざっと考えたら、バーチャルボックスで動いているHDDを利用させて貰ったらいいんでないかい。でも残念な事にHDDの形式が違うんで、そのままでは駄目。
ぐぐったら、形式の変換器が提供されてるみたい。
変換するに先立って、DISKを縮小する。ゲストOSを動かして下記を実行。OSが放棄したエリアをZERO埋めして、削除。これで不要な部分はZEROで満されて、縮小のヒントになる。
dd if=/dev/zero of=zzz bs=4k rm zzz
次はゲストOSを落しておいて、縮小を実行。
"C:\Program Files\Oracle\VirtualBox\VBoxManage" modifyhd arch.vdi --compact
更に形式変換したDISKを作成。
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd --format VMDK arch.vdi ZZ.vmdk 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Clone medium created in format 'VMDK'. UUID: 3ab...
んが、起動させたら、ネットブートが動いてしまったぞ。何で? 色々考えたら、ArchLinuxはEFIブートだった。どうやる?
*.vmx に下記を追加するとEFIブート機構が働くそうな。VirtualBoxにはチェックボックスが有ったな。半年前の事だから、すっかり忘れていた。
firmware = "efi"
それから、boot画面を確実に出すには、bios.forceSetupOnce = "TRUE" を入れておくか、 BIOS.BootDelay = "8000" して、8秒の余裕も持って、ESC (F2) を押せるようにすれば良いみたい。
この設定を入れるとgrubのメニュー画面は出て来るようになったけど、loginまで辿りつけず。全くもって難儀な事だわい。アドバンスメニューを選んだら fallback initramfs なんてのがあった。ものは試しと選んでみたら起動した。
/boot/grub/grub.cfg を見ると
echo 'Loading Linux linux ...' linux /vmlinuz-linux root=UUID=2b.. rw console=tty0 console=ttyS0,38400n8 echo 'Loading initial ramdisk ...' initrd /intel-ucode.img /initramfs-linux.img ;; for fallback.img initrd /intel-ucode.img /initramfs-linux-fallback.img
ramdiskとして、何をロードするかの違いがあるようだ。その肝心の両者は、
[sakae@arch boot]$ ls -l initramfs-linux* vmlinuz* -rwxr-xr-x 1 root root 67454912 Dec 24 07:43 initramfs-linux-fallback.img* -rwxr-xr-x 1 root root 9633202 Dec 24 07:42 initramfs-linux.img* -rwxr-xr-x 1 root root 11190336 Dec 24 07:42 vmlinuz-linux*
[sakae@arch boot]$ file vmlinuz-linux vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 6.1.1-arch1-1 (linux@archlinux) #1 SMP PREEMPT_DYNAMIC Wed, 21 Dec 2022 22:27:55 +0000, RO-rootFS, swap_dev 0XA, Normal VGA [sakae@arch boot]$ file initramfs-linux.img initramfs-linux.img: Zstandard compressed data (v0.8+), Dictionary ID: None
こんな違いがあった。リナはとんでも無いしかけを考え出すんで、触らぬ神に祟り無しって事にしておくか。
いや、この際だから文句の一つを垂れておく。カーネルが圧縮されて格納されてるってどういう事。OpenBSD信者の身としては信じられない事なんですけど。。。
make linux kernel
物の本によると、リナのカーネルは、make vmlinuxでELFなカーネルが作られる。そして、make zImageすると、vmlinuxからobjcopy -O binaryで、平ったいカーネルvmlinux.binを作り、それをgzip圧縮し、カーネルローダーに埋め込むらしい。
本当にそうなってるの? 野次馬してみる。
sakae@deb:~/src/linux-5.10.144$ make help : Configuration targets: localmodconfig - Update current config disabling modules not loaded except those preserved by LMC_KEEP environment variable Other generic targets: all - Build all targets marked with [*] #+BEGIN_EXAMPLE * vmlinux - Build the bare kernel tags/TAGS - Generate tags file for editors cscope - Generate cscope index Architecture specific targets (x86): * bzImage - Compressed kernel image (arch/x86/boot/bzImage)
目についたオプション。
localmodconfigってのはOpenBSDのconfig擬きに必要なものだけを選ぶやつか。それからtag作りやcscopeもサポートしてる。ならばgdbにかけられるようにするオプションは無いの?
こんな風にqemuと組合せるとな。でもリナのコンパイルが大変そう。やはりターゲットはOpenBSDがよさそうだ。
Makefile中にobjcopyの宣言はなされているものの、使用現場には到達出来ず。不貞腐れて、銀行も扱いを放棄すると言う、遺物が見付かったので、からかっておきます。
fdimage - Create 1.4MB boot floppy image (arch/x86/boot/fdimage) fdimage144 - Create 1.4MB boot floppy image (arch/x86/boot/fdimage) fdimage288 - Create 2.8MB boot floppy image (arch/x86/boot/fdimage)
x86特有な事なので、arch/x86/Makefileを見ろ。
ifdef CONFIG_X86_X32 x32_ld_ok := $(call try-run,\ /bin/echo -e '1: .quad 1b' | \ $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \ $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \ $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n)
それっぽいのが出てきた。もう文化遺産だろうけど。
initramfs
で、カーネルを立ち上げる為のミニカーネルが必要になるとな。一時的なんでそんなのRAMDISKでいいんでないかい。それがinitrd。その進化系が出て来てる。屍を乗り越えて進化するとな。
ArchLinuxに特化して調べてみる。的確な案内がすーっと出て来て気持がよい。
これが起動用のramdisk内の内容。fallbackな奴を確認すると、山のようにファームウェアとモジュールを同梱してる事が分る。
[sakae@arch tmp]$ lsinitcpio -a /boot/initramfs-linux.img ==> Image: /boot/initramfs-linux.img ==> Created with mkinitcpio 34 ==> Kernel: 6.1.1-arch1-1 ==> Size: 9.19 MiB ==> Compressed with: zstd -> Uncompressed size: 24 MiB (.382 ratio) -> Estimated decompression time: 0.070s ==> Included modules: ata_generic firewire-core pata_acpi ata_piix firewire-sbp2 serio atkbd i8042 serio_raw cdrom intel-agp sr_mod crc16 intel-gtt ttm crc32c_generic jbd2 usbhid crc32c-intel libps2 usb-storage crc-itu-t mbcache virtio_blk drm_ttm_helper mmc_block vivaldi-fmap ext4 mmc_core vmwgfx ==> Included binaries: blkid fsck switch_root busybox kmod systemd-tmpfiles e2fsck mount udevadm :
lsinitcpioには、-x ってSWも有って、それを使うと、カレントDirに、展開出来る。
そして、こちらは起動後のモジュール数。VMWAREだと、26ヶだった。
[sakae@arch ~]$ lsmod | awk 'NF==3{print $1}' intel_rapl_msr crct10dif_pclmul : i8042 intel_agp
grub
Ubuntuの標準ブートローダーであるGRUBを改めて見直す
[sakae@arch ~]$ grep -E "menuentry |submenu " /boot/grub/grub.cfg | cut -b-70 menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --cl submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulin menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-lin menuentry 'Arch Linux, with Linux linux (fallback initramfs)' --class menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware
書き換えてみたけど、なんかEFIのメニューになっちゃうんだよな。何で? /etc/default/grubを編集してから、下記を実行すればいいはずなんだけどな。
grub-mkconfig -o /boot/grub/grub.cfg
Install ArchLinux on VMWARE Player
物は試しとばかりに、VMWAREにもAechLinuxを入れて、そこでも試してみたい。
Arch Linux を VMware Workstation にインストールした
VMware で Arch Linux をインストールするまで – Qiita
入れる物は少なめ
pacstrap /mnt base base-devel linux linux-firmware btrfs-progs intel-ucode vi vim dosfstools efibootmgr openssh dhcpcd netctl ccache man-db man-pages
んが、エラーだ。どうしたら良いの。少し塩漬けするか。
(183/183) checking package integrity [######################] 100% error: openssl: signature from "Pierre Schmitz <pierre@archlinux.org>" is marginal trust :: File /mnt/var/cache/pacman/pkg/openssl-3.0.7-4-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
ユーザーの追加方法とな。
useradd -m -g users -G wheel -s /bin/bash sakae passwd sakae visudo
archlinux-keyring
speed 2
オンメモリーで高速動作の「Slax」、アプリは後から自分で入れる
時代は巡るってか、何時もウブの記事だけじゃつまらないからね。シンプルが一番、ごてごては大嫌いです。