読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

CoreLinux 6.3 を VIRL に登録する

Cisco Linux Network VIRL

Tiny Core Linux はフットプリントが非常に小さい Linux ディストリビューションで、Cisco VIRL のような仮想化された検証環境内で複数インスタンスを立ち上げても軽快に動作する、という特徴があります。用途に応じて幾つかの種類があります。参考として記載したサイズは 6.3 用 ISO イメージのサイズです。

  1. Core
    • 9MB 程度。CLI だけの、最小環境での利用を想定。
  2. TinyCore
    • 15MB 程度。GUI(X)を含む。
  3. CorePlus
    • 84MB 程度。TinyCore に様々なパッケージを追加している。

追加パッケージも数多く提供されているので Core をベースにパッケージを追加し、カスタマイズしていくのも簡単です。今回は Core を VIRL に登録してみます。

完成イメージ

今回、作成するイメージは以下からダウンロード出来ます。

詳細は以下の通りです。

  • ログイン情報は以下の通り(username / password)
    • tc / password
    • root / password
  • 以下のパッケージをインストール済み
  • TELNET サーバ有効化済み
  • SSH サーバ有効化済み

作業環境

以下の環境で作業しました。

  • Ubuntu 14.04.3 LTS(64bit)
    • KVM インストール済み

Core の起動

qcow2 形式で仮想マシンのイメージを作成します。

qemu-img create -f qcow2 Core-6.3.img 1G

Core のイメージを起動します。今回は作業時に OS X から VNC 接続したのですが、OS X の標準 VNC クライアントはパスワード無し接続が出来ないようなので、VNC にパスワードを設定します。また、後の手順で登場しますが、インストール作業を効率化する際に TELNET 接続を使いますので、ホストマシンの 40023/TCP をゲスト(Coroe)の 23/TCP にリダイレクトしています。

qemu-system-i386 \
-m 1024 \
-enable-kvm \
-net nic,model=virtio -net user,vlan=0 \
-vnc :1,password \
-monitor stdio \
-k ja \
-redir tcp:40023::23 \
-boot d -cdrom Core-6.3.iso \
Core-6.3.img

QEMU のコンソールから change vnc password を実行して VNC 接続用のパスワードを設定します。

QEMU 2.0.0 monitor - type 'help' for more information
(qemu) change vnc password
Password: ***
(qemu)

作業端末(OS X)の標準 VNC クライアントを起動し、Core のコンソールに接続します。Core は「vnc :1」オプションを指定したので、「5,900 + 1 = 5,901」が VNC の待ち受けポートになります。ですので、ホストである Ubuntu のアドレスが 192.168.1.1 なら標準 VNC クライアントからは「vnc://192.168.1.1:5901」と指定することになります。余談ですが、OS XYosemite)で VNC 接続をする為に「サーバへ接続する」を呼び出すショートカットは「command + K」です。

TELNET サーバの有効化

作業を効率化する為にコマンドはコピー&ペーストしたいので、VNC クライアントではクリップボード共有が出来ませんでした。そこで作業用に TELNET サーバを有効化します。以降は基本的に Core のコンソールでコマンドを実行します。

tce-load -wi inetutils-servers.tcz

/etc/inetd.conf を以下の内容で新規作成します。/etc 配下にあるので、新規作成する際は sudo vi /etc/inetd.conf する必要があります。

telnet stream tcp nowait root /usr/local/sbin/telnetd telnetd

inetd 経由で TELNET サーバを起動します。

sudo /usr/sbin/inetd

外部の PC から TLENET すると、Core に接続出来るはずです。下記は(Core では無く)作業用 PC から Ubuntu の 40023/TCPTELNET した結果です。リダイレクトされ、Core に TELNET 出来ています。

$ telnet 192.168.1.1 40023
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.

Linux 3.16.6-tinycore (10.99.99.99) (pts/0)

