Ubuntu 16.04: カスタマイズしたLiveDVDを作成する

ファイルシステムやLVMの再設定をする為のレスキュー用LiveDVDを作成します。

この記事ではlivecd-rootfs、squashfs、grub-mkresucueを利用します。

 

1 LiveDVD作成用パッケージのインストール

以下のパッケージをインストールします。

 

livecd-rootfs Ubuntu向けlive-build設定ファイル
systemd-container chrootとは違い、systemctlを利用できる
xorriso grub-mkrescueで使うiso作成ツール

$ sudo apt install -y livecd-rootfs systemd-container xorriso

2 ルートファイルシステムの作成

livecd-rootfsの設定ファイルを作業ディレクトリへコピーします。ここではubuntu-coreというデスクトップ環境を持たない最小限のプロジェクトを利用します。

$ mkdir live-build
$ cd live-build/
$ cp -a /usr/share/livecd-rootfs/live-build/auto .
$ cp -a /usr/share/livecd-rootfs/live-build/ubuntu-core .

PROJECTを設定してコンフィグファイルを作成します。sedでLB_DISTRIBUTIONを直接編集しています。

$ PROJECT=ubuntu-core lb config
$ sed -i 's/precise/xenial/g' config/bootstrap

chrootディレクトリを作成してビルドします。chrootディレクトリにルートファイルシステムが展開されます。

$ mkdir chroot
$ sudo lb build

この時点でルートファイルシステムは245Mのサイズです。

$ sudo du -sh chroot
245M    chroot

3 ルートファイルシステムのカスタマイズ

chrootとsystemd-nspawnをルートファイルシステムをカスタマイズします。

3.1 sources.listのコピー

ホスト側のsources.listを流用します。

$ sudo cp /etc/apt/sources.list chroot/etc/apt/

3.2 ホスト名の設定

ホスト名を設定します。

$ echo "ubuntu-live" | sudo tee chroot/etc/hostname
$ echo "127.0.0.1 ubuntu-live" | sudo tee chroot/etc/hosts

3.3 rootパスワードの設定

rootのパスワードを作成します。ここではchrootを利用します。

$ sudo chroot chroot
# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
# exit

3.4 systemd-nspawnの起動

systemd-nspawnでルートファイルシステムを使ってコンテナを起動します。先ほど設定したrootのパスワードでログインします。

$ sudo systemd-nspawn -b -D chroot
<snip>
[  OK  ] Started Update UTMP about System Runlevel Changes.

Ubuntu 16.04 LTS localhost.localdomain console

localhost login: root
Password:
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@ubuntu-live:~#

3.5 LiveDVDに必要なパッケージのインストール

apt updateでパッケージリストを更新します。

# apt update -y

live-bootパッケージとlive-boot-initramfs-toolsパッケージをインストールし、カーネルパラメータにboot=liveを指定することでLiveDVDが起動するようになります。同様にboot=casperという仕組みもありますが、こちらはシャットダウン時にCDのイジェクトを実行するようなインストーラ向けのものです。

# apt install -y live-boot live-boot-initramfs-tools

GRUB2とlinuxカーネルをインストールします。これはgrub-mkconfig等のツールを使えるようにするのと、カーネルのモジュールとinitrdを作成する為です。

# apt install -y grub2-common
# apt install -y linux-image-$(uname -r)

英語以外のキーボードの為にkbdパッケージをインストールします。

# apt install -y kbd
# sed -i 's/exit 0/loadkeys jp/g' /etc/rc.local
# echo "exit 0" >> /etc/rc.local

3.6 目的に合わせて必要なパッケージをインストールする

ここではファイルシステムとLVMの再設定に必要なツール群をインストールします。

# apt install -y network-manager openssh-server openssh-client \
byobu emacs less lvm2 e2fsprogs net-tools

すでにホスト側でSSHサーバが動いている場合はopenssh-serverのpostinstスクリプトでエラーが発生しますが、放っておいても問題ありません。

Errors were encountered while processing:
 openssh-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

systemd-nspawnを用いているので、systemctlも利用できます。

$ sudo systemctl enable ssh

3.7 ユーザの追加

hashコマンドでPATHのハッシュを再設定している点に留意してください。

# useradd -m -s /bin/bash hiroom2
# gpasswd -a hiroom2 sudo
Adding user hiroom2 to group sudo
# passwd hiroom2
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
# su - hiroom2
$ hash -r && hash
$ exit

この記事では.sshや.byobu等の設定ファイルも追加しています。

3.8 grub.cfgの作成

grub.cfgを作成します。boot=liveでlive-boot-initramfs-toolsのスクリプトが起動します。シリアルコンソールでもアクセスできるようにします。

# cat <<EOF | tee /boot/grub/grub.cfg
set timeout=1

serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
terminal_input console serial
terminal_output console serial

menuentry 'ubuntu-live' {
  linux /boot/vmlinuz-4.4.0-22-generic boot=live console=tty1 console=ttyS0,115200
  initrd /boot/initrd.img-4.4.0-22-generic
}
EOF

設定が済んだらコンテナをシャットダウンし、ホスト側に操作を戻します。

# poweroff

4 LiveDVD作成

squashfsを作成してLiveDVDを作成します。

4.1 iso用ディレクトリの作成

iso用のディレクトリを作成します。

$ mkdir iso
$ mkdir iso/live

ルートファイルシステムのbootディレクトリ一式をiso用のディレクトリへコピーします。GRUBはこのディレクトリのカーネルとinitrdを読み込みます。

$ sudo cp -a chroot/boot iso/

4.2 squashfsの作成

chrootに展開したルートファイルシステムからsquashfsを作成し、iso用のディレクトリへ格納します。すでにfilesystem.squashfsを作成している場合は必ずfilesystem.squashfsを削除してから実行してください。すでにfilesystem.squashfsが存在する場合は上書きにならず、/etcや/varの他に/etc_1や/var_1等の重複したディレクトリが展開されることになります。

$ sudo mksquashfs chroot iso/live/filesystem.squashfs

4.3 iso作成

GRUB2をインストールしたisoファイルを作成します。

$ sudo grub-mkrescue -o ubuntu-live.iso iso

このubuntu-live.isoを起動することでLiveDVDが起動します。

5 実行結果

VirtualBoxでubuntu-live.isoを起動するとGRUBのメニューが表示されます。

0001_GRUB.png

RAMDISK上に展開されるので、一時的なファイル保存やパッケージの追加も可能です。

0002_Console.png

マウントポイント/にoverlayfsが使われています。

$ cat /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
overlay / overlay rw 0 0
tmpfs /tmp tmpfs nosuid,nodev 0 0

512MB程の書き込みが可能です。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            490M     0  490M   0% /dev
tmpfs           100M  3.4M   96M   4% /run
/dev/sr0        737M  737M     0 100% /lib/live/mount/medium
/dev/loop0      708M  708M     0 100% /lib/live/mount/rootfs/filesystem.squashfs
tmpfs           497M     0  497M   0% /lib/live/mount/overlay
overlay         497M  380K  496M   1% /
tmpfs           497M     0  497M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           497M     0  497M   0% /sys/fs/cgroup
tmpfs           497M     0  497M   0% /tmp
tmpfs           100M     0  100M   0% /run/user/1000