LinuxヘッドレスLiveBoot(Ubuntu編)

VGAのない産業用ヘッドレスPC類に Linux系OSを組み込むのは割とよく行う。もっぱら CentOSをメインにしているのだが、時には諸事情やら比較検証用途やらで急遽 Ubuntuが必要になったりもする。そこでまあ Ubuntuベースのヘッドレス LiveBootを作っておくことにした。


    要件定義

    1. 対象機は x86_64(amd64)とする。
    2. VGAデバイスは物理的に搭載されていない。GUIも使用しない。よって起動する Ubuntuはコンソールベースとする。
    3. BIOSコンソールリダイレクト機能は対象機材でサポートされている。
    4. シリアルコンソールは baud=115.2kで接続する。1
    5. 成果物はISOイメージとし、CD-R/DVD-Rに焼いてUSB-ODDブート(USB光学ドライブ起動)できるものとする。通常は、再起動毎にあらゆる設定や痕跡は完全に忘却される。
    6. 他の Linuxマシンを必要とすることなく、一般的な Windowsマシンから既成のUSBインストーラを用いて、USBフラッシュドライブに変換できるものとする。この際 persistent領域を設定できなければならない。
    7. apt-get一式を備えている。追加したパッケージや設定は、persistent有効時は維持される。
    8. 既定のログインユーザ名は ubuntu とし、パスワードも無しとする。ゆえにパスワード無しで sudoできるものとする。(一般的なLiveBootの流儀)
    9. 既定のネットワーク設定・接続はオフとする。
    10. これらのパスワードやネットワーク設定は 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)


    1. USBシリアル変換は FTDI系を前提にしている。PL2303系(特にノーブランドのコピー品)は baud=115.2kでは通信異常が多発してトラブルのもとになる。

    2. ヘッドレスにしてディスクレスでもある。PXEBOOTなら USBメモリすら使わない完全ディスクレスだが、ネットワーク等の周辺環境規模が大きくなるので気軽にお試し出来るものではない。

    3. メインメモリは最低でも2GiB、標準的には8GiBは乗っているものとする。

    4. Ubuntu.com 14.xx以前はシリアルコンソール自体に対応していない。ローカルストレージインストールの場合は /etc/init/ttyS0.confを作成すれば一応使えるようになるが、LiveBootはこの設定を壊してしまうため、15.04とおなじ挙動をさせるにはかなりの修正が必要になるため、本稿では 14.xx対応については割愛した。

    5. Riava RS670A 基本スペックは Intel Gigabit NICx6を持つ Intel/Atom C2758 でメモリ8GiB。基本OSは CentOSまたは Ubuntu。SSD内蔵だがこれはここでは使用しない(壊さない)。なおフロントパネルのシリアルコンソールポート(COM0)は Cisco互換配線(Yost Serial Device Wiring Standard)になっている。

    6. Universal USB Installer

    7. Remote Serial Console HOWTO

    8. 最初に書いたほうが主コンソール /dev/consoleになり、そのデバイスは常に存在することが期待される。物理的にVGAを持たない機器では tty0なしの ttyS0だけでも実は良いのだが、シリアルポート未接続であったりシリアルポートドライバに問題がある場合は起動不能になる事態もありうる。そこで plymothを使うことでフレームバッファを用意し、tty0が必ず存在する状態をとすることで不具合を回避している。

    9. ただし memtest86+のフル機能がシリアルコンソールで使えるわけではない。configメニュー表示等に不具合があるため、設定変更が難しい。このためECC関係などのオプションはビルド時に修正しておかなければならない。シリアルコンソール対応memtest86+の作成については別項を参照のこと。

    10. 規定値でnosuid,nodev,noexecが指定されている。これらをremountで外しても良いが、最初から制限のかかっていない /rootや /homeを使うほうが手間がない。ただし後述の persistentモードが有効な場合、これらはRAMディスクではないので、mount -t tmpfs none /mnt といった具合に明示的に RAMディスクをマウントして使ったほうが良い。

    11. デフォルトの1行だけでも必要最小限のことはできるが、docker等いまどきのアプリケーションをフルに動かせるようにするには、これだけの行数が必要になる。

    12. MBRが壊れるのは、起動したUSBメモリ以外の内蔵ストレージがある場合でかつ /dev、/run等のマウントを忘れていた場合に発生する。

    13. ログファイルは単純な削除でも良いが、wtmpやlastlog等も区別なく初期化するために、ここではtruncateでゼロバイトに切り詰めている。

    14. ISOからコピーしたオリジナルのisolinux.cfgには最後にgfxbootにチェインする行があるが本稿では使わない(ISOLINUXをブートローダーとする)ためこれは必ず削除しなければ起動不能になる。

    15. gfxboot関係については、GRUB設定ごと割愛した。

    16. ただし kernel起動時に ip=frommedia をつけておかないと、ネットワーク設定は綺麗サッパリ無視されてしまうので気をつけよう。知らないと確実にハマる。

    17. persistentモードで起動しているときは当然マウントされているので削除したりdd初期化したりするのは論外だが、FAT32フォーマットの USBメモリで起動している場合はマウントしたまま mvコマンドでリネームすることはできてしまう。

    18. ISOイメージを生成する前に準備しておくとより効果的だろう。

    19. ブランクファイルを用意するのに ddコマンドがよく使われるが、バイト単位でのファイルサイズ指定は不得手なので truncateコマンドを使うほうが楽だし、そもそも動作が早い。あえて ddコマンドのオプションで 4GiB-1を表現するなら bs=$((2**16-1)) count=$((2**16+1)) となる。

    RECENT LINKS