box login: tc
 (�-
 //\   Core is distributed with ABSOLUTELY NO WARRANTY.
 v_/_           www.tinycorelinux.com

tc@box:~$

インストール

インストールは「パーティションを設定する、ファイルシステムを作成する、パッケージを入れる…」と手動で実行していく方法もあるのですが、簡略化する為に tc-install を使います。tc-install を使えば対話的にインストール出来ますので、大幅に手間が削減出来ます。Core でパッケージを追加するには tce-load を使います。

tce-load -wil tc-install
sudo tc-install.sh

これでインストーラが開始されるはずです。「c」を選択し、マウントしている Core の CD-ROM(ISO イメージ)からインストールを開始します。

Core Installation.

Install from [R]unning OS, from booted [C]drom, or from [I]so file. (r/c/i):

インストールの種類を聞かれます。「f」を入力し、Frugal インストールにします。

Select install type for /mnt/sr0/boot/core.gz

Frugal
* Use for frugal hard drive installations.
Note: You will be prompted for disk/partion and formatting options.

HDD
* Use for pendrives. Your BIOS must support USB-HDD booting.
* A single FAT partition will be made.
Note: Requires dosfstools extension.
Warning: This is a whole drive installation!

Zip
* Use for pendrives. Drive will be formatted into two FAT partitions.
* One small one for USB_ZIP boot compatibility, and used to hold Tiny Core.
* The remaining partition will be used for backup & extensions.
Note: Requires dosfstools and perl extensions.
Warning: This is a whole drive installation!

Select Install type [F]rugal, [H]DD, [Z]ip. (f/h/z):

インストールのターゲットを選択します。今回は仮想マシン用に確保したディスク(の、イメージ)をパーティショニングせず、丸ごと利用しまいすので「1」を入力し、Whole Disk を指定します。

Select Target for Installation of core

	 1. Whole Disk
	 2. Partition

Enter selection ( 1 - 2 ) or (q)uit:

インストールするディスクを選択します。「2」の sda を選択します。

Select disk for core

	 1. fd0
	 2. sda
	 3. sr0

Enter selection ( 1 - 3 ) or (q)uit:

ブートローダをインストールするか?確認されます。「y」を入力し、ブートローダをインストールします。

Would you like to install a bootloader?
Most people should answer yes unless they are trying to embed Core in to
a different Linux distribution with an existing bootloader.

Enter selection ( y, n ) or (q)uit:

選択したディスク(今回は sda)のフォーマット形式を指定します。検証環境でインスタンスを作る / 壊すを繰り返すのでジャーナル等、高度な機能は不要です。よって、「1」を入力して ext2 を選択しました。

Select Formatting Option for sda

	 1. ext2
	 2. ext3
	 3. ext4
	 4. vfat

Enter selection ( 1 - 4 ) or (q)uit:

起動オプションを指定します。特に何も入力せず、エンターを押して次に進みます。

Enter space separated boot options:
Example: vga=normal syslog showapps waitusb=5

続行するか?の最終確認を求められます。「y」を入力して、インストール作業を続行します。

Last chance to exit before destroying all data on sda
Continue (y/..)?

インストール作業が開始されます。

Writing zero's to beginning of /dev/sda
Partitioning /dev/sda

/dev/sda:
Formatting /dev/sda1
mke2fs 1.42.12 (29-Aug-2014)
0+1 records in
0+1 records out
440 bytes (440B) copied, 0.005231 seconds, 82.1KB/s
UUID="bd1168c8-f3b6-4763-a4cd-8a803755b3a4"
Applying extlinux.
/mnt/drive/tce/boot/extlinux is device /dev/sda1
Setting up core image on /mnt/sda1
Installation has completed
Press Enter key to continue.

これでインストール作業は完了です。一旦、シャットダウンします。

sync ; sync ; sync ; sudo poweroff

Core の再起動

ISO イメージからでは無く、ローカルディスクから起動し直してパッケージの追加等を実施していきます。まずは Core を(ISO イメージからでは無く)ディスクイメージから再起動します。

qemu-system-i386 \
-m 1024 \
-enable-kvm \
-net nic,model=virtio -net user,vlan=0 \
-vnc :1,password \
-monitor stdio \
-k ja \
-redir tcp:40023::23 \
Core-6.3.img

TELNET サーバの有効化

作業を効率化する為、先程と同様に TELNET サーバを有効化しておきます。

tce-load -wi inetutils-servers.tcz

/etc/inetd.conf を以下の内容で新規作成します。先程と同じ内容です。

telnet stream tcp nowait root /usr/local/sbin/telnetd telnetd

TELNET サーバを起動します。

sudo /usr/sbin/inetd

作業用 PC から TELNET します。Core の起動時に TELNET サーバが自動起動されるよう、/opt/bootlocal.sh を修正します。このファイルに書かれたコマンドは Core の起動時に実行されます。

echo "/usr/sbin/inetd" >> /opt/bootlocal.sh

但し上述の通り、/opt/bootlocal.sh を修正しても Core を再起動すると修正は失われ、初期状態に戻ってしまいます。再起動後も修正が残るようにする(永続化する)には filetool.sh -b を実行します。これで再起動後も修正内容が残ります。

filetool.sh -b

パッケージの追加

使いそうなパッケージを追加します。

tce-load -wi \
bash \
iperf3 \
iproute2 \
nmap \
openssh \
tcpdump \
python

vimX.org に依存しているようです。

$ cat vim.tcz.dep
ncurses.tcz
Xorg-7.7-lib.tcz

X.org がインストールされても良ければ vim もインストールしておきます。

tce-load -wi vim

ログインシェルの変更

bash をインストールしたので、ログインシェルを変更しておきます。/etc/passwd はデフォルトで以下のようになっていました。

root:x:0:0:root:/root:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/false
tc:x:1001:50:Linux User,,,:/home/tc:/bin/sh

シェルを変更します。

root:x:0:0:root:/root:/bin/bash
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/false
tc:x:1001:50:Linux User,,,:/home/tc:/bin/bash

変更を永続化しておきます。

echo /etc/passwd >> /opt/.filetool.lst
filetool.sh -b

SSH サーバの有効化

起動時に SSH サーバが自動起動されるように設定します。

echo "/usr/local/etc/init.d/openssh start" >> /opt/bootlocal.sh
filetool.sh -b

SSH 経由でログイン出来るよう、ユーザにパスワードを設定しておきます。今回は tc と root のいずれもパスワードは「password」としました。

sudo passwd tc
sudo passwd root

/etc/shadow も永続化しておきます。

echo /etc/shadow >> /opt/.filetool.lst
filetool.sh -b

コンソール有効化

いちいち VNC 接続しなければならないのは面倒なので、コンソールを有効化しておきます。Linux カーネルの起動オプションは /mnt/sda1/tce/boot/extlinux/extlinux.conf で定義されており、デフォルトでは以下の通りです(UUID 値は除く)。

DEFAULT core
LABEL core
KERNEL /tce/boot/vmlinuz
APPEND initrd=/tce/boot/core.gz quiet  waitusb=5:UUID="bd1168c8-f3b6-4763-a4cd-8a803755b3a4" tce=UUID="bd1168c8-f3b6-4763-a4cd-8a803755b3a4"

これを以下のように変更し、ttyS0 を有効化します(KERNEL 行にオプションを付与します)。

DEFAULT core
LABEL core
KERNEL /tce/boot/vmlinuz console=ttyS0,115200n8
APPEND initrd=/tce/boot/core.gz quiet

設定ファイルの微修正

Core では設定ファイルの修正等は保持されず、都度、初期化されます。具体的には起動する毎に /mnt/sda1/tce/boot/core.gz が展開されることで /etc 等が再構築(=初期化)されるようです。つまり、/mnt/sda1/tce/boot/core.gz をカスタマイズすることで起動時の /etc を修正することが出来ます。まず、/mnt/sda1/tce/boot/core.gz を作業用ディレクトリに展開します。

mkdir -p /home/tc/temp/extract
sudo cp /mnt/sda1/tce/boot/core.gz /home/tc/temp/
cd /home/tc/temp/extract/
zcat ../core.gz | sudo cpio -i -H newc -d

展開されたファイル・ディレクトリは以下の通りです。

$ ls /home/tc/temp/extract/
bin/     etc/     init     linuxrc  opt/     root/    sbin/    tmp/     var/
dev/     home/    lib/     mnt/     proc/    run/     sys/     usr/

まず、コンソールの設定を修正します。/home/tc/temp/extract/etc/inittab を以下の方針で修正します。

  1. 自動ログイン(/sbin/autologin)の無効化
  2. tty1 のスピードを修正
  3. ttyS0 を追加

コンソールへの自動ログインは非常に便利なのですが、自動ログインを有効化しているとなぜか起動時にシステムがハングアップしてしまうことがあるようです(※ 実際、自動ログインを有効化したイメージを VIRL 上で利用している際に、何度もハングアップしました。定かではありませんが、Core の起動後にしばらくログインせずに放っておくとハングアップするように感じました)。よって、自動ログインは無効化しておきます。具体的には以下のように修正します。

#tty1::respawn:/sbin/getty -nl /sbin/autologin 38400 tty1
tty1::respawn:/sbin/getty 115200 tty1
ttyS0::respawn:/sbin/getty 115200 ttyS0

ttyS0 からコンソールログイン出来るように /home/tc/temp/extract/etc/securetty を修正します。デフォルトでは ttyS0 がコメントアウトされているので、これを解除しておきます。

ttyS0

デフォルトでは /etc/passwd には以下の 4 ユーザが登録されていました。

$ cat /home/tc/temp/extract/etc/passwd
root:x:0:0:root:/root:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/false
tc:x:1001:50:Linux User,,,:/home/tc:/bin/sh

通常は tc ユーザを利用して作業をする想定とします。Linux 自体へのログインバナーに作業用ユーザのパスワードが表示されるように /home/tc/temp/extract/etc/issue を修正します。

Login to Core Linux

Username "tc", password is "password".

TELNET サーバの設定ファイルも追加しておきます。/home/tc/temp/extract/etc/inetd.conf を以下の内容で新規作成しておきます。

sudo sh -c 'echo "telnet stream tcp nowait root /usr/local/sbin/telnetd telnetd" >> /home/tc/temp/extract/etc/inetd.conf'

core.gz を書き戻します。

sudo su
cd /home/tc/temp/extract/
find | cpio -o -H newc | gzip -2 > /mnt/sda1/tce/boot/core.gz
cd /home/tc
rm -rf /home/tc/temp

タイムゾーンを修正しておきます。rm を実行する度に削除確認されるのは面倒なので、alias も設定しておきます。~/.profile に以下を追記します。

echo "export TZ='JST-9'" >> /home/tc/.profile
echo "alias rm='rm -f'" >> /home/tc/.profile

vim をインストールしている場合は vi が vim の alias になるよう、alias を追加しておきます。

alias vi='vim'

設定ファイルをバックアップします。

filetool.sh -b

シャットダウンします。

sync ; sync ; sync ; sudo poweroff

これで完成です。

VIRL への登録

作成したイメージを VIRL に登録します。server の Subtype をベースに登録すれば、ほぼ変更する点はありません。

f:id:sig9:20150830004342p:plain

参考