UbuntuからTiny Core Linux 7をUSBメモリにインストール

今回は手元にあったUbuntuベースの[LinuxBean 12](https://ja.osdn.net/projects/linuxbean/)のマシンを使ってUSBメモリにTiny Core Linuxをインストールした時のメモです。

Tiny Core Linuxのインストーラー（`tc-install.sh`）を使わない、手動でのインストール方法になりますので、ちょい面倒な内容となっています。


## USBメモリのフォーマット
まずUSBメモリにパーティションを作成します。Tiny Core Linuxの場合、Linux用のパーティションを1つ作るだけでも起動できますので、とりあえず1つ作成します。起動できるようにBootable（起動可能）にしておきます。
既にフォーマット済みのUSBメモリを使う場合、自動的にマウントされている可能性がありますので`sudo umount /dev/sdb1`とかしてマウントを解除した状態で作業を行う必要があります。

```console
$ sudo cfdisk /dev/sdb

                           cfdisk (util-linux 2.20.1)

                              Disk Drive: /dev/sdb
                        Size: 2004877312 bytes, 2004 MB
              Heads: 42   Sectors per Track: 42   Cylinders: 2219

    Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
                            Pri/Log   Free Space                           0.04*
    sdb1        Boot        Primary   Linux                             2004.85*




     [   Help   ]  [   New    ]  [  Print   ]  [   Quit   ]  [  Units   ]
     [  Write   ]

                      Create new partition from free space
```

パーティションをいじった際は`sudo partprobe`か再起動してパーティションを変更したことを正しくOSに認識してもらいます。
OSが認識してくれたらフォーマットしラベルをつけマウントします。今回は「tinycore」という名前でつけました。

```console
$ sudo mkfs.ext3 /dev/sdb1
$ sudo e2label /dev/sdb1 tinycore
$ sudo mount /dev/sdb1 /mnt
```

## 必要なファイルのコピー
展開するための作業用ディレクトリを作成します。

```console
$ mkdir -p tinycore/iso
$ cd tinycore
```

「[Tiny Core Linuxのダウンロードページ](http://tinycorelinux.net/downloads.html)」からCoreをダウンロードします。パスが分かっていれば`wget -N http://tinycorelinux.net/7.x/x86/release/Core-current.iso`のような感じでダウンロードすることもできます。

ダウンロードしたISOファイルをマウントし必要なファイルをコピーします。

```console
$ sudo mount -o loop Core-current.iso iso
$ sudo mkdir /mnt/boot
$ sudo cp iso/boot/vmlinuz /mnt/boot
$ sudo cp iso/boot/core.gz /mnt/boot

$ sudo mkdir /mnt/tce
$ sudo touch /mnt/tce/mydata.tgz
$ sudo chmod -R 755 /mnt/tce
$ sudo chown -R 1001:50 /mnt/tce
```

## GRUBの登録
Tiny Core Linuxのgrubのパッケージをダウンロードし解凍します。解凍したものから必要なファイルをコピーします。

```console
$ wget -N http://tinycorelinux.net/7.x/x86/tcz/grub-0.97-splash.tcz
$ unsquashfs grub-0.97-splash.tcz 
$ sudo mkdir /mnt/boot/grub
$ sudo cp squashfs-root/usr/lib/grub/i386-pc/* /mnt/boot/grub
```

grubのメニューを登録します。

```console
$ sudo vi /mnt/boot/grub/menu.lst
```
```text:/mnt/boot/grub/menu.lst
default 0
timeout 3
title tinycore
kernel /boot/vmlinuz quiet waitusb=5 consoleblank=0 blacklist=pcspkr  tz=JST-9 notuc
initrd /boot/core.gz
```

今回指定したカーネルパラメーターの意味は以下のような感じです。

- 「consoleblank=0」10分経っても画面がブラックアウトしないように
- 「blacklist=pcspkr」モジュールを無効にしてビープ音が鳴らないように
- 「tz=JST-9 notuc」タイムゾーンを日本に


grubを起動しroot と setup コマンドを使ってブートローダーを登録します。バッチモードで一気に実行してしまいます。

```console
$ /bin/echo -e "root (hd1,0)\nsetup (hd1)" | sudo squashfs-root/usr/sbin/grub --batch
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]
grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"...  16 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+16 p (hd1,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
```

これで完了です。シャットダウン又はリブートしてUSBメモリからブートします。

## アプリのインストール
インターネットが使えない環境やネットワークデバイスが認識されないPCもあるので、事前に必要なアプリをUbuntu上でダウンロード＆インストールする方法です。

まずは簡単＆適当なダウンローダーを作ります。

```bash:tce-dl.sh
#!/bin/sh

tcz=$1
[ ! "$(echo $tcz|grep tcz)" ] && tcz=$1.tcz
[ -e tce/optional ] && mkdir -p tce/optional
[ -e tce/optional/$tcz ] && exit 0
wget -NP tce/optional http://tinycorelinux.net/7.x/x86/tcz/$tcz
wget -NP tce/optional http://tinycorelinux.net/7.x/x86/tcz/$tcz.dep
wget -NP tce/optional http://tinycorelinux.net/7.x/x86/tcz/$tcz.md5.txt

[ $# -eq 1 ] && echo $tcz >> tce/onboot.lst 
[ ! -e tce/optional/$tcz.dep ] && exit 0
for f in $(cat tce/optional/$tcz.dep);do
  $0 $f noonboot
done
```

先ほど作成したダウンローダーを使って欲しいアプリをダウンロードします。

```console
$ ./tce-dl.sh coreutils #shredを使うため
$ ./tce-dl.sh smartmontools #smartctlを使うため
$ ./tce-dl.sh hdparm #Secure Eraseを使うため
$ ./tce-dl.sh e2fsprogs #badblocksを使うため
```

起動時に読み込まれるアプリの一覧が作成されたかを確認します。

```console
$ cat tce/onboot.lst 
coreutils.tcz
smartmontools.tcz
hdparm.tcz
e2fsprogs.tcz
```

USBメモリにコピーして完了です。

```console
$ sudo mkdir /mnt/tce/optional
$ sudo cp tce/optional/* /mnt/tce/optional
$ sudo cp tce/onboot.lst* /mnt/tce
$ sudo chmod -R 755 /mnt/tce
$ sudo chown -R 1001:50 /mnt/tce
```

## ホームディレクトリにファイルを設置
ホームディレクトリに自前で作成したスクリプトやファイルを設置する方法です。今回はサンプルとして以前作成した消去スクリプト（erase.sh）をホームディレクトリに設置してみます。

まずは作業用ディレクトリを作成します。

```console
$ mkdir -p home/tc
```

作成した作業用ディレクトリに設置したいファイルを作成します。

```console
$ vi home/tc/erase.sh
```

```bash:home/tc/erase.sh
#!/bin/sh
sudo sh -c "echo mem > /sys/power/state"
sudo hdparm -I /dev/sda >> log.txt 2>&1
if [ "$(sudo hdparm -I /dev/sda | grep 'for ENHANCED')" ]; then
    echo "Run Enhanced Erase" >> log.txt
    sudo hdparm --security-set-pass pass /dev/sda
    time sudo hdparm --security-erase-enhanced pass /dev/sda >> log.txt 2>&1
    sudo hdparm --security-unlock pass /dev/sda
elif [ "$(sudo hdparm -I /dev/sda | grep 'for SECURITY')" ]; then
    echo "Run Secure Erase" >> log.txt
    sudo hdparm --security-set-pass pass /dev/sda
    time sudo hdparm --security-erase pass /dev/sda >> log.txt 2>&1
    sudo hdparm --security-unlock pass /dev/sda
else
    echo "Run shred" >> log.txt
    time shred -n 1 /dev/sda >> log.txt 2>&1
fi
dd if=/dev/sda bs=32 count=1 | hexdump -C >> log.txt
dd if=/dev/sda bs=128M count=1 | cmp /dev/zero >> log.txt 2>&1
badblocks -v /dev/sda 2>> log.txt
echo "ID# ATTRIBUTE_NAME          VALUE WORST THRESH TYPE      RAW_VALUE" >> log.txt
sudo smartctl -A /dev/sda |egrep "^(  1|  5|19[6-8])" |sed -r "s/(0x[0-9a-f]+|Always|Offline|\-) +//g" >> log.txt
date >> log.txt
if [ ! "$(cat .profile | grep log.txt)" ]; then
        echo "cat log.txt" >> .profile
fi
filetool.sh -b
sudo reboot
```

作成したらパーミッションを設定して圧縮します。

```console
$ chmod 755 home/tc/erase.sh
$ tar --owner=1001 --group=50 -czv home > tce/mydata.tgz
```

USBメモリーにコピーして完了です。

```console
$ sudo cp tce/mydata.tgz /mnt/tce/
$ sudo chown 1001:50 /mnt/tce/mydata.tgz
```