init modifications to be able to boot from nfs

Questions related to network booting via PXE
cborivant
Posts: 3
Joined: 22 Jan 2010, 09:08

init modifications to be able to boot from nfs

Postby cborivant » 22 Jan 2010, 09:32

Hello, I use systemrescuecd to boot from the network and deploy a mini ditrib on very old hardware with only 128Mo RAM.

With so few RAM, tftp and http is not an option, so I did some little modifications to the init script to support nfs.
I did not modify the existing logic and did not add any file to the initram.

I you're interested in adding this functionality, here is a diff between the original and the modified version the diff format is suitable for use with patch :

Code: Select all

--- init.orig   2010-01-22 16:20:18.000000000 +0100                                                                                   
+++ init        2010-01-22 10:12:47.000000000 +0100                                                                                   
@@ -93,6 +93,38 @@                                                                                                                   
        return 1                                                                                                                     
 }                                                                                                                                   
                                                                                                                                     
+sysresccd_bootstrap_nfs()                                                                                                           
+{                                                                                                                                   
+       REAL_ROOT="nfs"                                                                                                               
+        mkdir -p /cdrom                                                                                                             
+        if ! mount -t nfs -o intr,nolock ${NFSBOOT} /cdrom                                                                           
+        then                                                                                                                         
+               bad_msg "Cannot mount nfs share on /cdrom"                                                                           
+               sysresccd_runshell                                                                                                   
+        fi                                                                                                                           
+       if [ ! -f "/cdrom/${SUBDIR}/${LOOPDAT}" ]                                                                                     
+       then                                                                                                                         
+               bad_msg "Cannot find the \"${SUBDIR}/${LOOPDAT}\" boot file."                                                         
+               sysresccd_runshell                                                                                                   
+       fi                                                                                                                           
+                                                                                                                                     
+       if [ -x "/usr/bin/md5sum" ]                                                                                                   
+       then                                                                                                                         
+               md5now=$(md5sum /cdrom/${SUBDIR}/${LOOPDAT} | cut -d ' ' -f1)                                                         
+               md5orig=$(cat /cdrom/${SUBDIR}/${LOOPMD5} | cut -d ' ' -f1)                                                           
+               if [ "$md5now" = "$md5orig" ]                                                                                         
+               then                                                                                                                 
+                       DOCHECK=0 # Do not check the md5sum again in the general code (before mount squashfs)                         
+               else                                                                                                                 
+                       bad_msg "The boot file is invalid (invalid md5 checksum $md5now expected $md5orig)"                           
+                       bad_msg "Check you have enought memory available to download thils file."                                     
+                       sysresccd_runshell                                                                                           
+               fi                                                                                                                   
+       else                                                                                                                         
+               bad_msg "md5sum not found: cannot check ${SUBDIR}/${LOOPDAT} file."                                                   
+       fi                                                                                                                           
+}                                                                                                                                   
+                                                                                                                                     
 sysresccd_bootstrap_net()                                                                                                           
 {                                                                                                                                   
        mkdir -p /cdrom # where the downloaded files are copied (docache)
@@ -555,6 +587,10 @@
                        SETGW=`parse_opt "${x}"`
                        LOADNET='1'
                ;;
+               nfsboot\=*) # new option
+                       NFSBOOT=`parse_opt "${x}"`
+                       LOADNET='1'
+               ;;
                netboot\=*) # new option
                        NETBOOT=`parse_opt "${x}"`
                        LOADNET='1'
@@ -778,7 +814,7 @@
 good_msg "Performing the network configuration..."

 # ---- force dhcp if booting via pxe and no static configuration specified
-if [ -n "${NETBOOT}" ]
+if [ -n "${NETBOOT}" -o -n "${NFSBOOT}" ]
 then
        if ! cat /proc/cmdline | busybox grep -q -E 'eth[x0-9]{1,2}=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
        then
@@ -1057,6 +1093,9 @@
        if [ -n "${NETBOOT}" ]
        then
                sysresccd_bootstrap_net # download ISO via http or tftp
