読者です 読者をやめる 読者になる 読者になる

カメニッキ

カメとインコと釣りの人です

PXEブートでCentOSをリモートインストールした

小ネタと独り言

PXEつかう

前提

予め以下を用意。

  • ホスト:test1

    固定IP:192.168.33.10

  • 環境

      Mac上のVirtualBoxでやってます。
    

PXEの処理フロー(例)

  1. システムが PXE経由でブートし、DHCPサーバへアドレスを要求する
  2. DHCPサーバが、IPアドレス、tftpサーバのアドレス、最初にロードするプログラム名(pxelinux)等を通知する
  3. システムが DHCPサーバから通知された情報を元に、tftpで pxelinuxを取得する
  4. システム上の pxelinuxが tftpサーバから構成ファイル(カーネルファイル名 initrdファイル名、ブートオプション等の書かれているファイル)を取得する
  5. システム上の pxelinuxが取得した構成ファイルを元に tftpサーバからカーネル、initrdイメージを取得し、それを使用してブートする
  6. システム上でインストーラーが起動し、kickstart用構成ファイルを NFS経由で取得する
  7. システム上で kickstart用構成ファイルの指定に従いインストールが行われる、キット(インストール CDイメージ)は NFS経由で参照される

準備

  • dhcp / syslinux / tftp-server / インストール
 [vagrant@test1 ~]$ sudo yum install dhcp
        (略)
    [vagrant@test1 ~]$ sudo yum install xinetd
        (略)
    [vagrant@test1 ~]$ sudo yum install syslinux
        (略)
    [vagrant@test1 ~]$ sudo yum install tftp-server
        (略)
    [vagrant@test1 tftpboot]$ sudo yum install vsftpd
* NFSとは?

    ローカルに接続されたストレージをネットワークを介してリモートの計算機に提供する分散ファイルシステムとそのプロトコル

* TFTPとは?

    UDPでファイル転送するプロトコル。

* xinetdとは?

    インターネットサービスを提供するプログラムの代わりに接続要求を待ち受け、接続要求があった時に各サービスを提供するプログラムを起動するもの

* syslinuxとは?

    軽量なブートローダ「pxelinux.0」を含むパッケージ
  • 各種設定
 # tftp
    [vagrant@test1 ~]$ sudo vi /etc/xinetd.d/tftp
    service tftp
    {
            socket_type             = dgram
            protocol                = udp
            wait                    = yes
            user                    = root
            server                  = /usr/sbin/in.tftpd
            server_args             = -s /var/lib/tftpboot
            disable                 = no
            per_source              = 11
            cps                     = 100 2
            flags                   = IPv4
    }
    
    [vagrant@test1 ~]$ sudo /etc/rc.d/init.d/xinetd start
    xinetd を起動中:                                           [  OK  ]
    [vagrant@test1 ~]$ sudo chkconfig xinetd on
    
    # dhcp
    [vagrant@test1 tftpboot]$ sudo vi /etc/dhcp/dhcpd.conf
    subnet 192.168.33.0 netmask 255.255.255.0 {
        ★デフォげ
        option routers 192.168.33.10;
        ★サブネットマスク
        option subnet-mask 255.255.255.0;
        ★IPの範囲
        range 192.168.33.11 192.168.33.50;
        ★TFTPサーバのIP(ホスト指定はNG)
        next-server 192.168.33.10;
        ★TFTPサーバルートからのファイルパス
        filename "pxelinux.0";
    }
    
    
    [vagrant@test1 tftpboot]$ sudo /etc/rc.d/init.d/dhcpd start
    dhcpd を起動中:                                            [  OK  ]
    [vagrant@test1 tftpboot]$ sudo chkconfig dhcpd on
    
    # pxelnux(Linuxのブートローダ)をtftpディレクトリへコピー
    [vagrant@test1 ~]$ sudo cp -r /usr/share/syslinux/* /var/lib/tftpboot/
    
    # isoのマウントポイントを作成
    [vagrant@test1 vagrant]$ sudo mkdir -p /var/lib/tftpboot/images/centos7
    
    # マウント
    [vagrant@test1 ~]$ sudo mount -o loop /vagrant/CentOS-7-x86_64-Minimal-1503-01.iso /var/lib/tftpboot/images/centos7
    
    # kernelイメージ、RAMイメージコピー
    [vagrant@test1 ~]$ sudo mkdir /var/lib/tftpboot/centos7
    [vagrant@test1 ~]$ sudo cp /var/lib/tftpboot/images/centos7/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7
    
    # ftpルートにisoの中身コピー
    [vagrant@test1 ~]$ sudo cp -r /var/lib/tftpboot/images/centos7/* /var/ftp/pub/
    
    # PXEブートの設定ファイルを作る
    [vagrant@test1 ~]$ sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg
    [vagrant@test1 ~]$ sudo vi /var/lib/tftpboot/pxelinux.cfg/default
    ★ファイル名「default」の代わりに対象マシンのMacアドレスを16進数表記にした設定ファイルを作成すると、クライアントマシン毎に割り当てられる
    
    default menu.c32
    PROMPT 0
    TIMEOUT 300
    ONTIMEOUT local

    menu title ######## PXE Boot Menu ##########

    label 1
    menu label ^1)CentOS 7 x64 with local Repo
    kernel centos7/vmlinuz
    append initrd=centos7/initrd.img inst.repo=ftp://192.168.33.10/pub
    
    # reboot
    [vagrant@test1 ~]$ sudo reboot

FTPサーバを使用する方法で構築した。

つまったこと

PXEクライアント起動時にブートローダが読み込めない

dhcpd.conf中でnext-serverを省略したためだった。調査した時に、DHCPサーバとTFTPサーバが同じ場合、不要と記載されていたのを鵜呑みにしていたが、実態と異なった。 バージョンによる差異かもしれないが、いずれにせよ公式ドキュメントを正としていくよう心がけたい。

tftpでファイルが見えない

/var/lib/tftpbootをルートにしていて、配下に「centos」と「ubuntu」を用意し、パーミッション・オーナーを統一した。 ところが、centos側だけ、getをしようとするとPermissionDeniedになる。 同名のディレクトリを作成しなおし、再度ファイルコピーして解消された。

インストールが途中で止まる

メモリ割り当てが低すぎた模様。2048MB割り当て、無事に動作した。