リソースの小さいDNSサーバをVirtualBoxで構築する。（VirtualBox＋TinyCore＋dnsmasq）


## 内容
開発用にリソースの小さい（メモリ64MB,HDD64MB）DNSサーバをVirtualBoxで構築する。


大まかな流れは以下の通り。

1. VirtualBox VMの作成
1. TinyCcoreをVMにインストール(HDDにインストール)
1. ネットワーク設定
1. OpenSSHのインストール、設定
1. dnsmasqのインストール、設定


## 構成

▼環境

項目 | 内容
----+----
VirtualBox | 5.0.20 r106931
ホストOS | Windows 10 Home Edition
ゲスト OS | TyneCore v7.0 Core(10 MB) kernel 4.2.9-tinycore
ゲスト IPアドレス |192.168.1.100
dnsmasq | version 2.55

▼VM設定

大項目|小項目 | 内容
----+----+----
システム | メモリ | 64MB
システム | 起動順序 | 1st 光学, 2nd HDD
ディスプレイ | ビデオメモリー | 10MB 
ストレージ | HDD (SATA) | 64MB 
オーディオ | オーディオの有効化  | OFF
ネットワーク | 割当| ブリッジアダプタ

## TinyCoreに関するメモ

- ファイルの保存設定をしないと、OS再起動後に削除される。
    1. `/opt/.filetool.lst`に保存対象のディレクトリを記載
    1. `filetool.sh -b`でバックアップ
- スタートアップ時（OS起動時）に実行するコマンドは`/opt/bootlocal.sh
`に記載する。
- シャットダウンは「sudo poweroff」

## 手順

1. TinyCoreのダウンロード
    以下のページより、TinyCoreのインストーラをダウンロードする。
    http://tinycorelinux.net/downloads.html
    → Core(10 MB)をダウンロード

1. VM設定起動
    VMを新規に作成後、起動する。

1. インストールツールの入手
	HDDにインストールするためのツール「tc-install」を入手する。

    ``` bash:
    $ tce-load -wi tc-install
    ```

1. パーティション作成
  OSをインストールするパーティションを作成する。

    ``` bash:
    $ sudo fdisk /dev/sda
    …（省略）…
    # →新規作成のnを入力
    Command (m for help)：n 
    # →プライマリパーティションのpを入力
    Command action
     e extended
     p primary partition(1-4)
    p
    …（省略）…
    # →パーティション番号1を入力
    Partition number (1-4):1
    # →全領域を指定するので、デフォルト値を使用。
    #   値を入力せずEnter
    First cylinder (1-4, default 1):
    #   値を入力せずEnter
    Last cylinder or +size or +sizeM or *sizeK (1-6 default 6):
    …（省略）…

    # wで書込
    Command (m for help):w
    
	
    # /dev/sda1ができていることを確認
    $ fdisk -l
    ```

1. TinyCoreのインストール
    TinyCoreをHDDへインストール

    ``` bash:
    $ sudo tc-install.sh
    …（省略）…
    
    Core Installation.
    Install from [R]unning OS, from booted [C]drom, or from [I]so file. (r/c/i): c
    # → インストーラはcdromとしてマウントしているので「c」を指定。
    …（省略）…
    
    Select Install type [F]rugal, [H]DD, [Z]ip. (f/h/z): f
    # →「f」を指定する（通常インストール）。
    #   ※「h」「z」はUSBメモリから起動する場合に指定。
    …（省略）…
    
    Select Target for Installation of core
      1. Whole Disk
      2. Partition
    Enter selection (1-2) or (q)uit: 1
    # →1はディスク全領域、2は指定したパーティションを指定。今回はディスク全領域を使うため「1」を指定。
    …（省略）…
    
    Select disk for core
      1. sda
      2. sr0
    Enter selection (1-2) for (q)uit: 1
    # →sdaはHDD、sr0は光学ドライブ。HDDにインストールするので「1」を指定。
    
    Enter selection (y,n) or (q)uit: y
    # →ブートローダのインストール有無。今回はインストールするため「y」を指定。
    
    Select Formatting Opton for sda
        1. ext2
        2. ext3
        3. ext4
        4. vfat
    Enter selection (1-4) or (q)uit: 3
    # →ディスクのフォーマット形式を設定。今回は「3」を指定。
    
    Enter space separated boot options:
    Example: vga=normal syslog showapps waitusb=5
    # →ブートオプションを設定。今回は何も設定しない。
    #   入力せずにEnterキーを押下。
    
    Last chance to exit before destroying all data on sda
    Continue (y/..)? y
    # →問題がなければ「y」を入力。やり直しが必要な場合は「y」以外を入力。
    
    Press Enter key to continue. 
    # →Enterキーを押下。
    
    # 一旦シャットダウンし、VMの設定を変更。
    $ sudo poweroff
    
    # VM設定
    # 設定→システム→起動順序のファーストブートをCD→HDDに変更。
    # 変更後、OSを起動。
    ```

1. ネットワーク設定
    ネットワーク設定スクリプト「eth0.sh」を作成し、OS起動時に読み込ませる。

    ``` bash:
    # eth0.shの作成
    $ vi /opt/eth0.sh 
    # 以下の内容を記載(環境に合わせる)
    # ------------------------------------------
    # #!/bin/sh
    # pkill udhcpc
    # ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 up
    # route add default gw 192.168.1.1
    # echo "nameserver 192.168.1.100" > /etc/resolv.conf
    # echo "nameserver 192.168.1.1" >> /etc/resolv.conf
    # touch /usr/local/etc/ssh/sshd_config
    # ------------------------------------------

    # スタートアップ設定
    $ echo "sudo sh /opt/eth0.sh" >> /opt/bootlocal.sh

    # 永続設定
    $ echo "opt/eth0.sh" >> /opt/.filetool.lst
    $ filetool.sh -b
    $ sudo reboot
    ```

1. SSH設定

    今回はユーザ「tc」でログイン出来るように設定する。

    ``` bash:
    # opensshのインストール
    $ tce-load -wi openssh
    # 必要があれば、以下を更新。今回はデフォルトで使用する。
    # cd /usr/local/etc/ssh
    # sudo vi sshd_config 
    
    # sshでログインするユーザのバスワード設定
    $ passwd tc
    
    # 動作確認
    $ sudo /usr/local/etc/init.d/openssh start
    $ ps -ef | grep ssh
    $ ssh tc@localhost     
    $ exit
    
    # スタートアップ設定
    $ echo "/usr/local/etc/init.d/openssh start" >> /opt/bootlocal.sh 

    # 永続設定
    $ echo "usr/local/etc/ssh" >> /opt/.filetool.lst
    $ echo "etc/passwd" >> /opt/.filetool.lst
    $ echo "etc/shadow" >> /opt/.filetool.lst
    $ echo "etc/group" >> /opt/.filetool.lst
    $ filetool.sh -b
    $ sudo reboot
    ```

1. dnsmasqのインストール・設定

    ``` bash:
    # dnsmasqのインストール
    $ tce-load -wi dnsmasq
    
    # 設定の修正
    $ vi /etc/nsswitch.conf
    # 以下の通り修正
    # ---------------------------------------
    # hosts:      files dns
    #   ↓
    # hosts:      dns files
    # ---------------------------------------
    $ sudo vi /etc/hosts
    # 以下を追記
    # ---------------------------------------
    # 192.168.1.100 tce-dns
    # ---------------------------------------
    $ sudo cp /usr/local/etc/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
    # 必要があればdnsmasq.confを修正。今回はデフォルトを使用。
        
    # スタートアップ設定
    $ echo "sudo /usr/local/sbin/dnsmasq -9 -d" >> /opt/bootlocal.sh

    # /etc/hostsファイルは.filetool.lstに書き込んでもOS再起動後にリセットされてしまうため、以下の仕組みを設定。
    $ vi /home/tc/set_hosts
    # 以下を追記
    # ---------------------------------------
    # 127.0.0.1 box localhost localhost.local
    # 192.168.1.100 tce-dns
    # ---------------------------------------
    $ vi /opt/bootlocal.sh 
    # 「sudo /usr/local/sbin/dnsmasq -9 -d」の前に以下を追記
    # ---------------------------------------
    # sudo cp /home/tc/set_hosts /etc/hosts
    # ---------------------------------------

    # 永続設定
    $ echo "usr/local/etc/dnsmasq.conf" >> /opt/.filetool.lst
    $ echo "etc/nsswitch.conf" >> /opt/.filetool.lst
    $ filetool.sh -b
    $ sudo reboot
    
    # 動作確認
    $ nslookup tce-dns
    ```

## その他、TinyCoreの設定

- 日本語キーボードマップ
    日本語キーボードマップ(jp106)をインストールし、有効化。

    ``` bash:
    # インストール
    $ tce-load -wi kmaps

    # スタートアップ設定
    $ sudo echo "loadkmap < /usr/share/kmap/qwerty/jp106.kmap" >> /opt/bootlocal.sh
 
    # 永続化
    $ filetool.sh -b
    $ sudo reboot
    ```

## リファレンス

- [Tiny Core](http://tinycorelinux.net/)
- http://www.parkytowers.me.uk/thin/Linux/TinycorePXE.shtml