Cuturnの適当日記

徒然なるままに適当に駄文を吐き出しております

Tiny Core Linux で PXEブートサーバ

やっとTiny Core LinuxでCentOS7をPXEブート&Kickstartインストール出来たのでその流れを書く。 なお、ここに記載したものは適当に動くように動くようにと作ったものであり、最適な構成やファイル配置と言えるものではないので注意。

構成

仮想化インフラ上で新たにDHCP用セグメントを作成し、実行。

f:id:cuturn2460:20150907220626p:plain

PXE機能を持つサーバ

  • OS:Tiny Core Linux 6.3 (x86)
  • スペック:vCPU1個、メモリ256MB、HDD4GB
  • DHCP:udhcpd(Busybox)
  • TFTP:atftpd(Advanced TFTP Server)
  • HTTP:Apache2Nginx

Linuxサーバ

  • OS:CentOS7.0 x86_64(をPXEインストールする)
  • スペック:vCPU1個、メモリ1GB、HDD10GB

※PXEBootにてCentOS7のインストーラ(anaconda)を起動すると、メモリ512MBではout of memory エラーが出る。したがって1024MBほどは有った方が無難。何かオプション弄ればいける気もするが一旦そのままとする。

PXEサーバの設定について

フォルダ構成(適当)

ファイルパス 説明
/etc/udhcpd.conf DHCPサーバの設定
/opt/.filetool.lst 再起動しても保存されるファイルの指定
/opt/bootlocal.sh 起動時にrootユーザで実行するスクリプト
/usr/local/etc/nginx/nginx.conf Webサーバ設定ファイル
/mnt/sda1 Tiny Core Linuxに付けたHDD4GBを切ったパーティション。永続。
/mnt/sda1/www Webサーバのドキュメントルート(永続化しないと面倒)
/mnt/sda1/tce 追加パッケージ類が格納され、起動時に展開される
/mnt/sda1/tftpd TFTPデーモンが公開するディレクトリ
/mnt/sda1/tftpd/pxe/ PXEブートのための一連のファイルを保管(詳細後述)

DHCPサーバ

DHCPサーバでは192.168.200.xのセグメントを展開できるよう、udhcpdを実行する。 まずはTiny Core Linuxにて必要となる、udhcpdの起動設定や設定ファイルの保存設定。

$ sudo echo etc/udhcpd.conf >> /opt/.filetool.lst                    ←再起動しても保存されるファイル一覧に設定を追加
$ sudo echo udhcpd /etc/udhcpd.conf >> /opt/bootlocal.sh             ←起動スクリプトを追加

設定ファイルは下記の通り

# /etc/udhcpd.conf
start 192.168.200.1
end 192.168.200.200
interface eth1
option subnet 255.255.255.0
option lease 259200
lease_file /tmp/udhcpd.leases
pidfile /tmp/udhcpd.pid

siaddr 192.168.200.254
sname 192.168.200.254
boot_file /mnt/sda1/tftpd/pxe/pxelinux.0
opt tftp 192.168.200.254

手動で起動するときは下記のようなコマンドで実行。

$ sudo udhcpd /etc/udhcpd.conf

ATFTPサーバの準備

インストールは前のエントリ参照。

作成したtczファイルをとりあえず以下の通り処理しておく。

$ mv atftp.tcz /mnt/sda1/tce/optional/atftp.tcz
$ md5sum /mnt/sda1/tce/optional/atftp.tcz > /mnt/sda1/tce/optional/atftp.tcz.md5.txt
$ chown tc:staff /mnt/sda1/tce/optional/atftp.tcz*
$ chmod 664 /mnt/sda1/tce/optional/atftp.tcz*

とりあえずディレクトリを作っておく。

$ sudo mkdir /mnt/sda1/tftpd

ATFTPは特に設定ファイルは存在せず、起動時引数で指定する。下記のコマンドを/opt/bootlocal.shに追記する。 なお、ここでatftpパッケージを起動時にインストールする。bootlocal.shはrootユーザで実行されるのだがtce-loadはrootでは実行できないのでtcユーザで実行するようにする。

