Ubuntu

Ubuntu20.04 Live CDを作ってみる 詳細編

基本編と称して書いた記事を実行してみたところ、できあがったISOは2.6GB程になった。

基本的な機能に絞った環境を作り、そこに、好みのアプリを追加したり、細かな設定を入れたりしてみたいと考えた。
サイズが小さくなると、オンメモリで動かすときにロード時間が早くなるから。



広告


今回も、こちらで教えてくれていることをベースとして手順を整理する。
Github / How to create a custom Ubuntu live from scratch

物凄く長い記事になってしまったが、「基礎部分を作る」~「細かな設定」くらいまでを見れば、思い通りのものを作ることができる。
「no-install-recommendsしすぎて起きたことメモ」以降は、何か困ったことが起きたときに役に立つかも知れない程度。

当サイトでは、通常コマンド行の先頭を#と$で書き分けたりしているのだが、コピペするコマンドがとにかく多いので、

ベースとなる環境で、一般ユーザーとして入力するコマンド
chrootした環境で、rootとして入力するコマンド

と、文字色・背景色で書き分ける程度にして、ターミナルにべたっと貼り付ければ動くようにしておく。

基礎部分を作る

ブラウザが起動できるだけのLive環境を作る。

編集環境の作り込み

Live環境を構築するのに必要なパッケージをインストール。前回の記事でインストール済み。
これからはじめるときはインストールしておく。

sudo apt install binutils debootstrap squashfs-tools xorriso grub-pc-bin grub-efi-amd64-bin mtools syslinux-common isolinux

debootstrapで最小構成を展開。ダウンロード先として早いものを選択する。

mkdir $HOME/live-ubuntu-from-scratch
sudo debootstrap --arch=amd64 --variant=minbase focal $HOME/live-ubuntu-from-scratch/chroot http://ja.archive.ubuntu.com/ubuntu/

あるいは…
mkdir $HOME/live-ubuntu-from-scratch
sudo debootstrap --arch=amd64 --variant=minbase focal $HOME/live-ubuntu-from-scratch/chroot http://ftp.riken.go.jp/Linux/ubuntu/

ミラーサーバーを立てたなら…
mkdir $HOME/live-ubuntu-from-scratch
sudo debootstrap --arch=amd64 --variant=minbase focal $HOME/live-ubuntu-from-scratch/chroot http://mirror.hogeserver.hogeddns.jp/ubuntu/

作業開始時の初期設定。

sudo mount --bind /dev $HOME/live-ubuntu-from-scratch/chroot/dev
sudo mount --bind /run $HOME/live-ubuntu-from-scratch/chroot/run
sudo mount --bind /proc $HOME/live-ubuntu-from-scratch/chroot/proc
sudo mount --bind /sys $HOME/live-ubuntu-from-scratch/chroot/sys
sudo mount --bind /dev/pts $HOME/live-ubuntu-from-scratch/chroot/dev/pts
sudo chroot $HOME/live-ubuntu-from-scratch/chroot
export HOME=/root
export LC_ALL=C

chroot環境のホスト名を設定。

echo "ubuntu-fs-live" > /etc/hostname

aptのsource.listを作成。ローカルミラーを使う場合は、リリース前に修正すること。

cat <<EOF > /etc/apt/sources.list
deb http://ja.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb-src http://ja.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://ja.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://ja.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb http://ja.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://ja.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
EOF

あるいは…
cat <<EOF > /etc/apt/sources.list
deb http://ftp.riken.go.jp/Linux/ubuntu/ focal main restricted universe multiverse
deb-src http://ftp.riken.go.jp/Linux/ubuntu/ focal main restricted universe multiverse
deb http://ftp.riken.go.jp/Linux/ubuntu/ focal-security main restricted universe multiverse
deb-src http://ftp.riken.go.jp/Linux/ubuntu/ focal-security main restricted universe multiverse
deb http://ftp.riken.go.jp/Linux/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://ftp.riken.go.jp/Linux/ubuntu/ focal-updates main restricted universe multiverse
EOF

ミラーサーバーを立てたなら、リリースするまでの試行錯誤は…
cat <<EOF > /etc/apt/sources.list
deb http://mirror.hogeserver.hogeddns.jp/ubuntu/ focal main restricted universe multiverse
deb http://mirror.hogeserver.hogeddns.jp/ubuntu/ focal-security main restricted universe multiverse
deb http://mirror.hogeserver.hogeddns.jp/ubuntu/ focal-updates main restricted universe multiverse
EOF

等々。

updateする。

apt update

必要パッケージのインストール。

apt install --no-install-recommends systemd-sysv

machine-idを構成。また、dpkgインストール先の待避。

dbus-uuidgen > /etc/machine-id
mkdir /var/lib/dbus
ln -fs /etc/machine-id /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

[2回目以降のみ]/etc/resolv.confはシンボリックリンクになっているが上手く働かない。
ならばということで、最初から、ホストのsystemd-resolvdに乗っかる(最後に作り直すので、編集中はこれで問題なし)。

rm /etc/resolv.conf
cat <<EOF > /etc/resolv.conf
nameserver 127.0.0.53
EOF

事前の準備が済んだので、パッケージを更新。

apt upgrade

Liveの中身を編集

Liveシステムに必要なパッケージをインストールする。※結構時間が掛かる。

apt install --no-install-recommends \
sudo \
ubuntu-standard \
casper \
lupin-casper \
discover \
laptop-detect \
os-prober \
network-manager \
resolvconf \
net-tools \
wireless-tools \
wpagui \
locales \
grub-common \
grub-gfxpayload-lists \
grub-pc \
grub-pc-bin \
grub2-common

言語選択やロケールの設定を数値入力でする場合には必要ないが、選択式にしたい場合はCUI用のウィンドウライブラリをインストールする。

apt install whiptail

カーネルのインストール。どちらか一方をインストールすれば良く、比較的新しいハードウェアで使うなら、5.13が良いだろう。

apt install --no-install-recommends linux-generic           ← カーネル5.4
apt install --no-install-recommends linux-generic-hwe-20.04 ← カーネル5.13

The Ubuntu LTS enablement( also called HWE or Hardware Enablement) stacksは、既存のUbuntu LTSリリースに新しいカーネルとXのサポートを提供します

ウィンドウマネージャーのインストール。※結構時間が掛かる。
一旦、gnome-sessionと関係パッケージをインストールしておいた方が、各種デバイスをちゃんとコントロールするのにいい。実際、Miix 2 8で音が鳴らない問題は、この方法で回避できる。

apt install gnome-session

確認表示があったら…
Country of origin for the keyboard: 55 ← Japanese
Keyboard layout: 1 ← Japanese


その後に、ubuntu-gnome-sessionをインストールする。※結構時間が掛かる。
こちらはRecommendsをインストールしないので、FirefoxやLibreOffice、上海なんかもない、最低限っぽいインストールになる。
plymouthはspinnerに変更している。

apt install --no-install-recommends \
plymouth-theme-spinner \
ubuntu-gnome-desktop \
ubuntu-gnome-wallpapers \
yaru-theme-icon \
yaru-theme-gtk \
yaru-theme-sound \
network-manager-gnome \
libcanberra-pulse \
gvfs-backends

あわせて、こんなパッケージを一緒にインストールしてもいいかも。
apt install --no-install-recommends \
gnome-power-manager \
gnome-system-monitor \
pulseaudio-module-bluetooth

よく使うアプリケーションのインストール。–no-install-recommendsを入れていることでインストールされないip、pingコマンド、ufw、kbd、bashのコマンド補完機能を追加。

apt install --no-install-recommends \
apt-transport-https \
vim \
less \
iproute2 \
inetutils-ping \
ufw \
kbd \
bash-completion

確認表示があったら…
Character set to support: 23 ← Guess optimal character set

ファイアウォールを有効にする。

sed -i -E 's/^(ENABLED=).+$/\1yes/' /etc/ufw/ufw.conf

Microsoft Edgeのインストール。やり方が分かったのでメモとして書いている。前回の通り、Chromeをインストールしても良いと思う
TECH+ / LinuxにMicrosoft Edgeをインストールする方法

wget -q -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge/ stable main" > /etc/apt/sources.list.d/microsoft-edge.list
rm microsoft.gpg
apt update
apt install microsoft-edge-stable

タイムゾーンを設定する。

dpkg-reconfigure tzdata

確認表示があったら…
Geographic area: 6 ← Asia
Time zone: 79 ← Tokyo

システム時間をローカル時間扱いにする。
多くの場合、Windowsを動かしているPCでLive CDを起動するのだろうから、時間の扱いを同じにしておいた方が良いだろう。
timedatectlコマンドを使いたいところだが、それを使っても本体側の設定が変わるだけなので、設定結果を手作りする。

cat <<EOF > /etc/adjtime
0.0.0.0
0
LOCAL
EOF

Mozcと言語サポートをインストール。

apt install --no-install-recommends ibus-mozc gkbd-capplet `check-language-support -l ja`

言語サポートのうち、この環境には必要のないfcitxを削除する。

apt purge fcitx-data

ロケールの設定。デフォルトロケールとして2つ目のja_JP.UTF-8を選択している。

dpkg-reconfigure locales

確認表示があったら…
Locales to be generated: 157 159 287 ← en_US ISO-8859-1, en_US.UTF-8 UTF-8, ja_JP.UTF-8.UTF-8
Default locale for the system environment: 6 ← ja_JP.UTF-8

最終的に使わなくなったパッケージを削除。

apt autoremove

リゾルバの設定。

rm /etc/resolv.conf
dpkg-reconfigure resolvconf

確認表示があったら…
Prepare /etc/resolv.conf for dynamic updates? [yes/no] yes

NetworkManagerの設定編集。

/etc/NetworkManager/NetworkManager.conf

[main]
rc-manager=resolvconf
plugins=ifupdown,keyfile
dns=dnsmasq

[ifupdown]
managed=false

[device]
wifi.scan-rand-mac-address=no

設定変更を反映。

dpkg-reconfigure network-manager

※NetPlanは入っていないな…。

編集環境の後始末

machie-idを削除、dpkgインストール先の待避を解除。

truncate -s 0 /etc/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
apt clean
rm -rf /tmp/*
export HISTSIZE=0
exit
sudo rm $HOME/live-ubuntu-from-scratch/chroot/root/.bash_history

マウントポイントの解除。

sudo umount $HOME/live-ubuntu-from-scratch/chroot/dev/pts
sudo umount $HOME/live-ubuntu-from-scratch/chroot/sys
sudo umount $HOME/live-ubuntu-from-scratch/chroot/proc
sudo umount $HOME/live-ubuntu-from-scratch/chroot/run
sudo umount $HOME/live-ubuntu-from-scratch/chroot/dev

Live CDに収録するファイルを集める

CDイメージのディレクトリimage、およびサブディレクトリを作り、ブートイメージと初期RAMディスクをコピーする。

cd $HOME/live-ubuntu-from-scratch
mkdir -p image/{casper,isolinux,install}
sudo cp chroot/boot/vmlinuz-**-**-generic image/casper/vmlinuz
sudo cp chroot/boot/initrd.img-**-**-generic image/casper/initrd

マニフェスト(インストールされているパッケージとバージョンの一覧)を作成する。

cd $HOME/live-ubuntu-from-scratch
sudo chroot chroot dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee image/casper/filesystem.manifest > /dev/null
sudo cp image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
sudo sed -i '/ubiquity/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/casper/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/discover/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/laptop-detect/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/os-prober/d' image/casper/filesystem.manifest-desktop

chrootで作成した環境を圧縮し、squashfsファイルを作成する。※これには時間が掛かる。

cd $HOME/live-ubuntu-from-scratch
sudo mksquashfs chroot image/casper/filesystem.squashfs
printf $(sudo du -sx --block-size=1 chroot | cut -f1) > image/casper/filesystem.size

※ファイルが存在すると mksquashfs が失敗するので、2回目以降は実行前に削除しておく。

インストーラーによくあるREADMEファイルを作成。

cat <<EOF > image/README.diskdefines
#define DISKNAME  Ubuntu from scratch
#define TYPE  binary
#define TYPEbinary  1
#define ARCH  amd64
#define ARCHamd64  1
#define DISKNUM  1
#define DISKNUM1  1
#define TOTALNUM  0
#define TOTALNUM0  1
EOF

ブートローダーを準備

UEFI(Grub)

32MBの空ファイルを作り、それをVFATでフォーマットしてからマウントし、そこにGrubをインストールする。

cd $HOME/live-ubuntu-from-scratch
mkdir -p work/bi
cd work

dd if=/dev/zero of=bi.img bs=1M count=32
sudo mkfs.vfat bi.img
sudo mount bi.img bi/

sudo grub-install --target x86_64-efi --efi-directory bi/ --boot-directory=bi/boot/ --removable --uefi-secure-boot
Installing for x86_64-efi platform.
Installation finished. No error reported.

[オプション]Ubuntuは32ビットのブートローダーを提供していない(サポート対象外)。
Debianはサポートしているので、そこからファイルをいただいて盛り込んでいく。
https://packages.debian.org/stable/admin/grub-efi-ia32-signed
https://packages.debian.org/bullseye/shim-signed
https://packages.debian.org/stable/admin/grub-efi-ia32-bin

ダウンロードしてくるファイルはリンクをたどって探すのが良いと思う。
この日は、このファイル名だった。
wget http://ftp.jp.debian.org/debian/pool/main/s/shim-signed/shim-signed_1.38+15.4-7_i386.deb
wget http://ftp.jp.debian.org/debian/pool/main/g/grub-efi-ia32-signed/grub-efi-ia32-signed_1+2.04+20_i386.deb
wget http://ftp.jp.debian.org/debian/pool/main/g/grub2/grub-efi-ia32-bin_2.04-20_i386.deb

mkdir bi32

dpkg-deb -x shim-signed_1.38+15.4-7_i386.deb bi32/
sudo cp --preserve=mode,timestamp bi32/usr/lib/shim/shimia32.efi.signed bi/EFI/BOOT/BOOTIA32.efi

dpkg-deb -x grub-efi-ia32-signed_1+2.04+20_i386.deb bi32/
sudo cp --preserve=mode,timestamps bi32/usr/lib/grub/i386-efi-signed/grubia32.efi.signed bi/EFI/BOOT/GRUBIA32.EFI

dpkg-deb -x grub-efi-ia32-bin_2.04-20_i386.deb bi32/
sudo cp --preserve=mode,timestamp -r bi32/usr/lib/grub/i386-efi bi/boot/grub/
sudo rm -r bi/boot/grub/i386-efi/monolithic/

※grub-efi-ia32-binに含まれていたmonolithic配下のefiのファイルは、署名されているファイルとmd5sum値が違っていたので消している。

できあがったEFI起動イメージをimageにコピーして、作業用ファイルをアンマウント。

sudo cp -ar bi/boot/ ../image/
sudo cp -ar bi/EFI/ ../image/
sudo umount bi
sudo chown 1000:1000 -R ../image/boot/ ../image/EFI/

64ビットのブートローダーは/efi/boot/grub.cfgを見に行くので、この先で作るgrub.cfgを見に行くように仕掛けておく。

$HOME/live-ubuntu-from-scratch/image/EFI/BOOT/grub.cfg

#search.fs_uuid XXXX-XXXX root ←この行はいらないので削除
search --set=root --file /.disk/info
set prefix=(\$root)'/boot/grub'
configfile \$prefix/grub.cfg

[オプション]32ビットのブートローダーは/efi/debian/grub.cfgを見に行くので、この先で作るgrub.cfgを見に行くように仕掛けておく。

cd $HOME/live-ubuntu-from-scratch/image
mkdir EFI/DEBIAN
cat << EOF > EFI/DEBIAN/grub.cfg
search --set=root --file /.disk/info
set prefix=(\$root)'/boot/grub'
configfile \$prefix/grub.cfg
EOF

ISOを作成するときに、起動イメージとして渡すefi.imgファイルを作成する。
[オプション]32ビットのブートローダーを利用する場合は、黄色の行を加える。

cd $HOME/live-ubuntu-from-scratch/image

通常
(
   dd if=/dev/zero of=efi.img bs=1M count=10 && \
   sudo mkfs.vfat efi.img && \
   LC_CTYPE=C mmd -i efi.img efi efi/boot boot boot/grub && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/grub.cfg ::boot/grub/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/BOOTX64.EFI ::efi/boot/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/grubx64.efi ::efi/boot/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/mmx64.efi ::efi/boot/ && \
   mv efi.img ./boot/grub/
)

32ビットのブートローダーをサポート
(
   dd if=/dev/zero of=efi.img bs=1M count=10 && \
   sudo mkfs.vfat efi.img && \
   LC_CTYPE=C mmd -i efi.img efi efi/boot efi/debian boot boot/grub && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/DEBIAN/grub.cfg ::efi/debian/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/BOOTIA32.efi ::efi/boot/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/GRUBIA32.EFI ::efi/boot/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/grub.cfg ::boot/grub/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/BOOTX64.EFI ::efi/boot/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/grubx64.efi ::efi/boot/ && \
   LC_CTYPE=C mcopy -i efi.img ./EFI/BOOT/mmx64.efi ::efi/boot/ && \
   mv efi.img ./boot/grub/
)

Legacy(Grub)

Legacyで使うGrubイメージ、core.imgを生成。

cd $HOME/live-ubuntu-from-scratch/image
grub-mkstandalone \
--format=i386-pc \
--output=isolinux/core.img \
--install-modules="linux16 linux normal iso9660 biosdisk memdisk search configfile tar ls" \
--modules="linux16 linux normal iso9660 biosdisk search configfile" \
--locales="" \
--fonts="" \
"/boot/grub/grub.cfg=EFI/BOOT/grub.cfg"

※もしかしたら、cp -ar /usr/lib/grub/i386-pc/ boot/grub/ といったコピーが必要かもしれないが、ウチではなくても問題なかった。

CDブート用のcdboot.imgとcore.imgを結合して、boot.imgを作成。そして、boot.imgができたので、core.imgを削除。

cat /usr/lib/grub/i386-pc/cdboot.img isolinux/core.img > boot/grub/boot.img
rm isolinux/core.img

Grub Menu

Grubの設定ファイルを作成。

cat << EOF > boot/grub/grub.cfg
search --set=root --file /.disk/info

if loadfont /boot/grub/fonts/unicode.pf2 ; then
    set gfxmode=auto
    insmod efi_gop
    insmod efi_uga
    insmod gfxterm
    terminal_output gfxterm
else
    insmod all_video
fi

set default="0"
set timeout=30

menuentry "Try Ubuntu FS toram" {
   linux /casper/vmlinuz boot=casper nopersistent toram quiet splash ---
   initrd /casper/initrd
}

menuentry "Try Ubuntu FS" {
   linux /casper/vmlinuz boot=casper nopersistent quiet splash ---
   initrd /casper/initrd
}

menuentry "Check disc for defects" {
   linux /casper/vmlinuz boot=casper integrity-check quiet splash ---
   initrd /casper/initrd
}
EOF

併せて、EFIの場合にGrubのメニューが呼び出されるように、/.disk/infoというファイルを作っておく。

mkdir .disk
echo "Ubuntu 20.04 from scratch" > .disk/info

Legacy(ISOLINUX)

Grubで起動する環境を構築しているが、起動時に何らかの理由でISOLINUXのファイルを読みに行くかもしれないので、その場合でも起動ができるようにファイルを用意しておく。

cat <<EOF> isolinux/isolinux.cfg
UI vesamenu.c32

MENU TITLE Boot Menu
DEFAULT linux
TIMEOUT 300
MENU RESOLUTION 640 480
MENU COLOR border       30;44   #40ffffff #a0000000 std
MENU COLOR title        1;36;44 #9033ccff #a0000000 std
MENU COLOR sel          7;37;40 #e0ffffff #20ffffff all
MENU COLOR unsel        37;44   #50ffffff #a0000000 std
MENU COLOR help         37;40   #c0ffffff #a0000000 std
MENU COLOR timeout_msg  37;40   #80ffffff #00000000 std
MENU COLOR timeout      1;37;40 #c0ffffff #00000000 std
MENU COLOR msg07        37;40   #90ffffff #a0000000 std
MENU COLOR tabmsg       31;40   #30ffffff #00000000 std

LABEL linux
 MENU LABEL Try Ubuntu FS toram
 MENU DEFAULT
 KERNEL /casper/vmlinuz
 APPEND initrd=/casper/initrd boot=casper nopersistent toram quiet splash ---

LABEL linux
 MENU LABEL Try Ubuntu FS
 MENU DEFAULT
 KERNEL /casper/vmlinuz
 APPEND initrd=/casper/initrd boot=casper nopersistent quiet splash ---

LABEL linux
 MENU LABEL Check disc for defects
 MENU DEFAULT
 KERNEL /casper/vmlinuz
 APPEND initrd=/casper/initrd boot=casper integrity-check quiet splash ---
EOF

搭載RAMが2GBのMiix 2 8では、toram指定をしてOSを読み込むとデスクトップが表示できない問題が発生する。
ギリギリRAMの中に収まるからメモリにロードしてしまい、その後にメモリ不足で動作できないようだった。
そのため、toram指定を外した選択肢を用意している。

必要モジュールをisolinuxディレクトリにコピー。

cp -a /usr/lib/ISOLINUX/isolinux.bin isolinux/
cp -a /usr/lib/syslinux/modules/bios/* isolinux/

ISOイメージの作成

md5sum.txtファイルの作成。起動時のファイルチェックでエラーが発生するため、4つのファイルを外してある。

cd $HOME/live-ubuntu-from-scratch/image
sudo /bin/bash -c "(find . -type f -print0 | xargs -0 md5sum | grep -v -e 'md5sum.txt' -e 'boot.img' -e 'efi.img' -e 'isolinux.bin' > md5sum.txt)"

ISOイメージを作成。

sudo xorriso \
   -as mkisofs \
   -iso-level 3 \
   -full-iso9660-filenames \
   -volid "UBUNTU_FROM_SCRATCH" \
   -output ../ubuntu-from-scratch.iso \
   -isohybrid-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
   --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
   --grub2-boot-info \
   -b boot/grub/boot.img \
      -no-emul-boot \
      -boot-load-size 4 \
      -boot-info-table \
      --eltorito-catalog boot/grub/boot.cat \
   -append_partition 2 0xef boot/grub/efi.img \
   -eltorito-alt-boot \
      -e boot/grub/efi.img \
      -no-emul-boot \
      -isohybrid-gpt-basdat \
   ./

LegacyでISOLINUXを利用する場合はこちら。

sudo xorriso \
   -as mkisofs \
   -iso-level 3 \
   -full-iso9660-filenames \
   -volid "UBUNTU_FROM_SCRATCH" \
   -output ../ubuntu-from-scratch.iso \
   -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
   -b isolinux/isolinux.bin \
      -no-emul-boot \
      -boot-load-size 4 \
      -boot-info-table \
      --eltorito-catalog isolinux/isolinux.cat \
      --grub2-boot-info \
   -append_partition 2 0xef boot/grub/efi.img \
   -eltorito-alt-boot \
      -e boot/grub/efi.img \
      -no-emul-boot \
      -isohybrid-gpt-basdat \
   ./

Ubuntu 20.04のLive CDにはisolinuxディレクトリがあって何かが書き込まれているのだけれども、どのようなケースがどんな方法でカバーされているのかがよく分からず、同じものを作ることができなかった。
Grubでみてみると、(cd0,apple1)とか(cd0,apple2)があったので、そうしたデバイスにも対応していると言うことなのかもしれないが、今回はここまで。

さて、できあがったISOイメージを確認。

ll -h ../ubuntu-from-scratch.iso
-rw-r--r-- 1 root root 1.5G  1月 23 19:22 ../ubuntu-from-scratch.iso
-rw-r--r-- 1 root root 1.6G  4月 24 08:08 ../ubuntu-from-scratch.iso
 ← 4/24に実施してみた結果

※Kernelや色々なものが少しずつ大きくなっている。

Gnome Desktop Managerをインストールしていることもあってか、思ったよりはサイズが小さくならなかった印象。

ISOを取り出して試す

できあがったISOイメージを取り出すのに、VMwareの共有フォルダの仕組みを使う。

sudo mount -t fuse.vmhgfs-fuse -o allow_other .host:/VMware /mnt
cp ../ubuntu-from-scratch.iso /mnt/
sudo umount /mnt

8GBをアサインした仮想環境で、起動直後にfreeコマンドを実行してavailableを確認したところ、5.5GBであり、ISOイメージのサイズ削減がそのまま反映されたようだ。だいぶ小さな環境ができあがった。

再編集

これまでの作業でできたLive CDは最低限過ぎるので、あれこれと再編集したくなるはずなので、再編集の手順だけを切り出して整理する(実際、何度この手順をやり直したか知れない…)。

編集環境に入る

編集をはじめるために以下を実行。

sudo mount --bind /dev $HOME/live-ubuntu-from-scratch/chroot/dev
sudo mount --bind /run $HOME/live-ubuntu-from-scratch/chroot/run
sudo mount --bind /proc $HOME/live-ubuntu-from-scratch/chroot/proc
sudo mount --bind /sys $HOME/live-ubuntu-from-scratch/chroot/sys
sudo mount --bind /dev/pts $HOME/live-ubuntu-from-scratch/chroot/dev/pts
sudo chroot $HOME/live-ubuntu-from-scratch/chroot
export HOME=/root
export LC_ALL=C
dbus-uuidgen > /etc/machine-id
ln -fs /etc/machine-id /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl
rm /etc/resolv.conf
cat <<EOF > /etc/resolv.conf
nameserver 127.0.0.53
EOF
apt update

これでLive環境が編集できるようになる。細かな編集をしてもいいし、パッケージをインストールしたり、アンインストールしてもいい。

編集

chroot環境で、パッケージの追加・削除、各種設定変更など、Live環境に組み込みたいことを実施。

casperを含むinitramfsへの変更を実行したときや、古いカーネルを削除してシェイプアップしたときには、

dpkg-reconfigure initramfs-tools

を実行しておく。

編集環境から抜けてISOを作る

編集が終わったら、chroot環境から抜けてISOを作る。

apt -f autoremove
rm /etc/resolv.conf
dpkg-reconfigure resolvconf

確認表示があったら…
Prepare /etc/resolv.conf for dynamic updates? [yes/no] yes

後は、問いかけもなくすーっと流れていく処理。

truncate -s 0 /etc/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
apt clean
rm -rf /tmp/*
export HISTSIZE=0
exit
sudo rm $HOME/live-ubuntu-from-scratch/chroot/root/.bash_history

sudo umount $HOME/live-ubuntu-from-scratch/chroot/dev/pts
sudo umount $HOME/live-ubuntu-from-scratch/chroot/sys
sudo umount $HOME/live-ubuntu-from-scratch/chroot/proc
sudo umount $HOME/live-ubuntu-from-scratch/chroot/run
sudo umount $HOME/live-ubuntu-from-scratch/chroot/dev

cd $HOME/live-ubuntu-from-scratch
sudo cp chroot/boot/vmlinuz-**-**-generic image/casper/vmlinuz
sudo cp chroot/boot/initrd.img-**-**-generic image/casper/initrd

sudo chroot chroot dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee image/casper/filesystem.manifest > /dev/null
sudo cp -v image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
sudo sed -i '/ubiquity/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/casper/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/discover/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/laptop-detect/d' image/casper/filesystem.manifest-desktop
sudo sed -i '/os-prober/d' image/casper/filesystem.manifest-desktop

sudo rm image/casper/filesystem.squashfs
sudo mksquashfs chroot image/casper/filesystem.squashfs
printf $(sudo du -sx --block-size=1 chroot | cut -f1) > image/casper/filesystem.size

cd $HOME/live-ubuntu-from-scratch/image
sudo /bin/bash -c "(find . -type f -print0 | xargs -0 md5sum | grep -v -e 'md5sum.txt' -e 'boot.img' -e 'efi.img' -e 'isolinux.bin' > md5sum.txt)"
sudo xorriso \
   -as mkisofs \
   -iso-level 3 \
   -full-iso9660-filenames \
   -volid "UBUNTU_FROM_SCRATCH" \
   -output ../ubuntu-from-scratch.iso \
   -isohybrid-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
   --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
   --grub2-boot-info \
   -b boot/grub/boot.img \
      -no-emul-boot \
      -boot-load-size 4 \
      -boot-info-table \
      --eltorito-catalog boot/grub/boot.cat \
   -append_partition 2 0xef boot/grub/efi.img \
   -eltorito-alt-boot \
      -e boot/grub/efi.img \
      -no-emul-boot \
      -isohybrid-gpt-basdat \
   ./

sudo mount -t fuse.vmhgfs-fuse -o allow_other .host:/VMware /mnt
cp ../ubuntu-from-scratch.iso /mnt/
sudo umount /mnt

だいたいこんなところだろうと思われる。

細かな設定

最初の手順で一時的に使うには十分な環境ができていると思うが、しょっちゅう使おうとすると細かな点が気になってくる。
せっかくなのでやり方を整理しておく。

  • デスクトップの設定をしたい。
    • Mozcが選択されておらず、日本語を入力しようとしたら、一度、日本語からMozcに変更する操作が必要。
    • 5分でブランクスクリーンになるが、家庭内で使う分にはブランクスクリーンにしたくない。
    • 背景はフォッサもいいけど、文字が読みやすそうなものに変えたい。
    • Livepatchのアイコンは使わないので非表示にしたい。
  • Edgeを開くたびに「初めまして」状態になるのはめんどくさい。宅内で立てているオレオレ証明書のサーバーにもアクセスしたい。
  • もたもたと何週間も掛けてやっているうちに、2バージョンのカーネルがインストールされていたから、古いのを削除したい。

これらの設定は、chroot環境に入ってから実行する。

GNOMEデスクトップの細かな設定

GNOMEデスクトップは、設定アプリケーションで細かく設定ができるし、Tweak toolでさらに細かく設定ができる。
検証用の環境でLive起動し、設定アプリケーションで気に入った環境にして、その変更結果を上手く取り込むことができないか、と考えた。

結論からすると、設定値をdconfのデータベースに登録しておけば、起動時にそれが反映される。

現在の設定は、以下のコマンドで変更点を読み出すことができる。
Liveを起動した直後がこの状態だった。

$ dconf dump /
[org/gnome/desktop/input-sources]
sources=[('xkb', 'jp'), ('ibus', 'mozc-jp')]
xkb-options=@as []

[org/gnome/desktop/interface]
gtk-im-module='ibus'

[org/gnome/evolution-data-server]
migrated=true
network-monitor-gio-name=''

日本語をMozcにして、背景画像を変更し、ブランクスクリーンを「しない」に選択した結果がこちら。

$ dconf dump /
[org/gnome/control-center]
last-panel='lock'

[org/gnome/desktop/background]
color-shading-type='solid'
picture-options='zoom'
picture-uri='file:///usr/share/backgrounds/ubuntu-gnome/2_by_the5heepdev.jpg'
primary-color='#000000'
secondary-color='#000000'

[org/gnome/desktop/input-sources]
mru-sources=[('ibus', 'mozc-jp'), ('xkb', 'jp')]
sources=[('xkb', 'jp'), ('ibus', 'mozc-jp')]
xkb-options=@as []

[org/gnome/desktop/interface]
gtk-im-module='ibus'

[org/gnome/desktop/screensaver]
color-shading-type='solid'
lock-delay=uint32 0
picture-options='zoom'
picture-uri='file:///usr/share/backgrounds/ubuntu-gnome/2_by_the5heepdev.jpg'
primary-color='#000000'
secondary-color='#000000'

[org/gnome/desktop/session]
idle-delay=uint32 0

[org/gnome/evolution-data-server]
migrated=true
network-monitor-gio-name=''

これらの設定は、普通の環境ならば以下の方法で~/.config/dconf/userに取り込めるようだった。
Ubuntu mate community / Error: Cannot autolaunch D-Bus without X11 $DISPLAY

dbus-launch dconf load / < dconf-settings.ini

chroot環境でこのコマンドを実行しても、/root/.config/dconf/userに設定値が保管されるだけ。
Live環境は起動した後にユーザーが作られるようになっているので、Liveユーザーで作ったファイルをタイミング良く配置する必要があるけれど、やたらと難易度が上がりそうだった。

そこで、デフォルト値をカスタマイズすることにした。
/etc/dconf配下にデフォルト値を仕掛けることができる。
GNOME HELP / Custom default values for system settings

ディレクトリを作成する。

mkdir /etc/dconf/db/local.d

データベース定義を作成。

cat <<EOF > /etc/dconf/profile/user
user-db:user
system-db:local
EOF

先程Live環境で表示された定義をファイルに書き込む。

cat <<EOF > /etc/dconf/db/local.d/01-customize
[org/gnome/desktop/background]
color-shading-type='solid'
picture-options='zoom'
picture-uri='file:///usr/share/backgrounds/ubuntu-gnome/2_by_the5heepdev.jpg'
primary-color='#000000'
secondary-color='#000000'

[org/gnome/desktop/input-sources]
mru-sources=[('ibus', 'mozc-jp'), ('xkb', 'jp')]

[org/gnome/desktop/screensaver]
color-shading-type='solid'
lock-delay=uint32 0
picture-options='zoom'
picture-uri='file:///usr/share/backgrounds/ubuntu-gnome/2_by_the5heepdev.jpg'
primary-color='#000000'
secondary-color='#000000'

[org/gnome/desktop/session]
idle-delay=uint32 0
EOF

設定をデータベースに反映させる。

dconf update

この方法で、これ以外の色々な変更をLive環境に組み込んでいくことができた。

使わないアイコンの非表示

アプリケーションをアンインストールしてしまえばアイコンは表示されない。
でも、このLive Updateってのは何が何だかよく分からない。通知を止めるとかいう話も出ていたりする、OSに根ざしたものっぽい。

アプリをアンインストールすることで、何か変なことが起きても嫌なので、とりあえずアイコンだけ見えなくする。

mv /usr/share/applications/software-properties-livepatch.desktop \
   /usr/share/applications/software-properties-livepatch.desktop.bak

パッケージがアップデートされたときに、アイコンが復活してしまうかもしれない。
都度チェックして手直しするか、あるいは、/etc/rc.localにこの処理を仕込んでおくなどしても良さそうだ。

Edge

Live環境なので、Edgeは毎回初回起動。そのため、起動するとキーリングを作ろうとするし、いつも使っているブックマークとかもない。

まず、キーリング。パスワードなしでオートログインするLive環境では、デフォルトキーリングが作られるタイミングがない。
何か方法はないかとEdgeのManページを見てみたところ、–password-storeというパラメーターがあり、これにbasicというのを選択できるらしいことが分かった。

使用するパスワードストアを設定します。デフォルトでは、デスクトップ環境に応じて自動的に検出されます。
basic は、内蔵された暗号化されていないパスワードストアを選択します。

DeepL先生の翻訳

具体的には、このような設定をすれば内蔵のパスワードストアを選択するようになるようだ。

/usr/share/applications/microsoft-edge.desktop

[Desktop Entry]
Exec=/usr/bin/microsoft-edge-stable --password-store=basic %U

[Desktop Action new-window]
Exec=/usr/bin/microsoft-edge-stable --password-store=basic

[Desktop Action new-private-window]
Exec=/usr/bin/microsoft-edge-stable --password-store=basic --inprivate

※3箇所ともに追加してみた。Dash(メニュー)で右クリックすると出てくる選択肢3つがこれっぽい。

パラメーターを追加しようとviで開いてみたが、様々な言語が含まれていて編集結果を正しく保存できるのか不安だった。
そこで、sedで書き換えた。

sed -i -E 's/(Exec=\/usr\/bin\/microsoft-edge-stable)/\1 --password-store=basic/g' /usr/share/applications/microsoft-edge.desktop

これも、アップデートで書き戻されたりすると思うので、/etc/rc.localで編集するのが良さそうだ。

次に、ブックマーク。いつも使うページをお気に入りバーに追加したり、宅内で利用しているオレオレ証明書に問題なくアクセスできるようにしたいと思った。
これは、Liveで必要な設定をした後、以下の2つのディレクトリをまるごとLive環境で再現すれば良いと分かった。

ディレクトリ内容
${HOME}/.config/microsoft-edgeEdgeの設定とか色々を保管している場所。30MB弱のデーターが保管されている。
${HOME}/.pki/nssdb証明書を保管している場所。今回は、オレオレ証明書に署名した認証局の証明書を登録してある。

Live環境で必要な設定をすべてした上で、上記2つのディレクトリを固めて取り出し、それをchroot環境に持ち込んで/root/origconfというディレクトリに展開しておいた。

/root
  + origconf
     + microsoft-edge
     + nssdb

※こんなディレクトリ構成。

mkdir /root/origconf
※Live環境から取り出したファイルを展開する。

これらのディレクトリを、Liveユーザーができた後にコピーするのだけれど、一体どこで?と探していたら、casperだと分かった。
casperってそういえばどこかに書いてあったなと思って調べてみると、initramfsに組み込まれたスクリプトで、Liveユーザーに関わる設定をしているらしいことが分かった。

そこで、casperという仕組みの中に、設定を展開するスクリプトを仕込んでおく。

cat <<EOF > /usr/share/initramfs-tools/scripts/casper-bottom/60original
#!/bin/sh

PREREQ=""
DESCRIPTION="Original settings..."

prereqs()
{
       echo "\$PREREQ"
}

case \$1 in
# get pre-requisites
prereqs)
       prereqs
       exit 0
       ;;
esac

. /scripts/casper-functions

log_begin_msg "\$DESCRIPTION"

# Extract Microsoft Edge configuration
mkdir -p /root/home/\$USERNAME/.config/microsoft-edge
cp -ar /root/root/origconf/microsoft-edge /root/home/\$USERNAME/.config/
chroot /root chown -R \$USERNAME.$USERNAME /home/\$USERNAME/.config/microsoft-edge
# Extract Certificate
mkdir -p /root/home/\$USERNAME/.pki
cp -ar /root/root/origconf/nssdb /root/home/\$USERNAME/.pki/
chroot /root chown -R $USERNAME.$USERNAME /home/\$USERNAME/.pki

log_end_msg
EOF

実行権限を付ける。

chmod +x /usr/share/initramfs-tools/scripts/casper-bottom/60original

この設定をしたら、casperを更新する必要がある。
adsaria mood / HDDからのcasperブートの最適化

dpkg-reconfigure casper
update-initramfs: deferring update (trigger activated)
Processing triggers for initramfs-tools (0.136ubuntu6.6) ...
update-initramfs: Generating /boot/initrd.img-5.4.0-91-generic

実行してみると、/boot/initrd.img-5.4.0-91-genericが更新されていることが分かる。
なるほど、casperというのはinitrdの中に組み込まれ、初期RAMディスクを作る最中に呼ばれるようになっているようだ。
server fault / Configure initramfs-tools to add curl to the initramfs, and run curl in a script at boot while in intitrd in Ubuntu 10.04 Server

つまり、これらinitrdに関わる部分を変更したら、ブートローダーから見える場所(/boot)にinitrdを再度コピーする必要があるってことだと理解。

なお、initrdの中身は、以下で確認できる。

lsinitramfs -l /boot/initrd.img

古いカーネル

色々と動作を確認している途中で、カーネルが2バージョンインストールされていることが分かった。
できるだけ小さなISOにしたいので、新しいカーネルでの動作が確認できたら、古いカーネルは削除したい。

# ll /boot
total 194772
drwxr-xr-x  3 root root     4096  1月 12 05:42 ./
drwxr-xr-x 17 root root     4096  1月 12 05:36 ../
-rw-r--r--  1 root root   237940 11月 26 23:42 config-5.4.0-92-generic
-rw-r--r--  1 root root   237940  1月  7 06:56 config-5.4.0-94-generic
drwxr-xr-x  2 root root     4096  1月  3 06:22 grub/
lrwxrwxrwx  1 root root       27  1月 12 05:41 initrd.img -> initrd.img-5.4.0-94-generic
-rw-r--r--  1 root root 81048819  1月 10 18:00 initrd.img-5.4.0-92-generic
-rw-r--r--  1 root root 81049218  1月 12 05:42 initrd.img-5.4.0-94-generic
lrwxrwxrwx  1 root root       27  1月  9 14:45 initrd.img.old -> initrd.img-5.4.0-92-generic
-rw-------  1 root root  4756293 11月 26 23:42 System.map-5.4.0-92-generic
-rw-------  1 root root  4756293  1月  7 06:56 System.map-5.4.0-94-generic
lrwxrwxrwx  1 root root       24  1月 12 05:41 vmlinuz -> vmlinuz-5.4.0-94-generic
-rw-------  1 root root 13656320 11月 26 23:45 vmlinuz-5.4.0-92-generic
-rw-------  1 root root 13656320  1月  7 08:07 vmlinuz-5.4.0-94-generic
lrwxrwxrwx  1 root root       24  1月  9 14:45 vmlinuz.old -> vmlinuz-5.4.0-92-generic

# dpkg -l linux*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                  Version              Architecture Description
+++-=====================================-====================-============-==============================================================
ii  linux-base                            4.5ubuntu3.7         all          Linux image base package
un  linux-doc                             <none>               <none>       (no description available)
ii  linux-firmware                        1.187.24             all          Firmware for Linux kernel drivers
un  linux-firmware-raspi2                 <none>               <none>       (no description available)
un  linux-firmware-snapdragon             <none>               <none>       (no description available)
ii  linux-generic                         5.4.0.94.98          amd64        Complete Generic Linux kernel and headers
un  linux-headers                         <none>               <none>       (no description available)
un  linux-headers-3.0                     <none>               <none>       (no description available)
ii  linux-headers-5.4.0-92                5.4.0-92.103         all          Header files related to Linux kernel version 5.4.0
ii  linux-headers-5.4.0-92-generic        5.4.0-92.103         amd64        Linux kernel headers for version 5.4.0 on 64 bit x86 SMP
ii  linux-headers-5.4.0-94                5.4.0-94.106         all          Header files related to Linux kernel version 5.4.0
ii  linux-headers-5.4.0-94-generic        5.4.0-94.106         amd64        Linux kernel headers for version 5.4.0 on 64 bit x86 SMP
ii  linux-headers-generic                 5.4.0.94.98          amd64        Generic Linux kernel headers
un  linux-image                           <none>               <none>       (no description available)
ii  linux-image-5.4.0-92-generic          5.4.0-92.103         amd64        Signed kernel image generic
ii  linux-image-5.4.0-94-generic          5.4.0-94.106         amd64        Signed kernel image generic
ii  linux-image-generic                   5.4.0.94.98          amd64        Generic Linux kernel image
un  linux-image-unsigned-5.4.0-92-generic <none>               <none>       (no description available)
un  linux-image-unsigned-5.4.0-94-generic <none>               <none>       (no description available)
un  linux-initramfs-tool                  <none>               <none>       (no description available)
ii  linux-modules-5.4.0-92-generic        5.4.0-92.103         amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
ii  linux-modules-5.4.0-94-generic        5.4.0-94.106         amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
ii  linux-modules-extra-5.4.0-92-generic  5.4.0-92.103         amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
ii  linux-modules-extra-5.4.0-94-generic  5.4.0-94.106         amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
un  linux-restricted-common               <none>               <none>       (no description available)
ii  linux-sound-base                      1.0.25+dfsg-0ubuntu5 all          base package for ALSA and OSS sound systems
un  linux-source-5.4.0                    <none>               <none>       (no description available)
un  linux-tools                           <none>               <none>       (no description available)

古い方のカーネルを削除する。

apt purge \
linux-headers-5.4.0-92 \
linux-headers-5.4.0-92-generic \
linux-image-5.4.0-92-generic \
linux-modules-5.4.0-92-generic \
linux-modules-extra-5.4.0-92-generic

※今日の状態だとこのモジュールが古かった。

これで容量が120MBくらい減った。

この後にISO作って起動してみたら、以下のメッセージが表示されてOSが起動しなくなった。

Unable to find a medium container a live file system
Attempt interactive netboot from a URL?
yes no (default yes): _

これは、以下を実行することで回避できた。これで整合性を取ってくれるのだろう。

dpkg-reconfigure initramfs-tools

カーネルの差し替え

最初、カーネル5.4を使っていたが、比較的新しいPCで動かない(音が鳴らない、画面の解像度が設定できない、等々)ことが分かったので、5.13に差し替えた。

apt install --no-install-recommends linux-generic-hwe-20.04
apt purge linux-generic

apt purge \
linux-headers-5.4.0-94 \
linux-headers-5.4.0-94-generic \
linux-image-5.4.0-94-generic \
linux-modules-5.4.0-94-generic \
linux-modules-extra-5.4.0-94-generic

apt autoremove

dpkg-reconfigure initramfs-tools

差し替えるときにインストールされていた古いカーネルをpurgeしている。

カーネルのバージョンって、結構な勢いで上がっているので前項を見ながら削除していくのが良いだろう。

no-install-recommendsしすぎて起きたことメモ

サイズを小さくしようとして、元々教えてくれていた手順の至る所で apt install –no-install-recommends <package name> とやったことで、当初できあがったLiveはちょっと変な感じでになっていた。

  • CUIで、言語選択やキーボード選択ができるあの画面が表示されず、数字で選択結果を入力するようになっていた。
  • 起動時のスプラッシュが「黒画面に白いグルグル」じゃなく「紫画面に赤い点々」になった。以前のバージョンに戻ったような感じ?
  • アイコンがとても昔っぽいデザインになっている。
    • アプリケーションのアイコンは一目瞭然。
    • カーソルの色が「黒に白い縁取り」じゃなく「白」になった。
  • 画面の更新がちゃんとできない。恐らくは、ドライバの問題。
  • コマンド入力中の補完ができない。
    • aptでパッケージ名を途中まで入力してtabキーを押しても、残りが入力されない。
    • systemctlでサービス名を途中まで入力したときも同じ。
  • ターミナルの背景が白い。
  • 警告音が違う。
  • スピーカーテストの音声が流れない。
  • FilesでWindowsの共有フォルダがマウントできない。
  • ネットワークの設定が保存できない。
  • Miix 2 8で音が鳴らない。
  • AppArmorが入っていない。

修正結果を最初の手順に反映しているが、その過程で調べていた色々をメモとして書き残しておく。

CUIの選択画面

どうやらこれは、whiptailというらしい。CUIのウィンドウシステム。
技術評論社 / 第422回 whiptailでCUIをグラフィカルにする

他の環境で見てみると、インストールされている。

$ dpkg -l *whiptail*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version          Architecture Description
+++-==============-================-============-======================================================
ii  whiptail       0.52.21-4ubuntu2 amd64        Displays user-friendly dialog boxes from shell scripts
un  whiptail-utf8  <none>           <none>       (no description available)

そして、今回作成した環境には入っていない。
これは好みの問題かもしれないので、入れておきたいと思ったらインストール。

apt install whiptail

この後は、dpkg-reconfigureとかで選択式の画面が表示されるようになった。

どころで、utf8のパッケージはなんだろう?とインストールを試したところ、パッケージは存在しなかった。

起動時のスプラッシュ

スプラッシュはplymouthというらしい。
makeuseof.com / How to Customize the Ubuntu Boot Splash Screen and Logo

テーマはここに入っているらしく…

$ ll /usr/share/plymouth/themes/
total 32
drwxr-xr-x 8 root root 4096  8月 19 19:41 ./
drwxr-xr-x 3 root root 4096  8月 19 19:32 ../
drwxr-xr-x 2 root root 4096  8月 19 19:38 bgrt/
lrwxrwxrwx 1 root root   34 12月  4 20:35 default.plymouth -> /etc/alternatives/default.plymouth
drwxr-xr-x 2 root root 4096  8月 19 19:32 details/
drwxr-xr-x 2 root root 4096  8月 19 19:38 spinner/
drwxr-xr-x 2 root root 4096  8月 19 19:32 text/
lrwxrwxrwx 1 root root   31 12月  4 20:35 text.plymouth -> /etc/alternatives/text.plymouth
drwxr-xr-x 2 root root 4096  8月 19 19:32 tribar/
drwxr-xr-x 2 root root 4096  8月 19 19:41 ubuntu-text/

default.plymouthというのがなんなのか…と、他の環境で確認してみると、bgrtを指していた。

$ ll /etc/alternatives/default.plymouth
lrwxrwxrwx 1 root root 45 12月  4 20:34 /etc/alternatives/default.plymouth -> /usr/share/plymouth/themes/bgrt/bgrt.plymouth

一方、今回作成したLive環境は以下を指していた。

# ll /etc/alternatives/default.plymouth
lrwxrwxrwx 1 root root 59 12月 26 19:50 /etc/alternatives/default.plymouth -> /usr/share/plymouth/themes/ubuntu-logo/ubuntu-logo.plymouth

bgrt.plymouthが入っているパッケージを検索したところ、これだった。
ubuntu packages / plymouth-theme-spinner (0.9.4git20200323-0ubuntu6)

改めてパッケージを確認。

Live環境を作成している環境

$ dpkg -l plymouth-theme*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                       Version                     Architecture Description
+++-==========================-===========================-============-==============================================================
un  plymouth-theme             <none>                      <none>       (no description available)
ii  plymouth-theme-spinner     0.9.4git20200323-0ubuntu6.2 amd64        boot animation, logger and I/O multiplexer - spinner theme
ii  plymouth-theme-ubuntu-text 0.9.4git20200323-0ubuntu6.2 amd64        boot animation, logger and I/O multiplexer - ubuntu text theme
un  plymouth-themes            <none>                      <none>       (no description available)

今回の手順で作ったLive環境

# dpkg -l plymouth-theme*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                       Version                     Architecture Description
+++-==========================-===========================-============-=========================================================
un  plymouth-theme             <none>                      <none>       (no description available)
un  plymouth-theme-spinner     <none>                      <none>       (no description available)
ii  plymouth-theme-ubuntu-logo 0.9.4git20200323-0ubuntu6.2 amd64        boot animation, logger and I/O multiplexer - ubuntu theme
un  plymouth-theme-ubuntu-text <none>                      <none>       (no description available)
un  plymouth-themes            <none>                      <none>       (no description available)

ということで、spinnerをインストールして、ubuntu-logoを削除すれば、同じ形になりそうだ。

apt install plymouth-theme-spinner

ll /etc/alternatives/default.plymouth
lrwxrwxrwx 1 root root 45 Dec 28 17:56 /etc/alternatives/default.plymouth -> /usr/share/plymouth/themes/bgrt/bgrt.plymouth

パッケージ検索してみたところ、色々なテーマがありそうなので、気に入ったのに変えるのもいいかも。

アイコン

アイコンがなんともクラシカル。これはきっとテーマ…と思い、iconというのが入ったパッケージをみてみた。

Live環境を作成している環境

$ dpkg -l *icon*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                 Version                 Architecture Description
+++-====================================-=======================-============-=========================================>
ii  adwaita-icon-theme                   3.36.1-2ubuntu0.20.04.2 all          default icon theme of GNOME (small subset)
un  adwaita-icon-theme-full              <none>                  <none>       (no description available)
ii  apt-config-icons                     0.12.10-2               all          APT configuration snippet to enable icon >
ii  apt-config-icons-hidpi               0.12.10-2               all          APT configuration snippet to enable HiDPI>
un  gnome-icon-theme                     <none>                  <none>       (no description available)
ii  gnome-shell-extension-desktop-icons  20.04.0-3~ubuntu20.04.6 all          desktop icon support for GNOME Shell
un  gnome-shell-extension-top-icons-plus <none>                  <none>       (no description available)
ii  gtk-update-icon-cache                3.24.20-0ubuntu1        amd64        icon theme caching utility
ii  hicolor-icon-theme                   0.17-2                  all          default fallback theme for FreeDesktop.or>
ii  humanity-icon-theme                  0.6.15                  all          Humanity Icon theme
ii  libtext-iconv-perl                   1.7-7                   amd64        module to convert between character sets >
ii  sound-icons                          0.1-7                   all          Sounds for speech enabled applications
ii  yaru-theme-icon                      20.04.11.1              all          Yaru icon theme from the Ubuntu Community

黄色で塗ったところがインストールされていなかった。
そのなかでyaruテーマをインストールして、ディスプレイマネージャーを再起動したところ、アイコンがモダンになった。

sudo apt install yaru-theme-icon

ついでに、カーソルも「黒に白の縁取り」に変わった。

グラフィックドライバ

画面の更新ができないので、全画面表示→元に戻す、みたいに再描画されるような操作をして、どうにか操作を進める。
ちなみに、これ、VMwareの仮想ゲストで発生しており、PCで起動すると再現しない。

ということで、まずはグラフィックドライバで何が使われているのか確認してみる。
ask ubuntu / How can I find what video driver is in use on my system?

Live環境を作成している環境

$ sudo lshw -c video
  *-display                 
       description: VGA compatible controller
       product: SVGA II Adapter
       vendor: VMware
       physical id: f
       bus info: pci@0000:00:0f.0
       version: 00
       width: 32 bits
       clock: 33MHz
       capabilities: vga_controller bus_master cap_list rom
       configuration: driver=vmwgfx latency=64
       resources: irq:16 ioport:2140(size=16) memory:f0000000-f7ffffff memory:fb800000-fbffffff memory:c0000-dffff

今回の手順で作ったLive環境

$ sudo lshw -c video
  *-display                 
       詳細: VGA compatible controller
       製品: SVGA II Adapter
       ベンダー: VMware
       物理ID: f
       バス情報: pci@0000:00:0f.0
       バージョン: 00
       幅: 32 bits
       クロック: 33MHz
       性能: vga_controller bus_master cap_list rom
       設定: driver=vmwgfx latency=64
       リソース: irq:16 IOポート:2140(サイズ=16) メモリー:f0000000-f7ffffff メモリー:fb800000-fbffffff メモリー:c0000-dffff

何も違わない。んー。

表示された結果を手打ちするのは面倒なので、このメッセージをコピーしようと、open-vm-tools-desktopをインストールしたところで、画面の更新ができるようになった。そのとき、どんなパッケージがインストールされたかというと…

ethtool
iproute2
libatkmm-1.6-1v5
libatm1
libcatromm-1.0-1v5
libglibmm-2.4-1v5
libgtkmm-3.0-1v5
libmspack0
libpangomm-1.4-1v5
libsigc++-2.0-0v5
libxatracker2 libxmlsec1
libxmlsec1-0penssl
open-vm-tools
open-vm-tools-desktop
xserver-xorg-video-vmware
zerofree

で、もしかして…これ?とxserver-xorg-video-vmwareを試したところ、画面が更新されるようになった。
なので、関連しそうなパッケージをとりあえずインストールしておく。

apt install \
xserver-xorg-video-vmware \
xserver-xorg-input-wacom \
xserver-xorg-legacy \
xserver-xorg-video-all \
xserver-xorg-video-amdgpu \
xserver-xorg-video-ati \
xserver-xorg-video-fbdev \
xserver-xorg-video-intel \
xserver-xorg-video-nouveau \
xserver-xorg-video-qxl \
xserver-xorg-video-radeon \
xserver-xorg-video-vesa \
xserver-xorg-video-vmware

この他、比較的新しいPCで、800×600とか1024×768の解像度しか出てくれない問題が発生していたが、これはカーネルを5.13に差し替えたところ解決できた。

コマンド入力中の補完

ターミナルでコマンドを入力している途中、TABキーを押すと残りを埋めてくれる便利な機能。
今回作ったLive環境ではこれが働かなかった。
インフラエンジニアになりたくて。 / LinuxでTab補完ができない方へ!bash-completionをインストールしよう!

Live環境ではbash-completionをインストールし、ターミナルを開き直しただけで補完ができるようになった。

apt install bash-completion

これだけだと、chrootしたときに補完ができない。
完全とは言えないのだけれど、これをやっておくと、コマンドが用意するサブコマンドとかは補完されるようになる。

/root/.bashrc

<omit>
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

※最後の3行について、コメントアウトされているのを有効にする。

ターミナルの背景色

ターミナルの設定を開いたところ、ダークが選択されているにもかかわらず、デフォルトカラー表示になっており、これを切り替えても変わらない。
設定アプリケーションを開き、外観でダークを選択しても何も変わらない。これは…

ということで、他の環境でテーマを見てみた。

$ dpkg -l gnome-themes*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                       Version       Architecture Description
+++-==========================-=============-============-=====================================
ii  gnome-themes-extra:amd64   3.28-1ubuntu1 amd64        Adwaita GTK+ 2 theme — engine
ii  gnome-themes-extra-data    3.28-1ubuntu1 all          Adwaita GTK+ 2 theme — common files
un  gnome-themes-standard      <none>        <none>       (no description available)
un  gnome-themes-standard-data <none>        <none>       (no description available)

入っていなかったテーマを入れたが、機能しない。色々調べてみると、yaruというテーマが重要らしい。

$ dpkg -l *yaru*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                   Version      Architecture Description
+++-======================-============-============-==================================================>
ii  yaru-theme-gnome-shell 20.04.11.1   all          Yaru GNOME Shell desktop theme from the Ubuntu Com>
ii  yaru-theme-gtk         20.04.11.1   all          Yaru GTK theme from the Ubuntu Community
ii  yaru-theme-icon        20.04.11.1   all          Yaru icon theme from the Ubuntu Community
ii  yaru-theme-sound       20.04.11.1   all          Yaru sound theme from the Ubuntu Community

これをインストールしたところ、ダークが機能しはじめた。

apt install yaru-theme-gtk

警告音

警告音が水がポチャッと落ちるような音になっていた。

Live環境を作成している環境

$ dpkg -l *yaru*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                   Version      Architecture Description
+++-======================-============-============-==================================================>
ii  yaru-theme-gnome-shell 20.04.11.1   all          Yaru GNOME Shell desktop theme from the Ubuntu Com>
ii  yaru-theme-gtk         20.04.11.1   all          Yaru GTK theme from the Ubuntu Community
ii  yaru-theme-icon        20.04.11.1   all          Yaru icon theme from the Ubuntu Community
ii  yaru-theme-sound       20.04.11.1   all          Yaru sound theme from the Ubuntu Community

これはサウンドテーマがインストールできていなかったために発生していた。

apt install yaru-theme-sound

スピーカーのテスト

スピーカーテストの音声が流れない…おかしい。
Phonon Test of speakers “Front Left” , “Front Right” is not working

apt install libcanberra-pulse

音が鳴り始めた。

Filesでsmbマウント

Filesで smb://share.example… と入力をし始めたら、文字が赤くなっている。
ライブラリが不足していてマウントができないようだ。

色々探していると、gio mountというコマンドが使われるらしく、何をするのかが/usr/share/gvfs/mounts/に入っているらしい。
これを含むパッケージがLive環境にインストールできていなかった。
GNOME GLib Issues / gio – cifs mount smb not possible “Location is not mountable”

Live環境を作成している環境

$ ll /usr/share/gvfs/mounts/smb.mount
-rw-r--r-- 1 root root 78  4月 15  2020 /usr/share/gvfs/mounts/smb.mount

$ dpkg -l gvfs-backends
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version         Architecture Description
+++-==============-===============-============-=======================================
ii  gvfs-backends  1.44.1-1ubuntu1 amd64        userspace virtual filesystem - backends

インストールしてみる。

apt install gvfs-backends

これでマウントできた。

ネットワーク設定

DHCPは動作しており、一見何の問題もないように見える。ところが、例えば、固定のIPアドレスを振って保存すると、ネットワーク設定画面と一緒に設定画面が消えて、固定IPアドレスは保存されない。

これはまずい…ということで、以下をインストールして問題を解消。

apt install network-manager-gnome

Miix 2 8で音が鳴らない

ここまでのところで、ほとんど問題なく動いていたのだが、音の問題を発見。

VMwareやHyper-V、メインPC、Legacy BIOSしかないPCでは音が鳴るのだけれど、Miix 2 8で音が鳴らなかった。
でも、ubuntu-gnome-desktopを–no-install-recommends指定なしでインストールしたLive環境では音が鳴る。

これは、Recommendsのパッケージに必要なものがあることは明白だった。

apt show ubuntu-gnome-desktop
<omit>
Depends: ubuntu-desktop, gnome-session
<omit>

さらに、ubuntu-desktopの中身をみてみると、RecommendsにFirefoxやThunderbird、yaru-theme-iconなど、UbuntuをUbuntuたらしめているパッケージが並んでいた。gnome-sessionの方は、Dependsの方に色々と今回の問題に関わりそうなパッケージ名があるような気がした。

そこで、以下の形でインストールしてみることにした。

apt install gnome-session
apt install --no-install-recommends ubuntu-gnome-desktop

これでMiix 2 8でも音がするようになった。

なお、この操作をすることで、これまでにやってきたいくつかの追加パッケージのインストールが不要となった。

AppArmor(Liveでは使えない)

AppArmorが入っていない。Ubuntuでは必ず動いているものと思っていたけれども、そういうものでもないらしい。

# apt install apparmor apparmor-profiles

必要パッケージをインストールして起動してみたところ、AppArmorは落ちていた。

$ sudo systemctl status apparmor
● apparmor.service - Load AppArmor profiles
     Loaded: loaded (/lib/systemd/system/apparmor.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
  Condition: start condition failed at Wed 2021-12-29 04:47:40 JST; 9h ago
             └─ ConditionPathExists=!/rofs/etc/apparmor.d was not met
       Docs: man:apparmor(7)
             https://gitlab.com/apparmor/apparmor/wikis/home/

12月 29 04:47:40 ubuntu systemd[1]: Condition check resulted in Load AppArmor profiles being skipped.

9時間前と表示されているのは、システム時間をローカル扱いにするオプションを入れているからだと思う。

探してみると、こんな情報が。
whonix / Live mode breaks apparmor

ユニットファイルを見てみると…
/usr/lib/systemd/system/apparmor.service

…
# Don't start this unit on the Ubuntu Live CD
ConditionPathExists=!/rofs/etc/apparmor.d
…

LiveCDの時には起動するな、と書かれている。
条件として、/rofs/etc/apparmor.dが存在しないこと、と。そりゃ起動しないわ。
Qiita / systemdを用いたプログラムの自動起動

だけれども、動かしてみたらどうなるのか。
Live作成環境で以下の通り編集してみる。

…
# Don't start this unit on the Ubuntu Live CD
#ConditionPathExists=!/rofs/etc/apparmor.d
…

これで動かしてみたところ、どうにか動くには動く。
とはいえ、起動するな、と書かれているものを起動するのだから、ちゃんと動くのかどうか、とても保証はできない。

実際に起きた弊害というと、Fcitxが上手く起動しなかったり、後から起動しても通常と表示が違ったりすることだった。
他にも色々起きるかもしれないので、導入はお勧めしない。

やったこと

chroot環境のマウント

再編集して試し、再編集をして試し…を繰り返していたので、何度もchrootして、何度もファイルシステムをマウント・アンマウントしていた。
そのため、複数行をざーっと選択してコピー、ターミナルに貼り付け!とやりたかったが、こっちのコマンドは普通に打ち込んで、こっちのコマンドはchroot後に打ち込んで…となっていたので、手順を整理したくなった。

今回教えてもらった手順はこちらで、この中では以下のファイルシステムをマウントしている。
Github / How to create a custom Ubuntu live from scratch

ディレクトリ内容(DeepL先生の翻訳結果)
/dev/devには、すべてのデバイスファイルが含まれています。これは通常のファイルではなく、ハードディスクなど、システム上のさまざまなハードウェアデバイスを指すものです。
/dev/pts/dev/ptsにあるエントリーは疑似端末(Pseudo TerminalS)で、アプリケーションからの出力を表示したり、デバイスからの入力を受け取ったりすることができる。
疑似端末には、gnome-terminal(キー入力・画面表示)、tmux(別の端末との入出力を中継)、sshd(リモート端末とサーバーを中継)などがある。
UNIX & LINUX / What is stored in /dev/pts files and can we open them?
/run/runは、ブートプロセスの初期に利用可能なtmpfs(一時ファイルシステム)で、一時的なランタイムデータが保存されています。このディレクトリの下のファイルは、ブートプロセスの開始時に削除されるか、切り捨てられます。
(デバイスファイルではない /dev/.* や /dev/shm と同様に、 /var/run, /var/lock, /lib/init/rw などのレガシーな場所を非一時的なディレクトリツリーで非推奨としています)。
/proc/procは、カーネルがプロセスに情報を送るための仕組みを提供する仮想ファイルシステムです。
/sys/sysは仮想ファイルシステムで、カーネルのシステムビューに関する情報を設定または取得するためにアクセスすることができます。
ほぼ Ubuntu Community Help Wiki / LinuxFilesystemTreeOverview からの引用

例えば、このコマンドでマウントしてみると、こんな結果が得られる。

$ sudo mount --bind /dev $HOME/live-ubuntu-from-scratch/chroot/dev
$ mount
<omit>
udev on /home/rohhie/live-ubuntu-from-scratch/chroot/dev type devtmpfs (rw,nosuid,noexec,relatime,size=4023416k,nr_inodes=1005854,mode=755,inode64)

※mountコマンドは引数を指定しないと/etc/mtabの内容を加工して表示する。
/etc/mtabの構造は、/etc/fstabと同じだそうだ。

–bindを指定することで、/devをchroot環境に再マウントしているので、chrootしてからこのマウントを実行することはできない。
では、chrootしてから実行するコマンドでは、どんなマウントが行われるのか。

# mount none -t proc /proc
$ cat /etc/mtab
<omit>
none /home/rohhie/live-ubuntu-from-scratch/chroot/proc proc rw,relatime 0 0

これを元の環境から実現できるのだろうか。
debian / Wiki / chroot

$ sudo mount --bind /proc $HOME/live-ubuntu-from-scratch/chroot/proc
$ cat /etc/mtab
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
<omit>
proc /home/rohhie/live-ubuntu-from-scratch/chroot/proc proc rw,nosuid,nodev,noexec,relatime 0 0

デバイスをマウントするわけではないので、none→procは問題ない(見た目が違うだけで、機能的には違いがない)。
どちらもファイルシステムとしてprocをマウントしていることには変わりがない。
nosuid,nodev,noexecについては、元環境の指定と同様。

ということで、元の環境からシステムファイルをマウントする方向でアプローチしていけば、整理できそうだ。

では、他のシステムファイルはどうか。

# mount none -t proc /proc
# mount none -t sysfs /sys
# mount none -t devpts /dev/pts
$ cat /etc/mtab
<omit>
none /home/rohhie/live-ubuntu-from-scratch/chroot/proc proc rw,relatime 0 0
none /home/rohhie/live-ubuntu-from-scratch/chroot/sys sysfs rw,relatime 0 0
none /home/rohhie/live-ubuntu-from-scratch/chroot/dev/pts devpts rw,relatime,mode=600,ptmxmode=000 0 0

これを元の環境から実行したらどうなるか。

$ sudo mount --bind /proc $HOME/live-ubuntu-from-scratch/chroot/proc
$ sudo mount --bind /sys $HOME/live-ubuntu-from-scratch/chroot/sys
$ sudo mount --bind /dev/pts $HOME/live-ubuntu-from-scratch/chroot/dev/pts
$ cat /etc/mtab
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
udev /dev devtmpfs rw,nosuid,noexec,relatime,size=4023416k,nr_inodes=1005854,mode=755,inode64 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
<omit>
proc /home/rohhie/live-ubuntu-from-scratch/chroot/proc proc rw,nosuid,nodev,noexec,relatime 0 0
sysfs /home/rohhie/live-ubuntu-from-scratch/chroot/sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
devpts /home/rohhie/live-ubuntu-from-scratch/chroot/dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0

git=5はtty、/dev/ptsの中に、元の環境の疑似端末が含まれることにはなるが、大勢に影響はないだろう。

ということで、冒頭の手順となった。

シャットダウンできない

小さなイメージを作ろうと試していたときに、シャットダウンできない症状に見舞われた。
終了時の処理が上手くいかないのだが、真っ黒画面で何も表示されないため、何が原因だか分からなかった。
起動時・終了時にスプラッシュが表示される設定にしていたので、見えないのも当然か。

Grubのメニュー表示を編集。
$HOME/live-ubuntu-from-scratch/image/boot/grub/grub.cfg

search --set=root --file /ubuntu

insmod all_video

set default="0"
set timeout=30

menuentry "Try Ubuntu FS without installing" {
   linux /casper/vmlinuz boot=casper nopersistent toram quiet splash ---
   initrd /casper/initrd
}

menuentry "Check disc for defects" {
   linux /casper/vmlinuz boot=casper integrity-check quiet splash ---
   initrd /casper/initrd
}

これで、画面に処理の状況が表示されるようになり、chvtコマンドがなくなっていることが分かった。
結果、kbdをインストールすることで解消できるとわかり、最初の手順に加えた。

UEFIに登録されている起動情報

Ubuntu 20.04.3 をインストールしたハードディスクから起動した状態では以下の通り。
黄色文字はLiveとの差分。

$ sudo bootctl status
systemd-boot not installed in ESP.
System:
     Firmware: n/a (n/a)
  Secure Boot: enabled
   Setup Mode: user

Current Boot Loader:
      Product: n/a
     Features: ✗ Boot counting
               ✗ Menu timeout control
               ✗ One-shot menu timeout control
               ✗ Default entry control
               ✗ One-shot entry control
               ✗ Support for XBOOTLDR partition
               ✗ Support for passing random seed to OS
               ✗ Boot loader sets ESP partition information
          ESP: n/a
         File: └─n/a

Random Seed:
 Passed to OS: no
 System Token: not set
       Exists: no

Available Boot Loaders on ESP:
          ESP: /boot/efi (/dev/disk/by-partuuid/c7076d24-d43c-4fe9-95dd-958ffa481a48)
         File: └─/EFI/BOOT/BOOTX64.EFI

Boot Loaders Listed in EFI Variables:
        Title: ubuntu
           ID: 0x0003
       Status: active, boot-order
    Partition: /dev/disk/by-partuuid/c7076d24-d43c-4fe9-95dd-958ffa481a48
         File: └─/EFI/ubuntu/shimx64.efi

Boot Loader Entries:
        $BOOT: /boot/efi (/dev/disk/by-partuuid/c7076d24-d43c-4fe9-95dd-958ffa481a48)

0 entries, no entry could be determined as default.

利用可能なブートローダーとしてBOOTX64.EFIがあり、その他にshimx64.efiがあるってことだろうか。

不思議なのは、shimx64.efiがあるパーティションがLive起動と変わっていない点。
ぱっと見では、こんなパーティションどこにもないし。
Maruko2 Note. / CentOS/パーティションの UUID を確認・変更する方法

$ blkid
/dev/sda1: UUID="22B8-49D0" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="c7076d24-d43c-4fe9-95dd-958ffa481a48"
/dev/sda2: UUID="1c15f0ce-515c-49c4-8884-efef08243f70" TYPE="ext4" PARTUUID="0c1721d1-c7d2-40c3-b46b-e852ee593a9f"
/dev/sr0: UUID="2021-08-19-11-03-38-00" LABEL="Ubuntu 20.04.3 LTS amd64" TYPE="iso9660" PTUUID="2cf4ba3a" PTTYPE="dos"
/dev/loop0: TYPE="squashfs"
/dev/loop1: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
/dev/loop4: TYPE="squashfs"
/dev/loop5: TYPE="squashfs"

接続しているディスクの先頭に作られたパーティションにあるshimx64.efiを指していることが分かった。

そこで、空のディスクに差し替えてLive起動したらどうなるのか確かめた。
以前からトリムで利用させていただいているツール NHC の最新版をダウンロードしてきて、空のディスクを作ってみる。
(もっとも、2016年のバージョンで何の問題もなく動作しているのだけれど、訪問してみたら最新バージョンが置かれていたので、改めて)
eueeのおうち / NHC

空ディスクを作成するにあたり、アダプタのタイプ選択が表示された。
 IDE, Bus Logic, LSI Logic
ディスク自体はどれで作っても動作上は問題なさそうなので、ここではIDEを選択している。
VMware docs / SCSI、SATA、NVMe ストレージ コントローラの条件、制限事項、および互換性

この空ディスクをセットして、セキュアブートさせてみた。

$ sudo bootctl status
Couldn't find EFI system partition. It is recommended to mount it to /boot or /efi.
Alternatively, use --esp-path= to specify path to mount point.
System:
     Firmware: n/a (n/a)
  Secure Boot: enabled
   Setup Mode: user

Current Boot Loader:
      Product: n/a
     Features: ✗ Boot counting
               ✗ Menu timeout control
               ✗ One-shot menu timeout control
               ✗ Default entry control
               ✗ One-shot entry control
               ✗ Support for XBOOTLDR partition
               ✗ Support for passing random seed to OS
               ✗ Boot loader sets ESP partition information
          ESP: n/a
         File: └─n/a

Random Seed:
 Passed to OS: no
 System Token: not set

Boot Loaders Listed in EFI Variables:
        Title: ubuntu
           ID: 0x0003
       Status: active, boot-order
    Partition: /dev/disk/by-partuuid/c7076d24-d43c-4fe9-95dd-958ffa481a48
         File: └─/EFI/ubuntu/shimx64.efi

$ blkid
/dev/sr0: UUID="2021-08-19-11-03-38-00" LABEL="Ubuntu 20.04.3 LTS amd64" TYPE="iso9660" PTUUID="2cf4ba3a" PTTYPE="dos"

なるほど、Firmware設定画面に ubuntu という登録があったのを確認していたのだけれど、ESPにあるものが表示されているのか。

その他

インストールされたパッケージの表示

インストールされたパッケージの名前だけを表示してくれる。
Re: Listing only the package names with dpkg?

$ dpkg --get-selections | grep -v "deinstall" | cut -f1

パッケージの依存関係をみる

$ apt show <package-name>

宣言意味
Depends完全に依存する。
Recommends強い依存関係だけれども、絶対ではない。
Suggests存在するとこのパッケージを便利に使える、なくても問題ない。
Enhancesこのパッケージが、ここに書かれたパッケージの有用性を増す。Suggestsの反対に作用。
Pre-Dependsこのパッケージをインストールする前に、完全にインストールされている必要がある。
Debian ポリシーマニュアル Chapter 7 – パッケージ間の関連性の宣言

ディスクの構造

基本編を書いていたときのメモ…後で整理しようと思ったけれど、結局整理しきれなかった。

ISOを作っては試し、作っては試し…でも、どうにも上手く起動できない。学習せねば。
OSDev.org / ISO 9660
OSDev.org / El-Torito

作成するディスクはISO9660形式。

セクターサイズは2KiBとのこと。ハードディスクは何も指定しないと512Bだったので、4倍。

CDのセクター0x00~0x0Fはシステム領域として予約されており、ボリューム記述子が0x10から始まる。
El Toritoの起動は0x11にある起動レコードから始まり、ブートカタログを指し示す。
ブートレコードとブートカタログは、ISO9660を作成するソフトウェアによって作られる。

Legacyの場合、ブートカタログから読み込むべきブロックを読み取ってロードする。
EFIの場合はブートイメージをFATと解釈し、/EFI/BOOT/BOOTIA32.EFI(32ビットの場合)、/EFI/BOOT/BOOTX64.EFI(64ビットの場合)を探してロードする。
ハイブリッドなディスクを作ったとき、システムがLegacyの時にはMBRを読み込むけれども、EFIの場合には無視される。

キャラクタセットはa-charactersとd-charactersがあって、d-charactersは0~9、_、A~Zを表すらしい。
ファイル名はd-charactersに1つだけ . (dot) を入れて構成されるとのこと。

…と、説明を読み進めていくうちに気になったのが、Ubuntu 20.04 のインストールディスクに入っていた/boot/grub/efi.img。
-isohybrid-gpt-basdatオプションは、このファイルをGPTパーティションとしてアナウンスするらしい。
早速、このファイルをマウントして中身を確認してみたところ、このような内容であった。

$ ll efi.img 
-rw-rw-r-- 1 rohhie rohhie 4096000 12月  9 20:46 efi.img
$ sudo mount efi.img /mnt

mnt\
└ efi\
    └ boot\
        ├ bootx64.efi ← x86_64のブートローダー(x86の場合はBOOTIA32.EFI)
        ├ grubx64.efi ← セキュアブートなしの場合 Grub2を起動(セキュアブートの時はshimx64.efi)
        └ mmx64.efi   ← UEFIキーを管理するプログラム

※テスト環境のEFI/BOOTディレクトリにはfbx64.efiが保管指されていたが、これはbootx64.efiが何らかの理由で起動しない場合のフォールバックオプションだそう。

全く同じファイルがISOの\EFI\BOOTディレクトリに入っている…
そして、セキュアブートの環境でも問題なく起動してくる。どういうことなんだろう?

どうにもまだ、ディスクの構造やブートの仕組みを理解できていないけれども、起動するディスクができるようになったから割り切り。

さいごに

基本編をリリースしてから4ヶ月も掛かってしまった。その間にもやりたいことがあって、ちょいちょい記事をリリースしたりなんかして、気が付いてみたらこんな時期に。

個人で使う分にはこれで十分と思うけれども、業務で使おうと思ったら、もっとやることがたくさんある。
そうなったら、これをベースにちょいちょいと足していけばいいや、と思うのだった。

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他