HOWTO Clone Disk Images on Linux Booted from a Network

Guilherme Tupynamba'

gtupy (at) uol.com.br

{FFj -

yasufumi.haga@nifty.com

2002N 9 9

Revision History                                                      
Revision 0.3         2002N 9 24          Revised by: gct         
ǂ̏gݍ                                                  
Revision 0.2         2002N 9 23          Revised by: jyg         
}Ci[                                                          
Revision 0.1         2002N 9 9           Revised by: gct         
htg                                                        

{ł́AGrub u[g[_[pāA BOOTP/TFTP  Linux u[g
ł悤ɂ@ƁA TFTP T[o[Ƃ̊ԂŁAfBXNp[eBV
̃C[W̃Z[u^XgAł悤ɂ@܂B

 

Table of Contents
1. @Im
   
    1.1. Ɛӏ
    1.2. 쌠
    1.3. tB[hobN
   
2. ͂߂
   
    2.1. fBXNC[W̃N[闝R
    2.2. lbg[Nu[g闝R
    2.3. lbg[Nu[g̊T
   
3. DHCP T[o[ TFTP T[o[̐ݒ
   
    3.1. DHCP ̐ݒ
    3.2. TFTP ̐ݒ
    3.3. ʂ̃T[o[gp
   
4. u[gt@C̏
   
    4.1. J[l
    4.2. initrd ̃t@C
    4.3. initrd ̍쐬
   
5. Grub ptbs[fBXÑu[g
   
    5.1. Grub ̃j[t@C
    5.2. lbg[NT|[g Grub ̃RpC
    5.3. u[gtbs[fBXN̍쐬
   
6. clone XNvg̎s
   
    6.1. fBXNC[W̕ۑƃXgA
    6.2. fdisk ̎gp
   
7. \[V̊g
   
    7.1. t@CVXeł͂ȂAt@C̕ۑƃXgA
    7.2. }X^[u[gR[h̐ݒ
    7.3. KvȃW[̃[h
    7.4. grub.confŗ\ߒ`Ă鑀
   
8. {Ŏӎ
A. initrd ̃t@Cꗗ
B. Clone XNvg
References

1. @Im

1.1. Ɛӏ

Ř_Ă鎖ɂẮAĂ@pɂA
Zp̊TOR}hnmĂ邱ƂOɂȂĂ܂B{
fڂĂR}hsɕsAN[XNvg𗝉
ĂȂꍇ́A̎w͎sȂŉB

āA/dev/hda  /dev/hda1 ̈ႢȂꍇ́A{ HOWTO ͎gp
ȂŉB́A炭p[eBṼXgAƁASf[^
r̈ႢɂȂ܂BŘ_Ăě肪̃G[ł
A܂sȂɑ΂ӔĆAM҂͂ȂƂo
ĂĉB

{̖ړIAT[o[ƃNCAg̗ŁA RedHat 7.3 fBXg
r[Vgp܂B債Ⴂ͏oȂƎv܂ÃfBX
gr[VJX^ZbgAbv̊ł́AeXg͍sȂ܂
łB

 

1.2. 쌠

쌠 (c) 2002 ́AGuilherme Tupynamba' LĂ܂B

{̕AzzAȂύX́A Free Software FoundationJĂ
At[p_ <http://www.gnu.org/copyleft/fdl.html> i
GNU Free Documentation License j̃o[W 1.1 Ȃ͂ȍ~̏
ŋBAύXs\ƁA\\ƁA
ї\ƁBN[XNvǵA GNU ʌOp_
(GPL) <http://www.gnu.org/copyleft/gpl.html> ̏ŃCZXĂ
B

 

1.3. tB[hobN

{Ɋւ邲ӌɂ͓Ɋӂ܂Bӌ͒ځA<gtupy (at)
uol.com.br> Ăɂ肢܂B

 

2. ͂߂

2.1. fBXNC[W̃N[闝R

fBXNC[W̃N[ȗŔAcȐ̃}Vɑ΂A
Iy[eBOVXe{IȃAvP[VZbg̃CXg[
yɍsȂ߂łBWɂȂ̃}VpӂA̍ŏ̂ꂢ
ȃC[WۑĂÃ}VɃXgA悤ɂ΁AJ͂
ߖ񂵁A菇ȗ邱ƂɂȂ܂B

 

2.2. lbg[Nu[g闝R

n[hfBXNu[gĂ܂ƁAC[WRs[錩݂
ȂĂ܂܂B΁Au[gIy[eBOVXe
}EgĂp[eBVƂ̊ԂŁARs[SɍsȂƂ͕s
\ł傤B܂AIy[eBOVXe Linux ł͂Ȃꍇ
B̏ꍇ́AIvVRɎgAN[쐬łȂȂ
B

 

2.3. lbg[Nu[g̊T

NCAg@ Grub ŁAtbs[fBXNu[g܂Bꂩ
Grub  BOOTP T|[gpāA DHCP T[o[ IP AhX擾
܂BɁANCAg@ TFTP T[o[J[l initrd C[
W擾܂B initrd C[WɃ}EgĂ܂΁A
XNvgÃC[WɊi[ĂvOƃt@C𗘗p
܂B̃XNvgg΁A TFTP T[o[ɃubNfoCX̓e
ۑA TFTP T[o[eubNfoCXɏނƂ
ł悤ɂȂ܂B

 

3. DHCP T[o[ TFTP T[o[̐ݒ

DHCP T[o[ Grub (BOOTP) u[gǍ Linux u[g
ANCAg IP AhX񋟂̂ɕKvȂ̂łB TFTP T[o
[́ALinux ̃u[gpɁAlbg[Nŗpłłu[gC[W
̂ɕKvɂȂ܂BfBXNC[W̕ۑ^XgA\ɂ
ۂɂA TFTP T[o[͕KvɂȂ܂B

 

3.1. DHCP ̐ݒ

DHCP ̏ڍׂ͖{̔ez܂B "Linux Networking HOWTO"  DHCP
̏͂܂B

DHCP ̐ݒ͔ɊȒPłBłA̐lǗĂlbg[Nɂ
ꍇ́A쒆 DHCP T[o[głBŃlbg[N
ǗĂ̂ȂA̎菇ɂĂ܂܂B

܂ DHCP CXg[ĂȂꍇ́A rpm pbP[WCXg[
ĉBʂ Linux ̃fBXgr[V̒Ɍ܂B

# rpm -ihv dhcp-*.rpm                                                  
                                                                       

/etc/dhcpd.conf t@CҏWāA DHCP T[rXݒ肵ĉB{
̐ݒ́AT[o[ IP AhX 10.0.0.1 ŁA 253 ܂ł̃N
CAg IP AhX񋟂܂B̊ɉāA /etc/
dhcpd.conf ݒ肵ĉB

#/etc/dhcpd.conf                                                       
server-identifier dhcp.clonedomain.com;                                
default-lease-time      172800;                                        
max-lease-time          604800;                                        
option domain-name      "clonedomain.com";                             
subnet 10.0.0.0 netmask 255.255.255.0 {                                
        range dynamic-bootp 10.0.0.2 10.0.0.254;                       
}                                                                      
                                                                       

dhcpd T[o[̃X^[g

/etc/rc.d/init.d/dhcpd start.

 

3.2. TFTP ̐ݒ

TFTP ̐ݒADHCP ƂقƂǓ炢ȒPłB

܂Arpm pbP[WCXg[܂B

# rpm -ihv tftp-server-*.rpm                                           
                                                                       

āAt@Ci[fBNg܂B

# mkdir /tftpboot                                                      
# chown nobody:nobody /tftpboot                                        
                                                                       

nobody Ƃ̂́A ftfpd t@CANZXۂɐݒ肷AfBt
Hg̃[U[ ID ɂȂ̂ŁA /tftpboot ƂfBNg̏L҂
A nobody ɂ܂B

/etc/xinetd.d/tftp t@Ĉ悤ɕҏW܂B

service tftp                                                           
{                                                                      
        socket_type     = dgram                                        
        protocol        = udp                                          
        wait            = yes                                          
        user            = root                                         
        server          = /usr/sbin/in.tftpd                           
        server_args     = -c -s /tftpboot                              
        disable         = no                                           
        per_source      = 11                                           
        cps             = 100 2                                        
}                                                                      
                                                                       

fBtHg̃t@CύX̂́A disable = noiT[rXL
jp[^ƁAT[o[ɗ^ -c łB҂̈^
At@C̐\ɂȂ܂B̓u[gC[WfBXNC[
WۑꍇɕKvɂȂ܂Bʏ̑ł́ATFTP ǂݎ̂
ɂĂKv邩m܂B

xinetd ă[h܂B

/etc/rc.d/init.d/xinetd reload

T[o[̃eXgɂ́Atftp R}hg܂B̃R}h́A tftp
rpm pbP[WiNCAgpjCXg[Ηpł܂B

 

3.3. ʂ̃T[o[gp

DHCP  TFTP ɊւẮAʂ̃T[o[gp邱Ƃł܂B͓
쒆 DHCP T[o[gpꍇɕKvɂȂ邩܂B DHCP 
next-server p[^ݒ肵āA TFTP T[o[w悤ɂA
Grub  tftpserver R}hgƂł܂B

 

4. u[gt@C̏

ŃT[o[̐ݒ͂ł܂B̓NCAgu[gt@C
Kv܂Bɂ͓̃t@CKvɂȂ܂B
́AJ[lƏ RAM fBXN(initrd) łB҂́AJ[l[
gt@CVXeƂă}EĝłB{ł́A{߂Ǝ߂
T菇́ANCAg@ō쐬̂ƂĂ܂BfBXNC
[W̕ۑ^XgA̍ۂ́Aʃ[J̃n[hfBXN Linux C
Xg[Kv͂܂BłÃ}VɃfBXNC[W
zuꍇ́Ae}ṼfƂȂÃ}V Linux CXg
[邱Ƃn߂ĉB DHCP gAO߂Őݒ肵Ƃ TFTP
NCAgŃeXgĉBɎw肵ȂAR}h݂͌̃f
BNgŁA[U[ root  bash VFŎs܂B

 

4.1. J[l

kꂽJ[l̃t@C肵܂B

# cd /boot                                                             
# ls vmlinuz-$(uname -r)                                               
vmlinuz-2.4.18-3                                                       
                                                                       

̃o[ẂAVXeɂėlXłB̃t@C TFTP T[o
[ɃAbv[hAO vmlinuz ɕς܂B

# tftp 10.0.0.1                                                        
tftp> binary                                                           
tftp> put vmlinuz-2.4.18-3 vmlinuz                                     
Sent 1030147 bytes in 2.3 seconds                                      
tftp> quit                                                             
                                                                       

J[l̃t@ĆAn[hEFAقȂAJ[l̃o[W
ɂẮÂ܂܂ɂĂKv邩mȂAʂ̖Oɂ
Kv邩m܂Bł́AJ[l initrd ɊւāA
Op܂B΁AJ[l initrd C[WύXĂAʂ
u[gtbs[fBXN쐬KvȂȂ܂B

 

4.2. initrd ̃t@C

ɁANCAgpɃ[gt@CVXẽC[W쐬܂B
̃t@C̊SȃXǵAAppendix A ɂ܂B

̃t@ĆA͂ȃVF(bash)pӂ邽߂́AŒ̐ݒƂ
A쒆̃VXe玝Ă܂BNCAgp̃lbg[N[
eBeB (dhcpcd  tftp)ARs[Ek[eBeB (dd, gzip)A
ǗpR}h (mknod  mount, fdisk  insmod) ܂B

݂̃fBNgŁA initrd.lst ƂÕfBNg쐬A
̃t@CɒuĉB̃VXeł̃t@C
݂邩ǂm߂ɂ́ÃR}hsĉB

# ls -d $(<initrd.lst) > /dev/null                                     
                                                                       

ȉ̂悤ȃG[o͂͂łB

ls: /bin/clone: No such file or directory                              
ls: /bin/tftp: No such file or directory                               
ls: /lib/3c59x.o: No such file or directory                            
                                                                       

ŏ̃G[́Ã݂fBNgɍ邱ƂɂȂĂXNvgł
BԖڂ̃G[́A /bin ł͂ȂA /usr/bin fBNgŌ 
tftp vOłBOԖڂ̓lbg[NC^tF[XJ[h̃W[
iԂ񎩕̂ł͂Ȃł傤jŁA /lib/modules/$(uname -r)/kernel/
drivers/net Ō̂łB

̎O̃t@CɂẮAȍ~̐߂Ōʂɂ_܂Bɂ
t@C΁ACXg[̂YƂAo[ẄႢAfBXg
r[Vn[hEFÄႢ𒲂ׂĉBāÃXg
̃VXe̍悤ɒĉB

 

4.3. initrd ̍쐬

̓C[W쐬iKłB{ł̐ݒ肾ƁA 4 KoCg̑傫
΁A[t@Cێł܂BKvȂTCY傫Ă
܂܂B

# dd if=/dev/zero of=initrd bs=1024 count=4096                         
4096+0 records in                                                      
4096+0 records out                                                     
# yes | mkfs initrd                                                    
mke2fs 1.27 (8-Mar-2002)                                               
initrd is not a block special device.                                  
Proceed anyway? (y,n) Filesystem label=                                
blah blah blah...                                                      
# mkdir mnt                                                            
# mount -o loop initrd mnt/                                            
# egrep -v "clone|3c59x|tftp" initrd.lst | cpio -pdm mnt               
4876 blocks                                                            
                                                                       

āAegrep R}hŁAt@COO܂BŁAtftp v
OA /usr/bin C[WfBNgɃRs[܂B

# cp -p /usr/bin/tftp mnt/bin/                                         
                                                                       

lbg[NC^tF[XJ[hpɂ́AW[肵ĉ
B̃t@C肷ɂ́A lspci R}hƁA lsmod R}h̏o
͂p܂B̃W[́A /lib/modules/$(uname -r)/kernel/
drivers/net ɂ܂B

    Note: 3c59x ƂOgĂƂ낪΁AׂĎ̃P[
    XɍW[ɓǂݕςĉB
   
# cp -p /lib/modules/$(uname -r)/kernel/drivers/net/3c59x.o mnt/lib/   
                                                                       

Appendix B ɂN[XNvgҏWāA Section 6 Ő
ύX܂B̃t@Cs\ȃp[~bVɂāAC[W
fBNgɃRs[ĉB

# chmod +x clone                                                       
# cp -p clone mnt/bin/                                                 
                                                                       

initrd C[WA}EgAkĂA TFTP T[o[ɑ܂
B

# umount mnt/                                                          
# gzip initrd                                                          
# tftp 10.0.0.1                                                        
tftp> binary                                                           
tftp> put initrd.gz                                                    
Sent 1155530 bytes in 2.8 seconds                                      
tftp> quit                                                             
                                                                       

 

5. Grub ptbs[fBXÑu[g

̒iḰAGrub pu[gtbs[fBXN̍쐬łB Grub Ƃ
AGRand Unified Bootloader ̂ƂłB BOOTP  TFTP 
ŁAlbg[Nu[gł܂B

 

5.1. Grub ̃j[t@C

݂̃fBNgŁA grub.conf ƂOŁAȉ̂悤ȓẽt@C
܂B

default=0                                                                  
timeout=1                                                                  
title Clone                                                                
        bootp                                                              
        root (nd)                                                          
        kernel /vmlinuz rw root=/dev/ram ramdisk_size=4096 init=/bin/clone 
        initrd /initrd.gz                                                  
                                                                           

Ō 4 śAlbg[Nu[ĝɎgA Grub ̃R}hł
B

 E bootp ́A DHCP T[o[ IP AhX擾̂Ɏg܂B
   
 E root (nd) ́Albg[NiTFTP T[o[j̃[gݒ肷̂Ɏg
    ܂B tftpserver <tftp server> R}hg΁ÃR}h
    OɁAʂ TFTP T[o[ݒł܂B
   
 E kernel ́AJ[lt@CƂ̃p[^w肵܂B
   
      rw ́A[gt@CVXe݉\ɂă}Eg
        w肵܂B
       
      root ́AiRAM ́j[gt@CVXeǂɃ}E
        ĝw肵܂B
       
      ramdisk_size ́A RAM fBXÑTCYw肵܂B 4096 iko
        CgjfBtHg̑傫łAƑ傫ȃC[WKv
        ȂAɉẴp[^ύXĉB
       
      init ́Aiinit  sh ꍇɁjA[U[[hœŏ
        ̃vOȉꍇ clone XNvgjw肵܂B
       
 E initrd ́A[gt@CVXẽC[WێĂt@C
    w肵܂B
   
 

5.2. lbg[NT|[g Grub ̃RpC

Grub RpCꍇ́AŏɃ\[X tar {[ the Grub web
site <http://www.gnu.org/software/grub/> _E[hAWJ܂
BāA쐬΂̃j[t@CƁAlbg[NC^tF[
XJ[ȟ^Ɏw肵āA configure s܂Bꂩ炢
ƂAmake s܂B

# tar xzf grub-0.92.tar.gz                                             
# cd grub-0.92                                                         
# ./configure --enable-preset-menu=../grub.conf --enable-3c90x         
# make                                                                 
                                                                       

JԂ܂A 3c90x Ƃ^AgĂlbg[NC
^tF[XJ[ȟ^ɓǂݕςĂB̍ہAŏɁAGrub 
^T|[gĂ邩ǂׂĉB

 

5.3. u[gtbs[fBXN̍쐬

x Grub RpCAu[gtbs[fBXÑC[ẂA
stage1/stage1 t@C stage2/stage2 t@CA΂ł܂B
̃tbs[fBXN쐬ɂ́ÃR}hsĉB

# cat stage1/stage1 stage2/stage2 | dd of=/dev/fd0                     
                                                                       

ŁAu[gtbs[fBXNł͂łB

 

6. clone XNvg̎s

Appendix BŎĂA clone XNvg͕K{ł͂܂B init=/
bin/bash J[lp[^ɂāAp\ȃR}hvO
słVFŏIĂ܂܂B

̃XNvgɕ\̂́AȂ̃R}hA^Cv
~XQ\炷߂łB tftp_server  nic_module
A major_aA family_a  image_a Ƃϐ́ÅAv
P[V̍킹ĕύXKv܂B

ӂė~̂́Az major_a Ɣz family_a ͑ΉĂƂ
ƂłB̃t@~[ɌW[ԍ^ƁA[U[Ɍ
ƂɂȂ܂BdvȃfoCXifBXNƃp[eBV̑S
j̃W[ԍƃ}Ci[ԍ́A /dev fBNg̃Xgł킩
BW[ԍƃ}Ci[ԍ́A ls -l R}h̏o͂ɂAJ}
؂ꂽAʏ̃t@Cƃt@CTCYꏊɂ܂B

# ls -l /dev/fd0 /dev/hda /dev/hda1 /dev/hdc                           
brw-rw----    1 root     disk       2,   0 Apr 11 11:25 /dev/fd0       
brw-rw----    1 root     disk       3,   0 Apr 11 11:25 /dev/hda       
brw-rw----    1 root     disk       3,   1 Apr 11 11:25 /dev/hda1      
brw-rw----    1 root     disk      22,   0 Apr 11 11:25 /dev/hdc       
                                                                       

set -e R}h́AVFɃXNvgA{[g悤ŵŁA
[ȊÕR[hԂ͂łBʏ̏Î悤ɁA "Kernel panic:
Attempted to kill init!" ƂbZ[Wɑ܂BłA낽
ȂŁI̊ł́AꂪʂȂ̂łBRs[^𗎂Ƃ
܂܂BXNvgI点Ă̌ꂵbZ[WOɁA
Ctrl-Alt-Del āAƃu[gĉB

insmod R}h́Albg[NC^tF[XW[[hR}
hŁA dhcpcd R}h́A DHCP NCAgX^[gR}h
łB Grub ̃u[g DHCP gpƂƂƁA Linux 
ƂƂƂA֌WȂƂɒӂĉB

̃XNvgł́AeXJԂsȂ߂ɁA傫ȃ[vs
Ă܂B܂A̎Oނ̑̒̂ǂsȂuĂ܂B
lbg[NfoCXւ̃Rs[AfoCXlbg[Nւ̃Rs[
A fdisk ̎sBɁAgpubNfoCXǂꂩuĂ܂B
major_a źAgpłubNfoCX̃W[ԍĂ܂
B܂Afamily_a ɂ́AfoCXt@~[X̖̂Ă܂B
AgpubNfoCX̃}Ci[ԍuĂ܂B

 

6.1. fBXNC[W̕ۑƃXgA

Rs[̓̈IԂƁAXNvg͕ۑȂ̓XgAC
[W̖OuĂ܂BC[Ŵ́Aimage_a z̗vfɌ肳
Ă܂B̖O݂Ȃ΁AC[WƓÓAOtpC
v܂BŌɁAdd  tftp 𓯎ɋNAC[W]܂B
 ftp Ƃ͈ႢA tftp ͖OtpCvA傤Ǖʂ̃t@C
̂悤 put  get 肵܂B

 

6.2. fdisk ̎gp

fdisk IԂƁAubNfoCXɑ΂ċN܂B fdisk ͕ʁA
̃p[eBVł͂ȂAtɃfBXNŜɑ΂Ďs܂B
ė~̂́Aʏ /dev/hda ƌĂł̂A clone XNvgł
/dev/hda0 ƂȂ邱ƂłB]݂ȂAXNvg fdisk uāAp
[eBV邱Ƃ\łB

 

7. \[V̊g

7.1. t@CVXeł͂ȂAt@C̕ۑƃXgA

ۑ̂fBXNC[WŜł͂ȂAt@CVXe̒ɂ
t@CȂA dd ̑ɁA tar  cpio ŁA悤ȃ\[V
g܂Bt@CVXe}EgKv͂܂BȉɎ
悤ɁA clone XNvgɂƃR}hǉĉB

# mkdir /mnt                                                           
# mount ${device_name} /mnt                                            
# mknod ${image} p                                                     
# tftp ${tftp_server} <<-EOT &                                         
binary                                                                 
put ${image}                                                           
EOT                                                                    
tar czf ${image}                                                       
                                                                       

or

# tftp ${tftp_server} <<-EOT &                                         
binary                                                                 
get ${image}                                                           
EOT                                                                    
tar xzf ${image}                                                       
                                                                       

initrd C[Wɂ́AXNvgg悤ɁA mkdir vO tar
vOuĂKv܂B

 

7.2. }X^[u[gR[h̐ݒ

{̓epăp[eBV̍ĕ҂TCYύXsȂ󋵂ł
AfBXNu[gɏI邩܂B̏ꍇ́AiC[W 
grub Ɋ܂܂Ăj Grub  setup R}hsĉBŖ
肪͂łBڍׂ́A Grub ̃hLgQƂĉB

 

7.3. KvȃW[̃[h

J[lɂẮA SCSI foCX̂悤ȃubNfoCXɃANZX
邽߂ɁA]ȃW[KvɂȂ邩܂B initrd C[W
 /lib fBNgɕKvȃW[uāA clone XNvgŁA
 insmod R}hsĉBƂ̓t@CVXeɂ
܂BႦ΁Afat t@CVXẽC[Wł͂ȂAt@C
΁A fat.o  vfat.o W[KvɂȂ܂B

 

7.4. grub.confŗ\ߒ`Ă鑀

Grub ̃j[t@C grub.conf ̓JX^}CYāA̃Rs[
IvV񎦂悤ɂĂǂAfBXÑp[eBVč쐬
Albg[Nw肵C[W擾悤ȁA\ߒ`Ă
s悤ɂĂ܂܂BJԂ܂AŎ
lpē̍Ƃɉp΁A̍ƂBł悤ɂȂ
̂łB

 

8. {Ŏӎ

ZɂAJF vWFNg̊Flɂ͂܂B̏؂
Č\グ܂B

 

A. initrd ̃t@Cꗗ

/bin/                                                                  
/bin/bash                                                              
/bin/clone                                                             
/bin/dd                                                                
/bin/gzip                                                              
/bin/mknod                                                             
/bin/mount                                                             
/bin/tftp                                                              
/dev/                                                                  
/dev/console                                                           
/dev/null                                                              
/etc/                                                                  
/etc/dhcpc/                                                            
/etc/hosts                                                             
/etc/nsswitch.conf                                                     
/etc/protocols                                                         
/etc/services                                                          
/lib/                                                                  
/lib/3c59x.o                                                           
/lib/i686/                                                             
/lib/i686/libc-2.2.5.so                                                
/lib/i686/libc.so.6                                                    
/lib/ld-2.2.5.so                                                       
/lib/ld-linux.so.2                                                     
/lib/libdl-2.2.5.so                                                    
/lib/libdl.so.2                                                        
/lib/libnss_files-2.2.5.so                                             
/lib/libnss_files.so.2                                                 
/lib/libtermcap.so.2                                                   
/lib/libtermcap.so.2.0.8                                               
/proc/                                                                 
/sbin/                                                                 
/sbin/dhcpcd                                                           
/sbin/fdisk                                                            
/sbin/insmod                                                           
/tmp/                                                                  
/var/                                                                  
/var/run/                                                              
                                                                       

 

B. Clone XNvg

#!/bin/bash                                                            
                                                                       
set -e                                                                 
                                                                       
export PATH=/sbin:/bin                                                 
                                                                       
tftp_server=10.0.0.1                                                   
nic_module=3c59x.o                                                     
major_a=(2 3 22)                                                       
family_a=(fd hda hdc)                                                  
image_a=(img0001 img0002 img0003 img0004)                              
                                                                       
operation_a=(   "Copy from network to device" \                        
                "Copy from device to network" \                        
                "Run fdisk")                                           
                                                                       
mount -t proc proc /proc                                               
insmod /lib/${nic_module}                                              
/sbin/dhcpcd                                                           
                                                                       
while true; do \                                                       
        [ ! -z "${image}" ] && unset image                             
        echo                                                           
        echo "Clone Menu"                                              
        echo                                                           
        echo "Operation"                                               
        echo                                                           
        PS3="Choose operation (1-${#operation_a[*]}): "                
        select operation in "${operation_a[@]}"; do \                  
                [ -z "${operation}" ] && continue                      
                echo                                                   
                echo $REPLY - $operation                               
                echo                                                   
                break                                                  
        done                                                           
                                                                       
        echo "Device Family"                                           
        echo                                                           
        PS3="Choose device family (1-${#family_a[*]}): "               
        select family in "${family_a[@]}"; do \                        
                [ -z "${family}" ] && continue                         
                echo                                                   
                echo $REPLY - $family                                  
                echo                                                   
                break                                                  
        done                                                           
                                                                       
        major_i=$[REPLY-1]                                             
        major=${major_a[$major_i]}                                     
                                                                       
        echo "Minor Number"                                            
        echo                                                           
        PS3="Choose minor number (0-255): "                            
        echo -n "$PS3" >&2                                             
        read minor                                                     
        minor=$[minor%256]                                             
        echo                                                           
        echo $minor                                                    
        echo                                                           
                                                                       
        if [ "${operation}" != "${operation_a[2]}" ]; then \           
                echo "Image"                                           
                echo                                                   
                PS3="Choose image (1-${#image_a[*]}): "                
                select image in "${image_a[@]}"; do \                  
                        [ -z "${image}" ] && continue                  
                        echo                                           
                        echo $REPLY - $image                           
                        echo                                           
                        break                                          
                done                                                   
                image_i=$[REPLY-1]                                     
                image=${image_a[${image_i}]}                           
        fi                                                             
                                                                       
        echo                                                           
        echo -e "Operation:\t$operation"                               
        device_name=/dev/${family_a[${major_i}]}${minor}               
        echo -e "Device:\t\t${device_name} ($major, $minor)"           
        [ ! -z "${image}" ] && echo -e "Image:\t\t${image}"            
        echo                                                           
                                                                       
        echo "Confirmation"                                            
        echo                                                           
        PS3="Ok/Cancel (1-2): "                                        
        select ok in Ok Cancel; do \                                   
                [ -z "${ok}" ] && continue                             
                echo                                                   
                echo $REPLY - $ok                                      
                echo                                                   
                break                                                  
        done                                                           
        if [ "${ok}" = "Ok" ]; then \                                  
                if [ ! -b ${device_name} ]; then \                     
                        echo "Creating ${device_name}"                 
                        mknod ${device_name} b ${major} ${minor}       
                fi                                                     
                if [ ! -z "${image}" ]; then \                         
                        if [ ! -p ${image} ]; then \                   
                                echo "Creating pipe"                   
                                mknod ${image} p                       
                        fi                                             
                fi                                                     
                if [ "${operation}" = "${operation_a[0]}" ]; then \    
                        tftp ${tftp_server} <<-EOT &                   
                        binary                                         
                        get ${image}                                   
                        EOT                                            
                        gzip -c -d < ${image} | dd of=${device_name}   
                elif [ "${operation}" = "${operation_a[1]}" ]; then \  
                        tftp ${tftp_server} <<-EOT &                   
                        binary                                         
                        put ${image}                                   
                        EOT                                            
                        dd if=${device_name} | gzip -c > ${image}      
                elif [ "${operation}" = "${operation_a[2]}" ]; then \  
                        fdisk ${device_name}                           
                fi                                                     
                echo                                                   
        fi                                                             
                                                                       
        echo "Continuation"                                            
        echo                                                           
        PS3="Continue/Exit (1-2): "                                    
        select new in Continue Exit; do \                              
                [ -z "${new}" ] && continue                            
                echo                                                   
                echo $REPLY - $new                                     
                echo                                                   
                break                                                  
        done                                                           
        [ "${new}" = "Exit" ] && break                                 
done                                                                   
exit 0                                                                 
                                                                       

 

References

[1] GRUB.

http://www.gnu.org/software/grub/

