Tiny Core Linux はフットプリントが非常に小さい Linux ディストリビューションで、Cisco VIRL のような仮想化された検証環境内で複数インスタンスを立ち上げても軽快に動作する、という特徴があります。用途に応じて幾つかの種類があります。参考として記載したサイズは 6.3 用 ISO イメージのサイズです。
- Core
- 9MB 程度。CLI だけの、最小環境での利用を想定。
- TinyCore
- 15MB 程度。GUI(X)を含む。
- CorePlus
- 84MB 程度。TinyCore に様々なパッケージを追加している。
追加パッケージも数多く提供されているので Core をベースにパッケージを追加し、カスタマイズしていくのも簡単です。今回は Core を VIRL に登録してみます。
作業環境
以下の環境で作業しました。
- 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 X(Yosemite)で 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/TCP に TELNET した結果です。リダイレクトされ、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
vim は X.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 を以下の方針で修正します。
- 自動ログイン(/sbin/autologin)の無効化
- tty1 のスピードを修正
- 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 をベースに登録すれば、ほぼ変更する点はありません。
参考
- Into the Core - A look at Tiny Core Linux
- Tiny Core Linux のバイブル(たぶん)。
- Browse TCZs
- 6.x 用の拡張パッケージ一覧。
- Linux Core Installation and its Remastering for Output to Serial Port
- Core Linux をリマスタリング(カスタマイズ)する手順全般について説明されている。コンソールを有効化する手順等も参考になる。
- Boot Process
- TinyCore の起動プロセスについて説明されている。
- Tiny Core 6のインストール
- Tiny Core 6 系をインストールした後の各種カスタマイズについて説明されている。
- change shell
- Tiny Core でシェルを変更する手順についてディスカッションされている。
- How to - Command Line install of 'Core'
- CLI から tc-install を使ってインストールする手順について説明されている(詳細だが、英語)。
- Tiny Core Linuxでサーバ運用(2) - インストール
- こちらも tc-install を使ったインストール手順について説明されている(簡易だが、日本語)。/opt/.filetool.lst と filetool.sh を使ったファイルの永続化についても分かりやすく説明されている。
- Tiny Core Linux でtelnet
- Tiny Core で TELNET サーバを有効化する手順について説明されている。
- Tiny Core 6.1 64bit版のインストールと、dockerを動かそうとしたメモ
- Tiny Core の 64bit 版をインストールする際の手順について説明されている。
コメント