Small Ubuntu Installation

ubuntu

mmdebstrap を使った小さな Ubuntu 22.04 インストール方法

mmdebstrap を使ったUbuntuインストールする方法を記載します。実際はインストールメディア(DVD/USB)が必要となるため、作業の時には手元に用意する必要があります。

環境

以下を必要とします。

  • Ubuntu 22.04 インストールメディア
  • インストール対象の外付けストレージ(インストール終了時に 2GByte 程度消費します)
  • インターネット環境(mmdebstrapでネットワーク越しにダウンロードするため)
  • インストール済み Ubuntu 22.04 本体(mmdebstrapを実行する環境です)

パーティション作成 (インストール済み Ubuntu でコマンド実行①)

手順中では基本的に sudo を使用します。sudo のパスワード入力については省略して書いています。

  • パーティションを作成する

parted を使って外付けストレージのパーティションを作成します。1番目のパーティションはgrub用、2番目のパーティションをルートファイルシステムとします。

$ sudo parted /dev/sdb print
Error: /dev/sdb: unrecognised disk label
Model: ATA SSD (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

$ sudo parted /dev/sdb mklabel gpt
Information: You may need to update /etc/fstab.

$ sudo parted /dev/sdb print
Model: ATA SSD  (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start  End  Size  File system  Name  Flags

$ sudo parted /dev/sdb mkpart boot 1 2
Information: You may need to update /etc/fstab.

$ sudo parted /dev/sdb mkpart root 2 100%
Information: You may need to update /etc/fstab.

$ sudo parted /dev/sdb print
Model: ATA SSD  (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB               boot
 2      2097kB  5368MB  5366MB               boot

$ sudo parted /dev/sdb set 1 bios_grub on
Information: You may need to update /etc/fstab.

$ sudo parted /dev/sdb print
Model: ATA SSD (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB               boot  bios_grub
 2      2097kB  5368MB  5366MB               boot
  • 外付けストレージのフォーマットとマウント

ルートファイルシステムを ext4 でフォーマットした後で /mnt へ mount します。

$ sudo mkfs -t ext4 /dev/sdb2
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1309952 4k blocks and 327680 inodes
Filesystem UUID: e45cf270-b938-4b1e-a39b-b812b38a6583
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

$ sudo mount /dev/sdb2 /mnt

mmdebstrap 実行(インストール済み Ubuntu でコマンド実行②)

mmdebstrap を実行します。mmdebstrap のパラメータについては別の機会に紹介しますが、variant=minbase, include=apt として、後から apt が実行できる最小構成としています。

もし mmdebstrap がインストールされていない場合は apt install mmdebstrap を実行してインストールしてください。

$ sudo mmdebstrap --variant=minbase \
--dpkgopt='path-exclude=/usr/share/man/*' \
--dpkgopt='path-exclude=/usr/share/locale/*/LC_MESSAGES/*.mo' \
--dpkgopt='path-exclude=/usr/share/doc/*' \
--include=apt jammy /mnt

上記を実行するとダウンロードとパッケージの展開を開始し、最終的に以下のログを表示していたら成功です。

I: automatically chosen mode: root
I: chroot architecture amd64 is equal to the host's architecture
I: automatically chosen format: directory
I: running apt-get update...
done
I: downloading packages with apt...
done
done
I: extracting archives...
done
I: installing essential packages...
done
I: installing remaining packages inside the chroot...
done
done
I: cleaning package lists and apt cache...
done
done
I: success in 80.0744 seconds

細かな設定(インストール済み Ubuntu でコマンド実行③)

mmdebstrapだけでは起動すらできません。これから chroot で最初にログインできるまでの設定を行います。

  • 設定準備

最初に chroot の前準備と chroot を行います。

$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /sys /mnt/sys
$ sudo chroot /mnt
root@UbuntuText:/#

chroot の前の mount –bind から始まるコマンドは chroot 後にもデバイスが正常に動作できるようにするために行います。それを以下のコマンドで確認します。

root@UbuntuTest:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       4.9G   82M  4.5G   2% /

df の実行結果が正常に表示されていれば正常に動作しています。もし何も表示されていないなどの状態であれば、chroot 前の実行結果を確認してください。

  • root パスワード

rootパスワードを設定します。練習用なのでパスワードも root としました。実運用の時はランダムな文字列を設定してください。

root@UbuntuTest:/# passwd
New password:
Retype new password:
passwd: password updated successfully
  • linux カーネルイメージのインストール

これから apt を使ってカーネルイメージのダウンロードと展開を行います。最初に apt を更新します。そしてその apt でカーネルイメージをインストールします。

root@UbuntuTest:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Get:3 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [1192 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages [1395 kB]
Get:6 http://security.ubuntu.com/ubuntu jammy-security/main Translation-en [217 kB]
Get:7 http://archive.ubuntu.com/ubuntu jammy/main Translation-en [510 kB]
Get:8 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1412 kB]
Get:9 http://archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [277 kB]
Fetched 5503 kB in 3s (1635 kB/s)
Reading package lists... Done

root@UbuntuTest:/# apt-get install linux-image-generic
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  amd64-microcode busybox-initramfs cpio dbus dmsetup gettext-base
  gir1.2-glib-2.0 grub-common grub-gfxpayload-lists grub-pc grub-pc-bin
  grub2-common initramfs-tools initramfs-tools-bin initramfs-tools-core
  intel-microcode iucode-tool klibc-utils kmod libapparmor1 libargon2-1
  libbrotli1 libcryptsetup12 libdbus-1-3 libdbus-glib-1-2 libdevmapper1.02.1
  libefiboot1 libefivar1 libevdev2 libexpat1 libfreetype6 libfuse3-3
  libgirepository-1.0-1 libglib2.0-0 libglib2.0-data libgudev-1.0-0 libicu70
  libimobiledevice6 libip4tc2 libjson-c5 libklibc libkmod2 libmpdec3
  libnss-systemd libpam-systemd libplist3 libpng16-16 libpolkit-agent-1-0
  libpolkit-gobject-1-0 libpython3-stdlib libpython3.10-minimal
  libpython3.10-stdlib libreadline8 libsqlite3-0 libupower-glib3 libusb-1.0-0
  libusbmuxd6 libxml2 linux-base linux-firmware linux-image-5.15.0-97-generic
  linux-modules-5.15.0-97-generic linux-modules-extra-5.15.0-97-generic
  media-types networkd-dispatcher os-prober pkexec policykit-1 polkitd python3
  python3-dbus python3-gi python3-minimal python3.10 python3.10-minimal
  readline-common shared-mime-info systemd systemd-hwe-hwdb systemd-sysv
  systemd-timesyncd thermald ucf udev upower usbmuxd wireless-regdb
  xdg-user-dirs zstd
Suggested packages:
  libarchive1 default-dbus-session-bus | dbus-session-bus multiboot-doc
  grub-emu mtools xorriso desktop-base console-setup bash-completion fuse3
  libusbmuxd-tools fdutils linux-doc | linux-source-5.15.0 linux-tools
  linux-headers-5.15.0-97-generic iw | wireless-tools python3-doc python3-tk
  python3-venv python-dbus-doc python3.10-venv python3.10-doc binutils
  binfmt-support readline-doc systemd-container libfido2-1
  libtss2-esys-3.0.2-0 libtss2-mu0 libtss2-rc0
Recommended packages:
  firmware-sof-signed
The following NEW packages will be installed:
  amd64-microcode busybox-initramfs cpio dbus dmsetup gettext-base
  gir1.2-glib-2.0 grub-common grub-gfxpayload-lists grub-pc grub-pc-bin
  grub2-common initramfs-tools initramfs-tools-bin initramfs-tools-core
  intel-microcode iucode-tool klibc-utils kmod libapparmor1 libargon2-1
  libbrotli1 libcryptsetup12 libdbus-1-3 libdbus-glib-1-2 libdevmapper1.02.1
  libefiboot1 libefivar1 libevdev2 libexpat1 libfreetype6 libfuse3-3
  libgirepository-1.0-1 libglib2.0-0 libglib2.0-data libgudev-1.0-0 libicu70
  libimobiledevice6 libip4tc2 libjson-c5 libklibc libkmod2 libmpdec3
  libnss-systemd libpam-systemd libplist3 libpng16-16 libpolkit-agent-1-0
  libpolkit-gobject-1-0 libpython3-stdlib libpython3.10-minimal
  libpython3.10-stdlib libreadline8 libsqlite3-0 libupower-glib3 libusb-1.0-0
  libusbmuxd6 libxml2 linux-base linux-firmware linux-image-5.15.0-97-generic
  linux-image-generic linux-modules-5.15.0-97-generic
  linux-modules-extra-5.15.0-97-generic media-types networkd-dispatcher
  os-prober pkexec policykit-1 polkitd python3 python3-dbus python3-gi
  python3-minimal python3.10 python3.10-minimal readline-common
  shared-mime-info systemd systemd-hwe-hwdb systemd-sysv systemd-timesyncd
  thermald ucf udev upower usbmuxd wireless-regdb xdg-user-dirs zstd
0 upgraded, 90 newly installed, 0 to remove and 0 not upgraded.
Need to get 405 MB of archives.
After this operation, 1685 MB of additional disk space will be used.
Do you want to continue? [Y/n]

apt-get linux-image-generic を実行するとストレージが 1685 MB を消費すると書いています。この中では実際に使われないパッケージもあると思いますが、ここでは [Y/n] の Y を選んで全てインストールしてしまいます。

最終的には以下のようなログが表示されています。

Creating config file /etc/default/grub with new version
Setting up grub-gfxpayload-lists (0.7) ...
Setting up linux-image-5.15.0-97-generic (5.15.0-97.107) ...
I: /boot/vmlinuz.old is now a symlink to vmlinuz-5.15.0-97-generic
I: /boot/initrd.img.old is now a symlink to initrd.img-5.15.0-97-generic
I: /boot/vmlinuz is now a symlink to vmlinuz-5.15.0-97-generic
I: /boot/initrd.img is now a symlink to initrd.img-5.15.0-97-generic
Setting up linux-modules-extra-5.15.0-97-generic (5.15.0-97.107) ...
Setting up linux-image-generic (5.15.0.97.92) ...
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
Processing triggers for initramfs-tools (0.140ubuntu13.4) ...
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
Processing triggers for linux-image-5.15.0-97-generic (5.15.0-97.107) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-5.15.0-97-generic
root@UbuntuTest:/#

更に正しくインストールされたかを確認します。

root@UbuntuTest:/# ls /boot
System.map-5.15.0-97-generic  initrd.img.old
config-5.15.0-97-generic      vmlinuz
grub                          vmlinuz-5.15.0-97-generic
initrd.img                    vmlinuz.old
initrd.img-5.15.0-97-generic
  • ネットワーク設定パッケージのインストール

ネットワーク設定 netplan をインストールします。これがないとネットワークを動作させることができないため、インストールが必須となります。

root@UbuntuTest:/# apt-get install netplan.io
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  iproute2 libatm1 libbpf0 libbsd0 libcap2-bin libelf1 libmd0 libmnl0
  libnetplan0 libpam-cap libxtables12 libyaml-0-2 python3-netifaces
  python3-yaml
Suggested packages:
  iproute2-doc network-manager | wpasupplicant openvswitch-switch python3-rich
  iw
The following NEW packages will be installed:
  iproute2 libatm1 libbpf0 libbsd0 libcap2-bin libelf1 libmd0 libmnl0
  libnetplan0 libpam-cap libxtables12 libyaml-0-2 netplan.io python3-netifaces
  python3-yaml
0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded.
Need to get 1844 kB of archives.
After this operation, 5731 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y

このパッケージをインストールするときに依存パッケージも同時にインストールします。
最終的には以下のようなログを表示しています。

Setting up iproute2 (5.15.0-1ubuntu2) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.34.0 /usr/local/share/perl/5.34.0 /usr/lib/x86_64-linux-gnu/perl5/5.34 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.34 /usr/share/perl/5.34 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up netplan.io (0.106.1-7ubuntu0.22.04.2) ...
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
root@UbuntuTest:/#
  • ルートファイルシステムを戻す

これから fstab と ネットワークの設定ファイルを編集します。mmdebstrapで作成したルートファイルシステムにはフルスクリーンエディタがインストールされていないため、ここから chroot を exit して元のルートファイルシステムで作業します。

root@UbuntuTest:/# exit
exit
  • fstab の設定

fstab を編集しますがインストール先ストレージの uuid が必要となりますので fstab 編集前に blkid というコマンドで調べておきます。

$ sudo blkid /dev/sdb
/dev/sdb: PTUUID="a7869359-353e-4675-9d4a-4faaf754fd9d" PTTYPE="gpt"

ここのPTUUID=”a7869359-353e-4675-9d4a-4faaf754fd9d” をメモしておきます。

次に /mnt/etc/fstab をフルスクリーンエディタで開いて以下の内容に編集します。以下の内容で実際に必要なのは # が付かない最終行だけですが、コメントとして残しておきます。

$ sudo vi /mnt/etc/fstab

# (fstabを以下の内容に編集します)
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/a7869359-353e-4675-9d4a-4faaf754fd9d / ext4 defaults 0 1

ここで blkid で調べた uuid は  /dev/disk/by-uuid/ から始まる文字列で使用します。

  • ネットワークの設定

次に netplan を使用したネットワーク設定ファイルを編集します。ここでのネットワークは dhcp を使用することを前提とします。ここでも # はコメント行となります。

$ sudo vi /mnt/etc/netplan/99_config.yaml

# (99_config.yaml を以下の内容に編集します)
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      dhcp4: true
  version: 2

grub インストール (インストールメディアの 「Try」 でコマンド実行)

次は grub のインストールですが、その作業はインストールメディアの Try Ubuntu で行います。この理由は grub 更新時に /boot/grub/grub.cfg が生成されるのですが、そのファイル編集を省略して簡素化させるためです。

今まで作業していた 「インストール済みUbuntu」を一度シャットダウンして、インストール対象だった外付けストレージを一度 /dev/sda として認識できるように SATA のケーブルを接続しなおします。その後、インストールメディア(ここではDesktop用のUbuntu)で起動し、Try Ubuntu のターミナルから以下のようにコマンドを実行します。

$ sudo mount /dev/sda /mnt
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /sys /mnt/sys
$ sudo mount --bind /proc /mnt/proc
$ sudo chroot /mnt
root@ubuntu: /#

ここまでのコマンドラインは上記で一度説明していますので、そちらを参照してください。

root@ubuntu: /# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

grub-install /dev/sda で1番目のパーティションに grub(実行イメージ)をインストールします。もともと1番目のパーティションはフォーマットしていませんでしたが、そのまま grub のイメージを grub-install で書き込みます。また、よく間違えそうな操作として grub-install /dev/sda1 とは打ち込まず、sda を指定するだけで grub-install が適切なパーティションにインストールしてくれます。

root@ubuntu: /# update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.15.0-97-generic
Found initrd image: /boot/initrd.img-5.15.0-97-generic
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
done
root@ubuntu: /#

update-grub を実行して起動時に grub が動作するようにします。この結果として、/boot/grub/grub.cfgが生成されていることを確認します。

root@ubuntu: /# ls /boot/grub/grub.cfg
/boot/grub/grub.cfg

インストールした小さな Ubuntu を起動する

インストールメディアのUbuntuをシャットダウン後、メディアを取り外します。
その後、起動するとインストールした小さな Ubuntu が表示されます。