CentOS7でPXEサーバを作ってみる

Filed in コンピュータ

サーバ設定系の記事が続きます。

NFSサーバを立ててESXiから使っている訳ですがRAIDを組むためにHDDを追加したことは先の記事のとおり。
拡張性のあまりないPCを使ったので空きベイが足りなかった。
このとき何も考えていなかったのでCD-ROMドライブを外して5インチベイにHDDを2つ挿してしまいました。

そうです。OSをインストールしようとしたときになって「あっ!起動できない」と気づいたわけです。
いったんHDDを外すという手もありますが、せっかくなのでPXEサーバをたててネットワークインストールをすることにしました。

ということでメモ。

始める前にインストールイメージをどっかから用意しておく。
今回はCDを用意した。

必要なものをインストール

$ yum install tftp-server xinetd dhcp syslinux httpd

xinetdの設定をしてtftpを有効にする

/etc/xinetd.d/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s -v /var/lib/tftpboot   <= -vつけ。/var/log/messageにログが出るよ。
        disable                 = no                        <= yesから変える。
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

xinetdを再起動

$ systemctl restart xinetd

DHCPサーバを用意する。
抜粋。

/etc/dhcp/dhcpd.conf

option domain-name "dracula.mydns.jp";   <= ドメイン
option domain-name-servers 192.168.1.1;     <= DNS

subnet 192.168.1.0 netmask 255.255.255.0 {
        filename "/pxeboot/pxelinux.0";          <= PXEの設定。
        range 192.168.1.250 192.168.1.254;      <= 割り当てに使うIP
        option routers 192.168.1.1;
        default-lease-time 600;
        max-lease-time 7200;
}

サービス再起動

$ systemctl restart dhcpd

ここから本番。
ブートローダsyslinuxを準備する。

cp -p /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxeboot/
cp -p /usr/share/syslinux/menu.c32   /var/lib/tftpboot/pxeboot/

webサーバの公開ディレクトリに用意したCDをマウント。
webサーバのディレクトリにするのはそのままインストールに使うから。

$ mkdir /var/www/html/centos7
$ mount /dev/cdrom /var/www/html/centos7

インストーラのイメージファイルをPXEブートディレクトリにコピー

$ cp -p /var/www/html/centos7/iso/isolinux/initrd.img /var/lib/tftpboot/pxeboot
$ cp -p /var/www/html/centos7/iso/isolinux/vmlinuz /var/lib/tftpboot/pxeboot

PXEブートの設定ファイル置き場を作成

$ mkdir /var/lib/tftpboot/pxeboot/pxelinux.cfg

PXEブートの設定ファイルを作成

/var/lib/tftpboot/pxeboot/pxelinux.cfg/default

default   menu.c32

label 1
menu label ^1) install centos 7 from pxeserver
kernel vmlinuz
append load initrd=initrd.img inst.repo=http://<pxeサーバ>/centos7/  <= CDマウントして公開したたもの。

inst.repoはhttp://ftp.riken.jp/Linux/centos/7/os/x86_64/など外部を使ってもいいと思う。
それならhttpdいらない。
ただし遅いと思うのでそれは覚悟。

最後にポートを開ける

$ firewall-cmd --permanent --add-port=67/udp  <= Boostrap Protocol Server
$ firewall-cmd --permanent --add-port=68/udp  <= Bootstrap Protocol Client (BOOTP)
$ firewall-cmd --permanent --add-port=69/udp  <= Trivial File Transfer Protocol (TFTP)
$ firewall-cmd --reload

これで準備は完了である。

あとはクライアントを同じセグメントに接続して起動すればいいのだ。
BIOSとかでPXEブートを有効にしてね。

CentOS7でソフトウェアRAID1してみる

Filed in コンピュータ

先日NFSを構築してESXiからマウントするという記事を書いた。
実はNFSはソフトウェアRAID1を組んでいる。

たまにしかやららないので備忘。
あらかじめCentOSを入れてあったPCに後からHDDを2つ増設した。
この2つでRAIDを組むことにする。
NFSで公開する領域だけRAIDにしてます。

まずは必要なものインストール

$ yum install mdadm

追加したHDDのデバイスファイルを確認する

$ fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes, 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x00045e9d

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048   976773119   487873536   8e  Linux LVM

 Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0x3f51115e

Disk /dev/sdc: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0x17246bea

こんな感じで出力されると思う。まあ/dev/sdb, /dev/sdcのようだ。

それぞれにパーティションを切る。といっても全部で1パーティションにしてしまう。
/dev/sdb,/dev/sdc両方で以下をする。

