mmdebstrap とカーネルビルドによる最小 Ubuntu 22.04 の構築
前々回、前回と小さな Ubuntu をインストールする方法を説明してきましたが、この「小さな Ubuntu の構築」に関しては、この記事が最終回です。
環境
必要とする環境は前回と変わりませんが、インストール済み Ubuntu ではカーネルもビルドする必要があります。なお、カーネルのビルド手順は こちらを参照してください。
- Ubuntu 22.04 インストールメディア
- インストール対象の外付けストレージ(余裕をもって 1GByte 程度を用意します)
- インターネット環境(mmdebstrapでネットワーク越しにダウンロードするため)
- インストール済み Ubuntu 22.04 本体(mmdebstrapとカーネルビルドを実行する環境です)
前回のインストール手順と同じ個所
以下については前回、前々回の手順と同様です。
- 「パーティション作成 (インストール済み Ubuntu でコマンド実行①)」
- 「mmdebstrap 実行(インストール済み Ubuntu でコマンド実行②)」
- 「細かな設定(インストール済み Ubuntu でコマンド実行③)」の root パスワード設定まで
追加パッケージをインストールする手順
追加パッケージにカーネルの指定をせずにインストールします。カーネルを除外することで、それに依存しているパッケージも同時に除外することになり、サイズの縮小化に寄与します。
root@UbuntuTest:/# apt-get install grub-pc netplan.io systemd-sysv
ローダブルモジュールを無くす
インストール済み Ubuntu の環境でカーネルをビルドします。この目的は /boot にある initrd.img とローダブルモジュールを除外し、最終的に vmlinuz だけで起動できるようにするためです。具体的には以下の手順でローダブルモジュールを無くしていきます。
- カーネルに必要なモジュールの確認
lsmod で現在ロードされている環境のモジュールを確認します。
$ lsmod
Module Size Used by
tls 151552 0
bnep 32768 2
vsock_loopback 12288 0
vmw_vsock_virtio_transport_common 57344 1 vsock_loopback
intel_rapl_msr 20480 0
intel_rapl_common 40960 1 intel_rapl_msr
vmw_vsock_vmci_transport 45056 2
vsock 61440 7 vmw_vsock_virtio_transport_common,vsock_loopback,vmw_vsock_vmci_transport
intel_uncore_frequency_common 16384 0
snd_ens1371 36864 2
crct10dif_pclmul 12288 1
snd_ac97_codec 196608 1 snd_ens1371
polyval_clmulni 12288 0
polyval_generic 12288 1 polyval_clmulni
gameport 24576 1 snd_ens1371
ghash_clmulni_intel 16384 0
ac97_bus 12288 1 snd_ac97_codec
sha256_ssse3 32768 0
sha1_ssse3 32768 0
snd_pcm 196608 2 snd_ac97_codec,snd_ens1371
btusb 73728 0
binfmt_misc 24576 1
aesni_intel 356352 0
snd_seq_midi 24576 0
btrtl 32768 1 btusb
crypto_simd 16384 1 aesni_intel
snd_seq_midi_event 16384 1 snd_seq_midi
cryptd 24576 2 crypto_simd,ghash_clmulni_intel
nls_iso8859_1 12288 1
btbcm 24576 1 btusb
snd_rawmidi 57344 2 snd_seq_midi,snd_ens1371
rapl 20480 0
vmw_balloon 28672 0
btintel 53248 1 btusb
snd_seq 118784 2 snd_seq_midi,snd_seq_midi_event
btmtk 12288 1 btusb
joydev 32768 0
input_leds 12288 0
snd_seq_device 16384 3 snd_seq,snd_seq_midi,snd_rawmidi
bluetooth 1081344 13 btrtl,btmtk,btintel,btbcm,bnep,btusb
serio_raw 20480 0
snd_timer 49152 2 snd_seq,snd_pcm
ecdh_generic 16384 1 bluetooth
ecc 45056 1 ecdh_generic
snd 143360 11 snd_seq,snd_seq_device,snd_timer,snd_ac97_codec,snd_pcm,snd_rawmidi,snd_ens1371
vmw_vmci 106496 2 vmw_balloon,vmw_vsock_vmci_transport
soundcore 16384 1 snd
mac_hid 12288 0
sch_fq_codel 24576 2
vmwgfx 434176 4
drm_ttm_helper 12288 1 vmwgfx
ttm 110592 2 vmwgfx,drm_ttm_helper
drm_kms_helper 274432 3 vmwgfx
msr 12288 0
parport_pc 53248 0
ppdev 24576 0
lp 28672 0
drm 765952 9 vmwgfx,drm_kms_helper,drm_ttm_helper,ttm
parport 77824 3 parport_pc,lp,ppdev
efi_pstore 12288 0
ip_tables 36864 0
x_tables 69632 1 ip_tables
autofs4 57344 2
hid_generic 12288 0
mptspi 24576 2
mptscsih 53248 1 mptspi
usbhid 77824 0
crc32_pclmul 12288 0
mptbase 122880 2 mptspi,mptscsih
ahci 49152 0
psmouse 212992 0
hid 180224 2 usbhid,hid_generic
e1000 180224 0
libahci 57344 1 ahci
scsi_transport_spi 40960 1 mptspi
i2c_piix4 28672 0
pata_acpi 12288 0
- make menuconfig によるモジュールの組み込み化
上記モジュールの例えば e1000 は、カーネルコンフィグ時の Ethernet driver support にあります。この e1000 のコンフィグが <M> となっていますが、これを <*> に変更することでローダブルモジュールがカーネルに組み込まれるようになります。これを各ローダブルモジュールに行い、最終的に lsmod で何も表示されないようします。
ビルドしたカーネル(vmlinuz)のコピーと grub install
全てのローダブルモジュールの組み込み化を終えて、ビルドすると vmlinuz が生成されます。この生成したファイルを最小サイズに構築したい Ubuntu へコピーし、grubをインストールします。以下の手順で行います。なお、この時点では既に etc/fstab と etc/netplan/99_config.yaml の設定を終えているものとしています。
- 最小構成 Ubuntu のマウントと vmlinuz のコピー
vmlinuz は make install で一度 /boot へインストールしていることを前提としています。
$ sudo mount /dev/sdb2 /mnt
$ sudo cp /boot/vmlinuz /mnt/boot
- インストールメディアで再起動した環境で grub install
grub をインストールするため インストールメディアで再起動します。その後、grub-install と update-grub を行います。
$ sudo mount /dev/sda2 /mnt
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys
$ sudo chroot /mnt
# ls /boot
grub vmlinuz
# grub-install /dev/sda
# update-grub
最小化 Ubuntu で起動
最小化した Ubuntu で起動し、ルートファイルシステムの使用容量を確認します。
Filesystem Size Used Avail Use% Mounted on
/dev/root 987M 330M 591M 36% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 1.6G 100K 1.6G 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 788M 0 788M 0% /run/user/0
上記の通り、約330M Byteとなりました。