Smallest Ubuntu Build

ubuntu

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となりました。