+        elif [ -n "${NFSBOOT}" ]
+        then
+                sysresccd_bootstrap_nfs
        else
                sysresccd_findcdmount # classic boot via cdrom/harddisk device
                #sysresccd_bootstrap_cd # classic boot via cdrom/harddisk device
@@ -1211,7 +1250,7 @@
                        echo -n 'boot() :: '
                        read REAL_ROOT
                        got_good_root=0
-               elif [ -b "${REAL_ROOT}" ] || [ "${REAL_ROOT}" = "http" ] || [ "${REAL_ROOT}" = "tftp" ]
+               elif [ -b "${REAL_ROOT}" ] || [ "${REAL_ROOT}" = "http" ] || [ "${REAL_ROOT}" = "tftp" ] || [ "${REAL_ROOT}" = "nfs" ]
                then
                        got_good_root=1
                else

admin
Site Admin
Posts: 2715
Joined: 17 Jul 2003, 09:44

Re: init modifications to be able to boot from nfs

Postby admin » 23 Jan 2010, 23:13

Thanks for your contribution. This patch has been applied on the linuxrc2 script in sysresccd-1.3.5-beta8.
Can you please try that version when it's available ?

You will have to boot with "rescuecd rdinit=linuxrc2" to use the testing init script.
The plan is to use that script by default in sysresccd-1.4.0.

cborivant
Posts: 3
Joined: 22 Jan 2010, 09:08

Re: init modifications to be able to boot from nfs

Postby cborivant » 25 Jan 2010, 06:54

First boot from nfs with 1.3.5 beta 8 OK !

admin
Site Admin
Posts: 2715
Joined: 17 Jul 2003, 09:44

Re: init modifications to be able to boot from nfs

Postby admin » 25 Jan 2010, 21:35

Thanks for your test. This initscript is now the default in sysresccd-1.4.0-beta1, so no need for an extra rdinit option.

Could you please post quick instructions in this topic to configure the nfs server ? Is that working with nfs3, nfs4, both ?

Thanks

cborivant
Posts: 3
Joined: 22 Jan 2010, 09:08

Re: init modifications to be able to boot from nfs

Postby cborivant » 27 Jan 2010, 16:55

Ok,

You first need to decide which folder you will share via nfs.
If you choose something like /tftpboot, you'll need have the following line in /etc/exports :

Code: Select all

/tftpboot *(ro,no_subtree_check,all_squash,insecure,anonuid=1000,anongid=1000)


This will allow anybody to access the directory read-only.

On Centos, you can the start or restart nfs :

Code: Select all

service nfs start
or
service nfs restart


Then you need to tell System Rescue CD where to find sysrcd.dat and sysrcd.md5 in pxelinux configuration file
( pxelinux.cfg/default in my case )
You can choose to put the file in a subdirectory. For example, I choose to put the files in /tftpboot/masterclientslegers
The subdir parameter will tell in which subdirectory the files will be and the nfsboot will tell which nfs share will be mounted

Code: Select all

append initrd=sysresccd/initramnfs.igz setkmap=fr subdir=masterclientslegers nfsboot=192.168.1.167:/tftpboot


From what I've been able to understand in busybox source code, both nfs 3 and 4 could be supported (http://git.busybox.net/busybox/tree/util-linux/mount.c).
But nfs v4 need configuration on the client side for security reasons. So to be able to support nfs 4, init would need more modifications. ( If you read the following link, you'll easily understand why : http://www.brennan.id.au/19-Network_Fil ... .html#nfs4 ).
So yet, only nfs 3 is supported.

admin
Site Admin
Posts: 2715
Joined: 17 Jul 2003, 09:44

Re: init modifications to be able to boot from nfs

Postby admin » 21 Feb 2010, 22:17

I have added a section about Booting SystemRescueCd from the network using NFS v3 in the official documentation.


Return to “Network Boot via PXE”

Who is online

Users browsing this forum: No registered users and 1 guest