sudo -u tc tce-load -i /mnt/sda1/tce/optional/atftp.tcz
atftpd --pidfile /tmp/atftpd.pid --daemon --user root --port 69 /mnt/sda1/tftpd

手動で起動する場合は下記の通り。

sudo atftpd --pidfile /tmp/atftpd.pid --daemon --user root --port 69 /mnt/sda1/tftpd

Nginxの準備

Nginxは軽量なWebサーバなのでTinyCoreで単にリポジトリ内容展開したいだけの場合にもってこいだ。 下記の通り適当にインストールする。

$ tce-load -wi nginx.tcz 

自動起動設定は下記の通り。

$ sudo mkdir -m /mnt/sda1/www
$ sudo echo usr/local/etc/nginx/nginx.conf >> /opt/.filetool.lst
$ sudo echo /usr/local/etc/init.d/nginx start << /opt/bootlocal.sh

設定ファイル/usr/local/etc/nginx/nginx.confは下記のようにした。どうせCentOSなどのOSファイルをローカルで見せるだけなので、あまり細かい設定は気にしない。 とはいえ文字コードUTF-8にするとか、最低限の設定は入れておく。

#user nobody;
worker_processes  1;
pid  /tmp/nginx.pid;
error_log /var/log/nginx_error.log notice;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx_access.log main;

    server {
        listen       80;
        server_name  localhost;
        charset UTF-8;
        location / {
            root   /mnt/sda1/www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

PXEBootの準備

TFTPによるPXEブートイメージの準備

PXEブートイメージをTFTPで取得できる場所に設置する。

$ sudo mkdir /mnt/sda1/tftpd/pxe
$ sudo cp -p /usr/share/syslinux/pxelinux.0 /mnt/sda1/tftpd/pxe/pxelinux.0

PXEブート時にロードするイメージをCentOS7 x64 ISOから引っ張りだし、所定の場所に配置する。

CentOS7ISO:images/pxeboot/initrd.img → /mnt/sda1/tftpd/pxe/initrd.img
CentOS7ISO:images/pxeboot/vmlinuz → /mnt/sda1/tftpd/pxe/vmlinuz

イメージロードのコンフィグを作成する。

$ sudo mkdir /mnt/sda1/tftpd/pxe/pxelinux.cfg
$ sudo vi /mnt/sda1/tftpd/pxe/pxelinux.cfg/default

defaultファイルは以下の通り。

default centos7-64
label centos7-64
kernel vmlinuz
append load initrd=initrd.img devfs=nomount inst.repo=http://192.168.200.254/image/centos7 ks=http://192.168.200.254/ks/centos7.cfg

CentOS7 イメージとkickstartファイルの準備

今のディレクトリ構成の場合、CentOS7の中身を/mnt/centos7にぶちまけるか/mnt/centos7にマウントすればインストールイメージの読み込みが可能。

Kickstartファイルとして、とりあえずCentOS7用に/mnt/sda1/www/ks/centos7.cfgを下記内容で作成。

#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512

# create new
install

# automaticaly proceed for each steps
autostep

# text mode
text

# reboot after installing
reboot

# Use CDROM installation media
url --url=http://192.168.200.254/image/centos7/

# install disk
ignoredisk --only-use=sda

# Keyboard layouts
keyboard --vckeymap=jp106 --xlayouts='jp'

# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=dhcp --ipv6=auto --activate --hostname=centos7.localdomain

# Root password
rootpw --iscrypted ********************************************************************************

# System timezone
timezone Asia/Tokyo --isUtc

user --groups=wheel --name=sysuser --password=***************************************************** --iscrypted --gecos="sysuser"

# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
autopart --type=lvm

# Partition clearing information
clearpart --linux

%packages
@compat-libraries
@core
@development

%end

設定後

PXEブートサーバにて下記を実行し、設定やその他ファイルの永続化を行う。

sudo filetool.sh -b

あとはPXEブートサーバを再起動し、その後同LANにてLinuxサーバを起動すれば自動的にインストールが完了する…はず。