Tiny Core Linux で PXEブートサーバ
やっとTiny Core LinuxでCentOS7をPXEブート&Kickstartインストール出来たのでその流れを書く。 なお、ここに記載したものは適当に動くように動くようにと作ったものであり、最適な構成やファイル配置と言えるものではないので注意。
構成
仮想化インフラ上で新たにDHCP用セグメントを作成し、実行。
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サーバを起動すれば自動的にインストールが完了する…はず。