2016年2月1日月曜日

Gentoo LinuxをPXEブート

Gentoo LinuxをPXEブート


Gentoo Linuxって他のディストリビューションと違ってPXEのイメージが配布されてないんですよね。だからGoogleさんに聞いてみたら。やはりやっている人がいました。install-minimal-${ARCH}-date.isoをPXE出来るようにするスクリプトを書いている人が、ただ更新が速いGentooなので既に動かなくなっていたので修正してみました。

以下がコードになります。

gentoo-pxe-convert.sh
#!/bin/bash

# automates the procedure outlined at: http://blog.dastrup.com/?p=12

MOUNT=$1
OUT=$2

if [ x$MOUNT == "x" -o x$OUT == "x" ]; then
        echo usage: $0 [MOUNT] [OUT]
        exit 1
fi

echo converting gentoo iso mounted at $MOUNT into PXE-bootable stuff at $OUT

mkdir -p $OUT
cp $MOUNT/isolinux/gentoo $OUT/
cp $MOUNT/isolinux/gentoo.igz $OUT/
cp $MOUNT/image.squashfs $OUT/

mkdir -p $OUT/work

pushd $OUT/work > /dev/null 2>&1
echo decompressing initrd
xz -d -c ../gentoo.igz | cpio -idv > /dev/null 2>&1
mkdir -p mnt/cdrom
mv ../image.squashfs mnt/cdrom/

patch -p0 --ignore-whitespace <<'EOF'
--- init.orig   2016-01-31 07:22:56.619082092 +0900
+++ init        2016-01-31 07:28:40.100068255 +0900
@@ -455,10 +455,6 @@
                CHROOT=${NEW_ROOT}
        fi

-       if [ /dev/nfs != "$REAL_ROOT" ] && [ sgimips != "$LOOPTYPE" ] && [ 1 != "$aufs" ]; then
-               bootstrapCD
-       fi
-
        if [ "${REAL_ROOT}" = '' ]
        then
                warn_msg "No bootable medium found. Waiting for new devices..."
@@ -591,7 +587,7 @@
                else
                        bad_msg "Block device ${REAL_ROOT} is not a valid root device..."
                        REAL_ROOT=""
-                       got_good_root=0
+                       got_good_root=1
                fi
        done

@@ -670,8 +666,6 @@
        [ -z "${LOOP}" ] && find_loop
        [ -z "${LOOPTYPE}" ] && find_looptype

-       cache_cd_contents
-
        # If encrypted, find key and mount, otherwise mount as usual
        if [ -n "${CRYPT_ROOT}" ]
        then
@@ -712,7 +706,7 @@
                                # Upgrade to cached version if possible
                                [ "${DO_cache}" -a -f "${_CACHED_SQUASHFS_PATH}" ] \
                                                && _squashfs_path=${_CACHED_SQUASHFS_PATH}
-                               mount -t squashfs -o loop,ro "${_squashfs_path}" "${NEW_ROOT}/mnt/livecd" || {
+                               mount -t squashfs -o loop,ro "/mnt/cdrom/${LOOPEXT}${LOOP}" "${NEW_ROOT}/mnt/livecd" || {
                                        bad_msg "Squashfs filesystem could not be mounted, dropping into shell."
                                        if [ -e /proc/filesystems ]; then
                                                fgrep -q squashfs /proc/filesystems || \
EOF

echo recompressing initrd
#find . -print | cpio -o -H newc 2>/dev/null | xz -9 -c - > ../gentoo.igz
find . -print | cpio -o -H newc 2>/dev/null > ../gentoo.igz
popd > /dev/null 2>&1
rm -r $OUT/work

echo done.
使い方はISOイメージをマウントし、例えばマウントポイントが/mnt/cdromならgentoo-pxe-convert.sh /mnt/cdrom hogeって感じにするとhogeの中にgentoo、gentoo,igzってファイルが出来上がるのでtftpdでKERNELとINITRDとして指定します。

tftpd'(32|64)のpxelinux.cfg/defaultだと次のようになります。

DEFAULT menu.c32

LABEL gentoo-amd64
MENU LABEL ^1. Gentoo-amd64
KERNEL /gentoo-amd64/gentoo
APPEND initrd=/gentoo-amd64/gentoo.igz root=/dev/ram0 init=/linuxrc loop=/image.squashfs looptype=squashfs cdroot=1 real_root=/dev/loop0

LABEL gentoo-x86
MENU LABEL ^2. Gentoo-x86
KERNEL /gentoo-x86/gentoo
APPEND initrd=/gentoo-x86/gentoo.igz root=/dev/ram0 init=/linuxrc loop=/image.squashfs looptype=squashfs cdroot=1 real_root=/dev/loop0


Gentooなのですぐに変更されると思うんだけれどしばらくは使えると思います。そしてオリジナルの作者に感謝!

3 件のコメント: