VGAのない産業用ヘッドレスPC類に Linux系OSを組み込むのは割とよく行う。もっぱら CentOSをメインにしているのだが、時には諸事情やら比較検証用途やらで急遽 Ubuntuが必要になったりもする。そこでまあ Ubuntuベースのヘッドレス LiveBootを作っておくことにした。
要件定義
- 対象機は x86_64(amd64)とする。
- VGAデバイスは物理的に搭載されていない。GUIも使用しない。よって起動する Ubuntuはコンソールベースとする。
- BIOSコンソールリダイレクト機能は対象機材でサポートされている。
- シリアルコンソールは baud=115.2kで接続する。1
- 成果物はISOイメージとし、CD-R/DVD-Rに焼いてUSB-ODDブート(USB光学ドライブ起動)できるものとする。通常は、再起動毎にあらゆる設定や痕跡は完全に忘却される。
- 他の Linuxマシンを必要とすることなく、一般的な Windowsマシンから既成のUSBインストーラを用いて、USBフラッシュドライブに変換できるものとする。この際 persistent領域を設定できなければならない。
- apt-get一式を備えている。追加したパッケージや設定は、persistent有効時は維持される。
- 既定のログインユーザ名は ubuntu とし、パスワードも無しとする。ゆえにパスワード無しで sudoできるものとする。(一般的なLiveBootの流儀)
- 既定のネットワーク設定・接続はオフとする。
- これらのパスワードやネットワーク設定は persistent有効時には自由に設定変更して永続化することができ、再起動しても設定内容が失われてはならない。
要するに、KVMやDocker等の仮想マシン環境のそれと同様の感覚で、気軽に使用できる使い捨て環境の物理版2である。その仕様上基本的には RAMシステムとなり Swapは初期設定しない。従ってメインメモリは充分潤沢に搭載されているものとする。3
Ubuntu LiveCD Customization については こちらを参照 のこと。
以後は ubuntu-15.04-desktop-amd64.iso をベースにして話を進める。32bit版でも同様だが、14.xx LTS では本稿で解説している手法は使えない。4
なお製作時のリファレンス機材には Riava RS670A を使用した。5
シリアルコンソール対応のインストーラUSBフラッシュドライブを作る
まずはヘッドレス環境で使用できるUbuntuインストーラを作らなければならない。UbuntuのインストーラISOには Desktop版と Server版があり、後者には CLI(テキスト)インストール機能があるが、本稿では Desktop版のISOイメージをベースにする。
端的には、内蔵ストレージにテキストベースの Ubuntuをクリーンインストールして GRUBで起動するのであれば、Server版をベースにするのが筋だ。だが Server版のISOイメージは LiveBoot機能を持たないため、今回の目的では Desktop版ISOイメージから作り出すほうが楽なのである。
用意するのは Ubuntu Desktop 64-bit Install ISO ファイルと、FAT32でフォーマットした1GiB以上のUSBフラッシュドライブと、Universal USB Installer6だ。
Windowsマシンで USBインストーラを立ち上げ、ダウンロードしたISOイメージと書き込み先フラッシュドライブを指定して起動可能メディアを作成する。この時 persistent領域は指定しない(永続化しない)。
次にブートメニューを書き換えてシリアルコンソールが使えるようにする。この作業は原則として TeraPadや MIFESのようなテキストエディタで行うが、Windows Notepadでもできなくはない。フラッシュドライブに書き込まれた元ファイルは LF改行なので Notepadでは全部が1行に繋がってしまうが、ブートローダー(SYSLINUX)は CR+LF改行でも動作するので、Notepadでも以下のテンプレートにそのまま入れ替えてしまってもよい。
isolinux.cfg冒頭のシリアルポート設定7は、BIOSにコンソールリダイレクト機能が備わっている場合には必要ない。BIOSとブートローダーの両方で設定をしてしまうと、入出力がバッティングして表示が崩れたりキー入力に不具合が生じる。従って今回の場合はコメントアウトで記述しておくだけとする。
#serial 0 115200
#console 0
path
include menu.cfg
default vesamenu.c32
prompt 0
timeout 50
stdmenu.cfg からはスプラッシュ画像や表示色の設定をごっそり削る。またブートメニューが 80x24程度に収まるよう、vshift等を調整する。
menu vshift 4
menu rows 10
menu helpmsgrow 15
menu cmdlinerow 16
menu timeoutrow 16
menu tabmsgrow 18
menu tabmsg Press ENTER to boot or TAB to edit a menu entry
txt.cfgのカーネルオプション行には、BIOSからカーネルに制御が渡った後のシリアルコンソール設定 console=tty0 console=ttyS0,115200n8
を追記する。またLiveCD機能による自動ネットワーク構成が勝手に動かないよう ip=frommedia
も必ず設定する。そしてこの段階では GUIと Ubuntuインストーラの起動をスキップしてシェルに落ちるための singleを指定しておく。
menu title Ubuntu Console boot menu
default live
label live
menu label ^Try Ubuntu Console
kernel /casper/vmlinuz.efi
append file=/cdrom/preseed/ubuntu.seed boot=casper cdrom-detect/try-usb=true noprompt floppy.allowed_drive_mask=0 ignore_uuid initrd=/casper/initrd.lz ip=frommedia console=tty0 console=ttyS0,115200n8 single ---
label memtest
menu label Test ^memory
kernel /install/mt86plus
append console=ttyS0,115200n8
label hd
menu label ^Boot from first hard disk
localboot 0x80
追加された kernel起動パラメータは以下の意味を持つ。
- boot=casper
casperによるブートシーケンス(LiveBoot)を実行する。 - cdrom-detect/try-usb=true
USBメモリブートデバイスを CDROMと同等に扱う。 - floppy.allowed_drive_mask=0
フロッピーデバイスを無視する。 - ignore_uuid
ブートメディアのUUIDをチェックしない。 - ip=frommedia
ブートメディアの /etc/network/interfaces 設定を有効にする。 - console=tty0
tty0をコンソール入出力に使用する。tty0は一般に VGA表示デバイスやフレームバッファである。 - console=ttyS0,115200n8
ttyS0をコンソール入出力に使用する。ttyS0は一般に第一シリアルポート。通信要件は baud=115200、パリティなし、8bit幅とする。このふたつのconsole指定は、両方書く場合はこの順番(tty0、ttyS0)で書かなければならない。8 - single
シングルモードで起動する。ここでは Ubuntuインストーラを起動させないために指定する。
なおインストールイメージに含まれる memtest86+(mt86plus)は、シリアルコンソールに対応していない。通常のVGA表示に加えてBIOSコンソール表示もするようにリビルドしたバイナリと差し替えておくと便利だ。9
rootfsを作成する
上記のUSBメモリで起動し Try Ubuntu Consoleを実行するとシングルユーザモードのbashシェルが起動する。まずは dhclientを起動したり、あるいは ifconfigと routeを叩くなりしてインターネットへ接続できるようにしよう。またロケール変数もセットする。
dhclient eth0
LANG=C
現在起動しているこの環境は RAMシステムのため、8GiBの物理メモリを積んでいるなら 4GiB容量の RAMディスクが使える。これから作る rootfsは 2GiBも余裕があれば充分なので、/root以下を作業領域とする。なお /tmpは tmpfsマウント時のオプションのせいでそのままでは使用できない10。RAM容量が足りない場合には Ext4フォーマットした別の USBメモリや外付けHDD等を作業領域に使おう。
新しい rootfsは debootstrapパッケージを利用して作成する。さらにそれを LiveBootで使えるようにするために squashfs-toolsパッケージを用いるので、これらをインストールする。
apt-get install debootstrap squashfs-tools
構築する Ubuntuのコードネームと CPUアーキテクチャは USBメモリから起動したそれと同じものとするが、これらは以下のコマンドで確認できる。
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 15.04
Release: 15.04
Codename: vivid
dpkg --print-architecture
amd64
lsb_releaseコマンドが参照している実体は/etc/lsb-release
なので、これをsourceコマンドで読めば環境変数で参照できるようになる。
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.04
DISTRIB_CODENAME=vivid
DISTRIB_DESCRIPTION="Ubuntu 15.04"
source /etc/lsb-release
echo $DISTRIB_CODENAME
vivid
これらを debootstrapコマンドの引数に記述してミニマムな新規 rootfsを構築する。
source /etc/lsb-release
mkdir newroot
debootstrap --arch $(dpkg --print-architecture) \
$DISTRIB_CODENAME newroot http://archive.ubuntu.com/ubuntu
rootfsの環境設定
構築された rootfsは上記のコマンドだけで、すでに chrootして一応 apt-getも実行できる状態になっているが、kernelはまだインストールされていない。そこでこれらを行う前の準備として /proc、/dev、/run を rootfs内にマウントする。またデフォルトロケールとタイムゾーンをセットする。
mount -o bind /proc/ newroot/proc/
mount -o bind /dev/ newroot/dev/
mount -o bind /run/ newroot/run/
chroot newroot/ /usr/sbin/locale-gen en_US.UTF-8
chroot newroot/ /usr/sbin/update-locale LANG=en_US.UTF-8
chroot newroot/ /usr/sbin/dpkg-reconfigure locales
chroot newroot/ /usr/bin/timedatectl set-timezone Asia/Tokyo
さらに aptが参照する newroot/etc/apt/sources.list
には必要最小限の1行しか書かれていないので、これを以下の内容に書き換える。11
deb http://jp.archive.ubuntu.com/ubuntu/ vivid main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid main restricted
deb http://jp.archive.ubuntu.com/ubuntu/ vivid-updates main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid-updates main restricted
deb http://jp.archive.ubuntu.com/ubuntu/ vivid universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid universe
deb http://jp.archive.ubuntu.com/ubuntu/ vivid-updates universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid-updates universe
deb http://jp.archive.ubuntu.com/ubuntu/ vivid multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid multiverse
deb http://jp.archive.ubuntu.com/ubuntu/ vivid-updates multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid-updates multiverse
deb http://jp.archive.ubuntu.com/ubuntu/ vivid-backports main restricted universe multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ vivid-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu vivid-security main restricted
deb-src http://security.ubuntu.com/ubuntu vivid-security main restricted
deb http://security.ubuntu.com/ubuntu vivid-security universe
deb-src http://security.ubuntu.com/ubuntu vivid-security universe
deb http://security.ubuntu.com/ubuntu vivid-security multiverse
deb-src http://security.ubuntu.com/ubuntu vivid-security multiverse
次に LiveBoot専用の管理者ユーザ ubuntuおよびグループを作成し、パスワードなしでログイン出来るようにする。さらにrootアカウントでは直接ログイン出来ないようにロックしておく。このユーザ名は LiveBoot機能を提供している casperモジュールの設定に合わせたものだ。むろんそれぞれに任意のパスワードを設定しても構わない。(それを忘れたりしなければ)
chroot newroot/ /usr/sbin/addgroup --system --gid=999 ubuntu
chroot newroot/ /usr/sbin/useradd -s /bin/bash -g ubuntu --uid=999 -m -k /dev/null ubuntu
chroot newroot/ /usr/bin/passwd -d ubuntu
chroot newroot/ /usr/sbin/usermod -L root
内蔵ストレージに直接起動可能な rootfsをインストールする場合は、この時点で/etc/fstab
を作成しなければならないが、LiveBootではこれが起動中に動的に作成・設定されるため、必要ない。
以上の環境設定が済んだら、apt-getで update/upgradeを行って chroot環境を更新する。
chroot newroot/ /usr/bin/apt-get update
chroot newroot/ /usr/bin/apt-get upgrade
Linux kernelモジュールの組み込み
いよいよ rootfs内に kernelモジュールをインストールするのだが、その前に現在起動中の USBメモリ(この例では/dev/sda)の MBRセクタを一応バックアップしておく。kernelインストール中に grub-pcセットアップが走るのだが、このとき MBRが上書きされてリブート不能12になるのを避けるためだ。なおインストールする kernelパッケージ名は 64bitと 32bitでは異なる。
dd if=/dev/sda of=mbr count=1
chroot newroot/ /usr/bin/apt-get install linux-signed-image-$(uname -r)
chroot newroot/ /usr/bin/apt-get install linux-image-$(uname -r)
grub-pcセットアップは Continue without installing GRUB?を選んで何もせずに抜ける。そして忘れないうちにバックアップしておいた MBRを書き戻す。
dd if=mbr of=/dev/sda
続いてその他のパッケージを追加インストールし、整合性を確認したのち、パッケージキャッシュを削除する。少なくとも plymouth
はインストールが必要である。
chroot newroot/ /usr/bin/apt-get install plymouth squashfs-tools openssh-client
chroot newroot/ /usr/bin/apt-get -f install
chroot newroot/ /usr/bin/apt-get upgrade
chroot newroot/ /usr/bin/apt-get autoremove
chroot newroot/ /usr/bin/apt-get clean
最後に newroot/var以下のクリーニング13と、newroot/bootから kernelとinitrdの削除する。LiveBootではブートデバイスの casper
ディレクトリにある kernelとinitrdをそのまま使用するのでこれらの容量を節約する。
find newroot/var/log -type f -exec truncate -s 0 {} \;
find newroot/var/cache -name \*-old -delete
rm -fr newroot/var/lib/apt/lists/*
rm -f newroot/boot/vmlinuz-* newroot/boot/initrd.img-*
以上で rootfsの構築は完了したのだが、作業時にマウントした /proc、/dev、/run がアンマウントできない場合がある。その際は lsofコマンドで掴んでいるプロセス探して killすればよい。正しくアンマウントできていれば duコマンドで使用容量が把握できる。
lsof | grep newroot
kill <PID>
unmount newroot/run
unmount newroot/dev
unmount newroot/proc
du -sh newroot/
420M newroot/
filesystem.squashfs ファイルの作成
構築した rootfsを mksquashfsコマンドで圧縮する。このファイルはUSBメモリの /casperディレクトリに格納するが、これは /cdrom/casper
として見ることが出来る。ただし /cdrom
(USBメモリ)は roマウントされていてそのままでは書き込めないため、rwオプションでリマウントする。またそこにある filesystem.squashfs
はいままさに /rofs
にマウントして使われているため、直接上書きしてはならない。そこで別のファイル名で保存しておく。またこの rootfs全体のブロックサイズも保存しておく。
mount -o rw,remount /cdrom
mksquashfs newroot /cdrom/casper/filesystem.squashfs.newroot
printf $(du -s --block-size=1 newroot | cut -f1) > /cdrom/casper/filesystem.size.newroot
ちなみに mksquashfs
で作成したファイルは unsquashfs
コマンドで展開することが出来る。
unsquashfs -d expand-root /cdrom/casper/filesystem.squashfs
ls expand-root/
bin dev home lib media opt root sbin sys usr vmlinuz
boot etc initrd.img lib64 mnt proc run srv tmp var
新 rootfs での起動テスト
これらの作業を終えたら poweroff(shutdown -h)して、USBメモリを Windowsマシンに戻して以下の修正を行う。
- 既存の /casper/filesystem.squashfs を filesystem.squashfs.org にリネーム
- /casper/filesystem.squashfs.newroot を filesystem.squashfs にリネーム
- 同様に filesystem.size も差し替える。
- /isolinux/txt.cfg の append行からキーワード single を削除する。
この新たな環境での LiveBoot起動に失敗した場合は、上記の逆の手順でインストーライメージのシングルモードに戻す。そして unsquashfsコマンドで rootfsを展開して修正することを繰り返す。
新たな LiveBootが正しく起動してログイン・プロンプトが現れたら、ユーザ名 ubuntu(パスワード無し)でコンソールに入れるはずだ。また sudo -s
で rootシェルになれる。
ISOイメージを作成する
こうして作成した filesystem.squashfsと、ブートメニューファイルを差し替えた ISOイメージを作成する。
まずベースになる Desktop版ISOイメージをローカルに展開する。これはODD(光学ドライブ)から読みだしても良いし、フラッシュドライブにISOイメージをコピーしておいて loopbackマウントで読みだしても良い。コピーしたファイルは書き込み不可となっているので chmod
コマンドでパーミッションを変更する。
cd /tmp
mkdir loop
sudo mount -o loop ubuntu-15.04-desktop-amd64.iso loop/
mount: /dev/loop2 is write-protected, mounting read-only
cp -r loop files
sudo umount loop
chmod -R +w ./files
ls files/
autorun.inf casper EFI isolinux pics preseed ubuntu
boot dists install md5sum.txt pool README.diskdefines wubi.exe
現在起動している filesystem.squashfsは /cdrom/casper/
以下に見えているのでこれをコピーする。
cat /cdrom/casper/filesystem.squashfs > files/casper/filesystem.squashfs
isolinux/isolinux.cfg14や stdmenu.cfgについては前に上げたのと同じなので割愛する。新しい ODDブート用の isolinux/txt.cg は以下のように記述する。
menu title Ubuntu Console boot menu
default live
label live
menu label ^Try Ubuntu Console
kernel /casper/vmlinuz.efi
append file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.lz quiet ip=frommedia console=tty0 console=ttyS0,115200n8 ---
label check
menu label ^Check disc for defects
kernel /casper/vmlinuz.efi
append boot=casper integrity-check initrd=/casper/initrd.lz quiet console=tty0 console=ttyS0,115200n8 ---
label memtest
menu label Test ^memory
kernel /install/mt86plus
append console=ttyS0,115200n8
label hd
menu label ^Boot from first hard disk
localboot 0x80
md5sum.txtは2番目の起動選択 Check disc for defectsを選んだ際に参照される改竄チェックファイルだ。単純にこのファイルをゼロバイトに切り詰めれば何もチェックされない。一方この機能を活かしたい場合、チェックファイルを作成した後に md5sumが変わってしまうファイル、すなわち md5sum.txt自身と mkisofsコマンドが作成・更新する boot.cat、isolinux.bin はチェックリストから除外しておかなければならない。
pushd ./files
rm -f md5sum.txt isolinux/boot.cat
find . -type f -print | xargs md5sum | grep -v isolinux.bin > ../md5sum.txt
mv ../md5sum.txt .
popd
ISOイメージを作成する mkisofsコマンドは、同名のパッケージでインストールできる。
sudo apt-get install mkisofs
mkisofsコマンドの引数15のうち -b(ブートローダーファイル)と-c(カタログファイル)は構築対象ディレクトリを基準とした場合のパス指定になるので注意しよう。また出力する ISOファイルは、先に上げた USBインストーラを使用する場合はその制限によりファイル名中に desktopの文字列が入っていなければならない。ともかく指定するオプションが多いのでシェルスクリプトにしておいたほうがコードの再利用と修正はしやすい。
find ./files -print | xargs touch -m {} ¥;
LANG=C mkisofs -r -J -l \
-V UBUNTU64 \
-cache-inodes \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-o ubuntu-15.04-desktopless-amd64.iso \
./files
ls -la ubuntu-15.04-desktop*
-rwxr--r-- 1 ubuntu ubuntu 1150844928 Jun 17 16:59 ubuntu-15.04-desktop-amd64.iso
-rw-rw-r-- 1 ubuntu ubuntu 238929920 Jun 17 17:25 ubuntu-15.04-desktopless-amd64.iso
出来上がった ISOイメージはフラッシュドライブや NASなどにコピーして保存しておこう。
CD-RW/DVD-RWに ISOイメージを焼く
前項で作成したISOイメージを Linuxで CD-RW/DVD-RWメディアに焼くには以下のようにする。
まずライティングソフトとして wodimパッケージをインストールする。
sudo apt-get install wodim
USB-ODDは、おそらく /dev/sr0 等に見えるだろう。wodimコマンドの -scanbus
オプションは SCSIバス以外には機能しないので、dmesgでデバイスノードを確認する。
sudo wodim dev=/dev/sr0 --devices
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/sr0' rwrw-- : 'Slimtype' 'eTAU108 1'
-------------------------------------------------------------------------
CD-RW/DVD-RWメディアをブランク消去するには wodimコマンドの blankオプションを使う。
sudo wodim dev=/dev/sr0 blank=fast
wodimコマンドにISOイメージファイルを与えると、それを指定のドライブに焼きこむ。
sudo wodim -sao -eject dev=/dev/sr0 ubuntu-15.04-desktopless-amd64.iso
persistentモードを設定する
前述の ISOイメージ/光学メディアで ODDブートが正常に行えたなら、次はその ISOイメージを USBインストーラでもって、今度は persistentモードを設定した USBメモリを作成しよう。
persistentモードが有効な USBメモリは、kernel起動オプションに persistentが加わり、USBメモリのルートに casper-rw
というファイルが作成される。このファイルの実体は overlayfsを用いて /
に重ねられた ext4フォーマットの loopbackマウントファイルだ。/rofs
にマウントされた filesystem.squashfsとの変更差分は、この casper-rw
に記録されるようになる。
df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 798M 8.6M 789M 2% /run
/dev/sda vfat 2.0G 1.5G 468M 76% /cdrom
/dev/loop0 squashfs 182M 182M 0 100% /rofs
/cow overlay 976M 14M 895M 2% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs tmpfs 3.9G 0 3.9G 0% /tmp
tmpfs tmpfs 798M 0 798M 0% /run/user/999
persistentモードが正しく効いているかどうかは、更新したログインパスワードやネットワーク設定が再起動しても正しく機能するか否かで容易にわかる。例えばrootアカウントでログイン可能にし、ubuntuアカウントを無効にして新たにadminユーザを作成し、rootとadminにパスワードを設定してみよう。
sudo -s
usermod -U root
passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
usermod -L ubuntu
addgroup --system admin
Adding group `admin' (GID 112) ...
Done.
useradd -s /bin/bash -g admin -m -k /dev/null admin
passwd admin
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
/etc/network/interfaces に記述したネットワーク設定も persistentモードでなら起動時に反映される。16
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.240.135
network 192.168.240.0
netmask 255.255.255.0
broadcast 192.168.240.255
gateway 192.168.240.1
dns-nameservers 192.168.240.1 8.8.8.8 8.8.4.4
auto eth4
iface eth4 inet dhcp
persistentモードで記録された内容を無視してデフォルト状態で起動するには、ブートメニューの起動ラベル選択時に persistent
ラベルを取り除けば良い。あるいは casper-rwファイルをリネームして再起動してしまう。17
cd /cdrom
mv casper-rw casper-rw.bak
reboot
新たな(まっさらの)1GiBの casper-rwファイルは Linux上では以下の手順で作成できる。また事のついでなので、Windows上からもこのファイルを容易に置き換えられるように、フォーマットしたばかりの casper-rwファイルを zipコマンドで圧縮バックアップしておくと、USBインストーラを使わなくても最初期化できるので、いざというとき何かと便利だ。18
cd /cdrom
rm -f casper-rw.bak
truncate -s $((2**30)) casper-rw
ls -l casper-rw
-rwxr-xr-x 1 root root 1073741824 Jun 18 13:11 casper-rw
mkfs.ext4 -L casper-rw casper-rw
apt-get install zip
zip casper-rw.zip casper-rw
なお FAT32での最大のファイルサイズは 4GiB-1バイトなので、truncateコマンドでの容量指定は$((2**32-1))
となる。19
ダウンロード
ubuntu-15.04-desktopless-amd64-20150703.iso 174MiB (md5sum)
USBシリアル変換は FTDI系を前提にしている。PL2303系(特にノーブランドのコピー品)は baud=115.2kでは通信異常が多発してトラブルのもとになる。 ↩
ヘッドレスにしてディスクレスでもある。PXEBOOTなら USBメモリすら使わない完全ディスクレスだが、ネットワーク等の周辺環境規模が大きくなるので気軽にお試し出来るものではない。 ↩
メインメモリは最低でも2GiB、標準的には8GiBは乗っているものとする。 ↩
Ubuntu.com 14.xx以前はシリアルコンソール自体に対応していない。ローカルストレージインストールの場合は /etc/init/ttyS0.confを作成すれば一応使えるようになるが、LiveBootはこの設定を壊してしまうため、15.04とおなじ挙動をさせるにはかなりの修正が必要になるため、本稿では 14.xx対応については割愛した。 ↩
Riava RS670A 基本スペックは Intel Gigabit NICx6を持つ Intel/Atom C2758 でメモリ8GiB。基本OSは CentOSまたは Ubuntu。SSD内蔵だがこれはここでは使用しない(壊さない)。なおフロントパネルのシリアルコンソールポート(COM0)は Cisco互換配線(Yost Serial Device Wiring Standard)になっている。 ↩
最初に書いたほうが主コンソール /dev/consoleになり、そのデバイスは常に存在することが期待される。物理的にVGAを持たない機器では tty0なしの ttyS0だけでも実は良いのだが、シリアルポート未接続であったりシリアルポートドライバに問題がある場合は起動不能になる事態もありうる。そこで plymothを使うことでフレームバッファを用意し、tty0が必ず存在する状態をとすることで不具合を回避している。 ↩
ただし memtest86+のフル機能がシリアルコンソールで使えるわけではない。configメニュー表示等に不具合があるため、設定変更が難しい。このためECC関係などのオプションはビルド時に修正しておかなければならない。シリアルコンソール対応memtest86+の作成については別項を参照のこと。 ↩
規定値でnosuid,nodev,noexecが指定されている。これらをremountで外しても良いが、最初から制限のかかっていない /rootや /homeを使うほうが手間がない。ただし後述の persistentモードが有効な場合、これらはRAMディスクではないので、mount -t tmpfs none /mnt といった具合に明示的に RAMディスクをマウントして使ったほうが良い。 ↩
デフォルトの1行だけでも必要最小限のことはできるが、docker等いまどきのアプリケーションをフルに動かせるようにするには、これだけの行数が必要になる。 ↩
MBRが壊れるのは、起動したUSBメモリ以外の内蔵ストレージがある場合でかつ /dev、/run等のマウントを忘れていた場合に発生する。 ↩
ログファイルは単純な削除でも良いが、wtmpやlastlog等も区別なく初期化するために、ここではtruncateでゼロバイトに切り詰めている。 ↩
ISOからコピーしたオリジナルのisolinux.cfgには最後にgfxbootにチェインする行があるが本稿では使わない(ISOLINUXをブートローダーとする)ためこれは必ず削除しなければ起動不能になる。 ↩
gfxboot関係については、GRUB設定ごと割愛した。 ↩
ただし kernel起動時に ip=frommedia をつけておかないと、ネットワーク設定は綺麗サッパリ無視されてしまうので気をつけよう。知らないと確実にハマる。 ↩
persistentモードで起動しているときは当然マウントされているので削除したりdd初期化したりするのは論外だが、FAT32フォーマットの USBメモリで起動している場合はマウントしたまま mvコマンドでリネームすることはできてしまう。 ↩
ISOイメージを生成する前に準備しておくとより効果的だろう。 ↩
ブランクファイルを用意するのに ddコマンドがよく使われるが、バイト単位でのファイルサイズ指定は不得手なので truncateコマンドを使うほうが楽だし、そもそも動作が早い。あえて ddコマンドのオプションで 4GiB-1を表現するなら bs=$((2**16-1)) count=$((2**16+1)) となる。 ↩