若干省略気味で。

$ fdisk /dev/sdb

コマンド : n                         <= NEW
コマンドアクション
   e  拡張
   p  基本領域(1-4)
p                                    <= 基本にする
領域番号(1-4): 1                     <= デフォルトで
先頭シリンダ(1-xxx、default 1):1     <= デフォルトで
終点シリンダ(1-xxx  default xxx):xxx <= デフォルトで

コマンド: t                          <= パーティションID変更
select partition:1                   <=1つなので1
16進コード: fd                       <= Linux raid autoのコード

コマンド: w                          <=書き込んで終了

RAIDアレイの作成

$ mdadm --create /dev/md0 --level=1 --raid-device=2 /dev/sd[bc]

ごにょごにょ裏でアレイの構築が始まる

進捗の確認は以下でできる。

$ cat /proc/mdstat

設定ファイルは作ってくれないので作る。
先にARRAY情報を調べておく

$ mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=nfs.dracula.mydns.jp:0 UUID=f98afbd0:563e89b4:8b3ae7ed:21a3790b

で、設定

/etc/mdadm.conf
DEVICE /dev/sdb /dev/sdc
ARRAY /dev/md0 metadata=1.2 name=nfs.dracula.mydns.jp:0 UUID=f98afbd0:563e89b4:8b3ae7ed:21a3790b

ARRAYにはあらかじめ調べたARRAY情報を書く。リダイレクトで追記するとよい。

ファイルシステムを作る。ext4でいいでしょう。

$ mkfs -t ext4 /dev/md0

オートマウントの設定

/etc/fstab
/dev/md0  /マウントポイント  ext4  defaults 1 2 

マウントする

$ mount -a

片方のHDDが壊れても動いてしまうのでmdadmによる監視設定を入れる。

echo MAILADDR 送信先メールアドレス  >> /etc/mdadm.conf

監視機能の実行と自動起動

$ systemctl start mdmonitor
$ systemctl enable mdmonitor

通知のテスト

mdadm --monitor --test --oneshot --scan

ソフトバンクに送ろうとしたら拒否られた。ポートが違うとかなとかの情報が見つかったが
面倒なのでISPにメールすることにして転送対象にした。。。

ESXi単独でNFSをデータストアとして使う

Filed in コンピュータ

VMware Workstationを使ってサーバを立てていたのだが仮想サーバが増えてきたのでESXi(当然無償版)の専用サーバを立ててそこに集約することにした。ただストレージ容量の多いマシンは確保できなかったので長らくお休みになられていたPCにNFSサーバとして復帰してもってESXiからマウントすることにした。

NFSサーバはCentOS7を使って構築した。
ただ、CentOSはデフォルトではNFSv4であり、ESXiはNFSv3までしかサポートしていないのでなかなか接続成功までが大変であった。

まずインストール

$ yum -y nfs-utils rpcbind

次にidmapdの設定をする

/etc/idmapd.conf

[General]
Domain = 自ドメイン

[Mapping]
Nobody-User = nfsnobody
Nobody-Group = nfsnobody

他デフォルトのまま

NFSv3では動的なポートをいくつか使うのでファイアウォールと相性が悪い。
まずはそれを固定してしまう。
/etc/sysconfig/nfsに設定を入れる。MOUNTD_NFS_V3はいるのか分からんけど。。

RPCRQUOTADOPTS="--port ポート番号"
LOCKD_TCPPORT=ポート番号
LOCKD_UDPPORT=ポート番号
STATDARG="--outgoing-port ポート番号 --port ポート番号"
MOUNTD_NFS_V3="yes"

各サービスを立ち上げる、かつサーバ起動時に有効にする。

$ systemctl start nfs-idmap nfs-mountd nfs-server nfs-lock rpcbind
$ systemctl enable nfs-idmap nfs-mountd nfs-server nfs-lock rpcbind

ポートが固定できたか確認する。

$ rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100005    2   udp  20048  mountd
    100024    1   udp   2050  status
    100024    1   tcp   2050  status
    100005    3   udp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  32769  nlockmgr
    100021    3   udp  32769  nlockmgr
    100021    4   udp  32769  nlockmgr
    100021    1   tcp  32803  nlockmgr
    100021    3   tcp  32803  nlockmgr
    100021    4   tcp  32803  nlockmgr
    100011    1   udp   2052  rquotad
    100011    2   udp   2052  rquotad
    100011    1   tcp   2052  rquotad
    100011    2   tcp   2052  rquotad

こんな感じで出ると思う。
portmapper, mountd, status, nfs, nlockmgrr, quotadが予定どおりのポート番号ならOK。

次にファイアウォールを設定して固定したポートを開放する。
ポート番号指定で開けてもいいけど、せっかくなのでサービスを定義して開けてみる
/lib/firewalld/servicesに使えるサービスを定義したxmlがある。
nfs, mountd, rpc-bindは定義されているのでそれ以外を定義する。

rquotd, nlockmgr, statdを追加する。
既存のサービスのファイルをコピーして中身を書きかえるのが吉。
shortやdescriptionは好きなものにすればよい。

rquotd.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>rquotad</short>
  <description>define rquotad</description>
  <port protocol="tcp" port="ポート番号"/>
  <port protocol="udp" port="ポート番号"/>
</service>
nlockmgr.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>nlockmgr</short>
  <description>define nlockmgr</description>
  <port protocol="tcp" port="ポート番号"/>
  <port protocol="udp" port="ポート番号"/>
</service>

statdはoutgoing分も纏めて定義してしまう。

statd.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>statd</short>
  <description>define statd</description>
  <port protocol="tcp" port="ポート番号(outgoing)"/>
  <port protocol="udp" port="ポート番号(outgoing)"/>
  <port protocol="tcp" port="ポート番号"/>
  <port protocol="udp" port="ポート番号"/>
</service>

これらと元々定義されているサービスを使ってfirewalldの設定に入れてポートを解放する。

$ firewall-cmd --permanent --add-service=mountd
$ firewall-cmd --permanent --add-service=rpc-bind
$ firewall-cmd --permanent --add-service=nfs
$ firewall-cmd --permanent --add-service=rquotad
$ firewall-cmd --permanent --add-service=nlockmgr
$ firewall-cmd --permanent --add-service=statd
$ firewall-cmd --reload

反映されたかを確認

$ firewall-cmd --list-all

public (default, active)
   interfaces: enp3s0
   sources:
   services: mountd nfs nlockmgr rpc-bind rquotad ssh statd
   ports:
   masquerade: no
   forward-ports:
   icmp-blocks:
   rich rules:

余計なサービスが表示されるなら以下で消しておく。

$ firewall-cmd --permanent --remove-servie=サービス名

これでポートの開放のOK。

後はNFSサーバのexportsを設定。
/exportsを192.168.1.0のネットワークに公開する例

/etc/exports

/exports 192.168.1.0/255.255.255.0(rw,sync)

exportsを反映させて確認する。

$ exportfs -ar
$ exportfs -v

/exports 192.168.1.0/255.255.255.0(rwwdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

最後にSELINUXのポリシーを変えて読み書きを許可する。

$ setsebool -P nfs_export_all_rw on

ここまででNFSサーバは構築できた。

このNFSをESXiからマウントしてデータストアとして使う。
だがここで問題が起こった。。

vSphere Clientを使ってESXiにログインし、データストアの追加を行った。
マウントは無事できた。
しかし、数分経つとNSFが切断されてしまう。数分経つと復旧したりしなかったりで非常に不安定となる。
ESXi5.5 Update1 でそういうバグがあるとの報告があったがESX5.1を使っても改善しなかった。

だが、どうやらvSphere Clientを立ち上げなおした直後は接続できていてしばらく経つと切断するという傾向が見えてきた。そこでESXiにログインしてCLIで操作することにした。

マウントは以下

$ esxcli storage nfs add -H NFSサーバ -s /exports -v データストア名

マウントは無事できた。

状態確認

$ esxcli storage nfs list

Volume Name  Host         Share                    Accessible  Mounted  Read-Only  Hardware Acceleration
-----------  -----------  -----------------------  ----------  -------  ---------  ---------------------
データストア名 NFSサーバ  /exports                      true     true      false  Not Supported

問題ないようだ。
しばらく待ってもAccessibleはtrueのままである。

ここでvSphere Clientを立ち上げてESXiに接続してみる。
するととたんにAccessibleがfalseに切り替わった。
やはりvSphere Clientをつなぐとダメなようだ。

しかたがないのでVMware WorkstationをESXiに繋いでしのぐことにしよう。。

# 2014/10/05 追記
接続が不安定な問題は基本的なミスであった。
クライアントとして使っていたマシンのIPアドレスがNFSサーバとかぶってしまっていた。
ホント恥ずかしいくらい初歩的なミス。
VMwareのバグを疑ってごめんなさい。むしろ一時的にでも良く繋がったなというくらい。