カテゴリー: FreeBSDとLinux
参照数: 3438

作業PCも3年目になり、そろそろ、新調するかなと思いました。

それで、マザーボードを新しくして、HDDを増やしてなんて考えたのですが、HDDを買うのもったいないなと。

うちは、FreeBSDをZFSで運用していて、これをミラーしています。

このディスクにOSイメージを入れて、ここから起動すればHDDを買わなくて良いのじゃないっと思いました。

ということで、ネットワークブートにチャレンジすることにします。

色々なOSを入れてみて起動時に切り替える状態にするのが理想ですね。

・Fedora

・Ubuntu

・OpenSUSE

この3つを実現してみます。

ネットワークブートに必要な物って、とにかくtftpサーバとdhcpです。

tftfpサーバは、FreeBSDにて、inet.confのtftpの部分のコメントを外せばすぐに起動します。

dhcpは、別サーバでやっているのですが、isc-dhcpサーバということで、内容は、同じです。

まず、ネットワークブートには、iPXEといのが要です。これは、ブートロムといわれるもので、本来NICにROM実装されているものです。通常のNICには、PXEが導入されているのですが、iPXEは、導入されていません。しかしながら、PXEからiPXEをブートすることで、この問題を回避することができます。

とりあえず、iPXEを作成します。

http://ipxe.org/download <- ここからダウンロードして、makeすると、undionly.kpxeが、binの直下に作成されます。

このファイルをtftpサーバのルートにでも、置いて下さい。

 

dhcpの設定

対象のレンジの設定の内に追記します。

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.10 192.168.0.40;
 -------------------

next-server 192.168.0.1;   <-- tftpサーバIPアドレス

host pc1 {

        hardware ethernet 00:01:02:03:04:05;    <-- 対象のNIC MACアドレス
        fixed-address 192.168.0.50;                    <-- 割り当てるIPアドレス
        if exists user-class and option user-class = "iPXE" {
            filename "http://192.168.0.90/ipxe/boot.ipxe";    <-- iPXEのスクリプト(参照先を記述)
        } else {
            filename "undionly.kpxe";                                    <--iPXEファイル名
        }
}

もし、apache web serverを導入していない場合、dhcp設定のfilenameをいかのようにして、tftpでロードさせるようにしてもOKです。

filename "tftp://192.168.0.90/ipxe/boot.ipxe"; <-- IPアドレスを適時環境に合わせて下さい。

 

さて、肝心のハードディスクを作成します。

ここは、FreeBSDでzfsを利用していることを前提としています。

zfs create -V 100g zroot/iscsi/hdd1   <-- zfsボリューム上に領域を確保します。

zfs create -V 100g zroot/iscsi/hdd2


zfs create -V 100g zroot/iscsi/hdd3

次に、iscsiで、共有します。

iscsiは、istgtを使いますので、portsかパッケージでセットアップしておいて下さい。

/usr/local/etc/istgt/istgt.conf

---------

[LogicalUnit1]
  Comment "Hard Disk 1"
  TargetName disk1
  TargetAlias "Data Disk1"
  Mapping PortalGroup1 InitiatorGroup1
  AuthMethod Auto
  AuthGroup AuthGroup1
  UseDigest Auto
  UnitType Disk
  LUN0 Storage /dev/zvol/zroot/iscsi/hdd1 Auto

[LogicalUnit2]
  Comment "Hard Disk 2"
  TargetName disk2
  TargetAlias "Data Disk2"
  Mapping PortalGroup1 InitiatorGroup1
  AuthMethod Auto
  AuthGroup AuthGroup1
  UseDigest Auto
  UnitType Disk
  LUN0 Storage /dev/zvol/zroot/iscsi/hdd2 Auto

[LogicalUnit3]
  Comment "Hard Disk 3"
  TargetName disk3
  TargetAlias "Data Disk3"
  Mapping PortalGroup1 InitiatorGroup1
  AuthMethod Auto
  AuthGroup AuthGroup1
  UseDigest Auto
  UnitType Disk
  LUN0 Storage /dev/zvol/zroot/iscsi/hdd3 Auto

 

次に、iPXEのスクリプトboot.ipxeを作成します。

このファイルが、かなり重要です。

 #!ipxe

# Some menu defaults
set menu-timeout 60000
set submenu-timeout ${menu-timeout}
isset ${menu-default} || set menu-default ubuntu

# Figure out if client is 64-bit capable
cpuid --ext 29 && set arch x64 || set arch x86
cpuid --ext 29 && set archl amd64 || set archl i386

###################### MAIN MENU ####################################

:start
menu iPXE boot menu for ${initiator-iqn}
item --gap --             ------------------------- Operating systems ------------------------------
item --key u fedora       Boot Fedora from iSCSI
item --key u ubuntu      Boot Ubuntu from iSCSI

item --key u opensuse     Boot OpenSUSE from iSCSI
item --gap --             ------------------------- Tools and utilities ----------------------------
item --key i menu-install Installers...
item --gap --             ------------------------- Advanced options -------------------------------
item --key c config       Configure settings
item shell                Drop to iPXE shell
item reboot               Reboot computer
item
item --key x exit         Exit iPXE and continue BIOS boot
choose --timeout ${menu-timeout} --default ${menu-default} selected || goto cancel
set menu-timeout 0
goto ${selected}

:cancel
echo You cancelled the menu, dropping you to a shell

:shell
echo Type 'exit' to get the back to the menu
shell
set menu-timeout 0
set submenu-timeout 0
goto start

:failed
echo Booting failed, dropping to shell
goto shell

:reboot
reboot

:exit
exit

:config
config
goto start

:back
set submenu-timeout 0
clear submenu-default
goto start

############ MAIN MENU ITEMS ############

:fedora
echo Booting Fedora from iSCSI for ${initiator-iqn}
sanboot iscsi:192.168.0.90::::iqn.2007-09.jp.ne.peach.istgt:disk1 || goto failed
goto start

:ubuntu
echo Booting Ubuntu from iSCSI for ${initiator-iqn}
sanboot iscsi:192.168.0.90::::iqn.2007-09.jp.ne.peach.istgt:disk2 || goto failed
goto start

:opensuse
echo Booting OpenSUSE from iSCSI for ${initiator-iqn}
sanboot iscsi:192.168.0.90::::iqn.2007-09.jp.ne.peach.istgt:disk3 || goto failed
goto start


############################ INSTALLER MENU #########################

:menu-install
menu Installers for ${initiator-iqn}
item fedora-install       Install fedora ${archl} from riken
item ubuntu-install       Install ubuntu ${archl} from riken
item opensuse-install     Install opensuse ${archl} from riken

item
item --key 0x08 back      Back to top menu...
iseq ${menu-default} menu-install && isset ${submenu-default} && goto menu-install-timed ||
choose selected && goto ${selected} || goto start
:menu-install-timed
choose --timeout ${submenu-timeout} --default ${submenu-default} selected && goto ${selected} || goto start

:fedora-install
echo Starting Fedora 20 ${archl} installer for ${initiator-iqn}
set mirror http://ftp.riken.jp/Linux/fedora/releases/20
cpuid --ext 29 && set arch x86_64 || set arch i386
set repo ${mirror}/Fedora/${arch}/os
# Start installer
kernel ${repo}/images/pxeboot/vmlinuz initrd=initrd.img repo=${repo}
initrd ${repo}/images/pxeboot/initrd.img
boot || goto failed
goto start

:ubuntu-install
echo Starting Ubuntu 14.04 ${archl} installer for ${initiator-iqn}
set mirror http://ftp.riken.go.jp/Linux/ubuntu/dists/trusty/
cpuid --ext 29 && set arch amd64 || set arch i386
set repo ${mirror}/main/installer-${arch}/current/images/netboot/ubuntu-installer/${arch}/
# Start installer
kernel ${repo}/linux
initrd ${repo}/initrd.gz
boot || goto failed
goto start

:opensuse-install
echo Starting OpenSuse 13.1 ${archl} installer for ${initiator-iqn}
set mirror http://ftp.riken.jp/Linux/opensuse/distribution/13.1/repo/oss
cpuid --ext 29 && set arch x86_64 || set arch i386
set repo ${mirror}/boot/${arch}/loader
# Start installer
kernel ${repo}/linux TargetAddress=192.168.0.90 TargetName=iqn.2007-09.jp.ne.peach.istgt:disk3 TargetPort=3260
initrd ${repo}/initrd
boot || goto failed
goto start
 

この状態で、PXEでブートを行うと、メニューが出てくるまでになるはずです。

上記のサンプルは、tftpサーバ、httpサーバ、iscsiサーバが、192.168.0.90を想定しています。

dhcpサーバは、対象セグメントにて起動していれば良いです。

 

Ubuntu14ですが、一気にデスクトップをインストールすると、起動できなくなるようです。

最小構成でインストールしてから、後で、デスクトップをインストールするとうまくいきました。