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の形式が違うんで、そのままでは駄目。

ぐぐったら、形式の変換器が提供されてるみたい。

vdiファイルをvmdkに変換してVMwareに移行

変換するに先立って、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圧縮し、カーネルローダーに埋め込むらしい。

本当にそうなってるの? 野次馬してみる。

Linuxカーネルビルド大全

カーネル/コンパイル/Arch Build System

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にかけられるようにするオプションは無いの?

Linux kernelのデバッグ

QEMU を使った Linux のカーネルデバッグ

こんな風に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。その進化系が出て来てる。屍を乗り越えて進化するとな。

initrd

Initramfsのしくみ

ArchLinuxに特化して調べてみる。的確な案内がすーっと出て来て気持がよい。

Initramfs の最小化

mkinitcpio

これが起動用の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

Arch Linuxインストールガイド 2021年版

Arch Linux を試してみた

Arch Linuxの復旧

入れる物は少なめ

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」、アプリは後から自分で入れる

時代は巡るってか、何時もウブの記事だけじゃつまらないからね。シンプルが一番、ごてごては大嫌いです。

Slax directory structure

AI