[debian] Boot sur disque flash en lecture seule + file system en Ramdi

Boot sur disque flash en lecture seule + file system en Ramdi [debian] - Linux et OS Alternatifs

Marsh Posté le 24-02-2006 à 16:03:39    

J'essaie d'installer une Debian de façon un peu spéciale. En fait j'ai besoin qu'un disque flash contienne le noyau et un applicatif, mais pour éviter tout risque de corruption, notamment en cas de coupure intempestive, ce disque doit être en lecture seule. Les données utilisateur sont contenues sur un disque rotatif annexe, sans criticité. Les données du système ( /var,  /tmp ... ) devront donc être montés sur un disque virtuel.
 
J'ai donc installé de façon classique une Debian ( Sarge 2.6.8-2-686 ) sur mon système, composé de 2 disques SCSI ( sda : disque flash de 1 Go, et sdb : disque rotatif de 70 Go ) et d'un 1Go de RAM. Jusqu'à là pas de souci.
 
J'ai ensuite trouvé un petit How-to qui explique comment mettre son tmpfs en RAM, ce qui paraissait un bon début, avant de passer le disque système en lecture seule. Pour ceux qui veulent jeter un coup d'oeil ( à noter que le site est une vraie mine d'or ) :
http://madchat.org/sysadm/unix.gui [...] 050703.txt
 
En résumé les actions, à partir de l'installation normale :
# Suppression du /tmp

Code :
  1. rm -R /var/tmp
  2.   ln -s /tmp /var/tmp       # 1 seul répertoire temp.
  3.   mkdir /var/old_root       # fais le, tu comprendra plus tard.


# On crée l'image (ici, 4meg)

Code :
  1. touch /boot/initrd
  2.   dd if=/dev/zero of=/boot/initrd bs=1024k count=4
  3.   mke2fs /boot/initrd  # on crée le systeme de fichiers,
  4.   mkdir /mnt/initrd    # on prépare le point de montage,
  5.   mount -o loop /boot/initrd /mnt/initrd  # et on monte l'image.


# On crée les répertoires essentiels..

Code :
  1. cd /mnt/initrd
  2.   mkdir etc dev lib bin proc new cdrom
  3.   touch linuxrc
  4.   chmod +x linuxrc
  5.   touch etc/mtab
  6.   touch etc/fstab


# On recopie sh ls cat mount umount mkdir chroot tar gzip et pivot_root
# dans /mnt/initrd/bin
 
# On créé les noeuds

Code :
  1. mknod /mnt/initrd/dev/console c 5 1
  2.   mknod /mnt/initrd/dev/null c 1 3
  3.   mknod /mnt/initrd/dev/sda b 3 0
  4.   mknod /mnt/initrd/dev/sdb b 3 64
  5.   mknod /mnt/initrd/dev/tty c 4 0
  6.   mknod /mnt/initrd/dev/loop0 b 7 0


# On édite /mnt/initrd/linuxrc

Code :
  1. #!/bin/sh
  2.   export PATH=/bin
  3.   # Get kernel CMDLINE
  4.   mount -t proc none /proc
  5.   CMDLINE=`cat /proc/cmdline`
  6.   umount /proc
  7.   # Remplacer la partoche racine par la bonne.
  8.   mount -t ext2 -o ro /dev/scsi/host0/bus0/target0/lun0/part1 /new
  9.   # N'ai point peur, Les tailles indiqués sont des valeur maximum.
  10.   mount -t tmpfs -o size=32m none /new/var
  11.   mount -t tmpfs -o size=32m none /new/etc
  12.   mount -t tmpfs -o size=512m none /new/tmp
  13.   mount -t tmpfs -o size=32m none /new/root
  14.   # On décompresse..
  15.   cd /new
  16.   tar -xpzf /new/var.tgz
  17.   tar -xpzf /new/etc.tgz
  18.   tar -xpzf /new/root.tgz
  19.   # On pivote, on démonte et on commence l'init.
  20.   cd /new
  21.   pivot_root . var/old_root
  22.   exec chroot . /bin/sh <<- EOF >dev/console 2>&1
  23.   umount /var/old_root/dev
  24.   umount /var/old_root
  25.   exec /sbin/init ${CMDLINE}
  26.   EOF


 
# On tar les répertoires avant de les effacer

Code :
  1. tar -czp --totals -f /etc.tgz /etc
  2.     tar -czp --totals -f /var.tgz /var
  3.     tar -czp --totals -f /root.tgz /root
  4.     tar -czp --totals -f /home/username.tgz /home/username


# Et enfin on fait modif le menu.lst de GRUB pour lancer tout ça :
# en ajoutant :

Code :
  1. title      Debian maison
  2. root       (hd0,0)
  3. kernel     /boot/vmlinuz-2.6.8-2-686 root=/dev/ram0 ro init=/linuxrc
  4. initrd     /boot/initrd
  5. savedefaults
  6. boot


 
Et là, on croise les doigts, on reboot .... et en sélectionnant la "Debian Maison" on a un joli kernel panic.
Le message exact etant :

Code :
  1. RAMDISK : ext2 filesystem found at block 0
  2. RAMDISK : loading 4096 blocks [ 1disk ] into ram disk ... done
  3. kernel panic : VFS : Unable to mount root fs on unknown-block( 1,0 )


 
A noter que lors d'un lancement réussi ( DEBIAN classique ) on a les messages :

Code :
  1. RAMDISK : cramfs filesystem found at block 0
  2. RAMDISK : loading 4528 blocks [ 1 disk ] into ram disk ... done
  3. VFS : Mounted root ( cramfs filesystem ) readonly.


 
A priori c'est ce qui est rajouté dans GRUB au niveau du " initrd     /boot/initrd " qui semble poser problème, bien que  
non expert je n'en ai aucune certitude. Evidemment si quelqu'un a une idée à soumettre je suis preneur ....

Reply

Marsh Posté le 24-02-2006 à 16:03:39   

Reply

Marsh Posté le 24-02-2006 à 18:06:40    

% zgrep -i ram_size /proc/config.gz                                                        
CONFIG_BLK_DEV_RAM_SIZE=4096


 
As-tu essayé d'autres valeurs ?
 
sdb existe bien ?


Message édité par mirtouf le 24-02-2006 à 18:11:18

---------------
-~- Libérez Datoune ! -~- Camarade, toi aussi rejoins le FLD pour que la flamme de la Révolution ne s'éteigne pas ! -~- A VENDRE
Reply

Marsh Posté le 24-02-2006 à 18:18:34    

Non j'avoue ne pas avoir essayé d'autres valeurs pour CONFIG_BLK_DEV_RAM_SIZE
Mais :
 zgrep -i ram_size /proc/config.gz  
me répond  
/proc/config.gz : No such file or directory
 
 Dans /boot j'ai un fichier config-2.6.8-2-686 ( qui semble donc lié à mon noyau donc )
et là si je fais :  
 zgrep -i ram_size /proc/config.gz  
il me sort  
CONFIG_BLK_DEV_RAM_SIZE=8192
 
 
Edit : Tu as posté entre temps.  
sdb ( je suppose /dev/sdb ), c'est le disque rotatif. Oui il existe.


Message édité par sool le 24-02-2006 à 18:21:05
Reply

Marsh Posté le 24-02-2006 à 18:30:11    

le 1er c'est normal si l'option pour /proc/config.gz n'est pas activé dans le noyau.
 
me demande si faudrait pas un règle udev spécifique pour /dev/sda.


---------------
-~- Libérez Datoune ! -~- Camarade, toi aussi rejoins le FLD pour que la flamme de la Révolution ne s'éteigne pas ! -~- A VENDRE
Reply

Marsh Posté le 24-02-2006 à 19:49:21    

Excuse moi ... mais en clair ça veut dire quoi ?

Reply

Marsh Posté le 02-03-2006 à 15:41:08    

Pour ceux que cela intéresse .... Précisions à ajouter au Howto nommé  
dans le post initial.
 
 
La motivation qui m’animait étant de mettre en lecture seule le système de fichier, j’ai :
 
Modifier le fichier /etc/init.d/checkroot.sh
=> Ajouter rootcheck=no juste avant le test if [ "$rootcheck"=yes ]
 
Modifier le fichier /etc/init.d/checkfs.sh
=> Mettre en commentaire le “fsck $spinner …”, le test qui suit et le traitement associé.
 
Modifier le fichier /etc/inittab
=> Enlever /sbin/shutdown –t1 –a –r now juste après ctrlaltdel : (mettre un echo…)
 
Modifier le fichier /etc/fstab
=> Modifier la ligne /dev/sda1 comme suit
/dev/sda1 /  ext2 ro 0 1
/dev/sdb1 /rotatif ext2 rw 0 2
 
et créer le répertoire /rotatif
 
Ensuite mis les 3 scripts ci-dessous dans un coin et executé le mkinitrd.sh.
 
Script menu.lst utilisé :
Prendre celui fournit par l’installation
Commenter en mettant en début de ligne le caractère  #, les 2 blocs de 6 lignes ( title, root, kernel, initrd, savedefault, boot ) et rajouter :
===========================================================================

Code :
  1. title  Debian GNU/Linux, kernel 2.6.8-2-686 en Lecture Seule
  2. root  (hd0,0)
  3. kernel /boot/vmlinuz-2.6.8-2-686 root=/dev/ram0 ro init=/linuxrc
  4. initrd /boot/initrd-Debian-Maison
  5. savedefault
  6. boot


===========================================================================
 
Script linuxrc utilisé :
===========================================================================

Code :
  1. # !/bin/sh
  2. export PATH=/bin: /sbin: /usr/bin: /usr/sbin
  3. mount –t proc none /proc
  4. CMDLINE=`cat /proc/cmdline`
  5. umount /proc
  6. modprobe –k unix
  7. modprobe –k scsi_mod
  8. modprobe –k sd_mod
  9. modprobe –k sr_mod
  10. modprobe –k scsi_transport_spi
  11. modprobe –k sym53c8xx
  12. modprobe –k ext2
  13. mount –t devfs devfs /devfs
  14. mount –t ext2 –o ro /dev/scsi/host0/bus0/target0/lun0/part1 /new
  15. mount –t tmpfs –o size=128m none /new/tmp
  16. mount –t tmpfs –o size=128m none /new/var
  17. mount –t tmpfs –o size=128m none /new/etc
  18. mount –t tmpfs –o size=128m none /new/root
  19. mount –t tmpfs –o size=512m none /new/home/dcn
  20. mount -–bind /new/temp
  21. cd /new
  22. echo “ >> Decompression de /var”
  23. tar –xpzf home/var.tgz
  24. echo “ >> Decompression de /etc”
  25. tar –xpzf home/etc.tgz
  26. echo “ >> Decompression de /root”
  27. tar –xpzf home/root.tgz
  28. echo “ >> Decompression de /home”
  29. tar –xpzf home/dcn.tgz
  30. umount /temp
  31. echo “ >> All done, time to init ...”
  32. cd /new
  33. pivot_root . var/old_root
  34. exec chroot . /bin/sh << EOF >dev/console 2>&1
  35. umount /var/old_root/devfs
  36. umount /var/old_root/dev
  37. umount /var/old_root
  38. exec /sbin/init ${CMDLINE}
  39. EOF

===========================================================================
 
Script mkinitrd.sh utilisé :
===========================================================================

Code :
  1. # !/bin/sh
  2. echo “ >> Script permettant de creer une Init RAM”
  3. # Pour se souvenir d’où a ete lancee la commande
  4. DEPART=`pwd`
  5. # Creation des repertoires necessaires aux manips
  6. mkdir /var/old_root
  7. mkdir /mnt/temps
  8. mkdir /mnt/initrd
  9. # Creation du repertoire de l’application
  10. mkdir /DCN
  11. # Creation du fichier qui servira d’image
  12. touch /boot/initrd
  13. dd=if=/dev/zero of=/boot/initrd bs=1024k count=16
  14. # On lui donne un systeme de fichiers
  15. mke2fs /boot/initrd
  16. # On desactive fsck
  17. tune2fs –c –1 /boot/initrd
  18. # On le monte en tant que repertoire
  19. mount –o loop /boot/initrd /mnt/initrd
  20. # Creation des repertoires dont on aura besoin
  21. cd /mnt/initrd
  22. mkdir etc dev devfs lib bin proc new temp
  23. cp ${DEPART}/linuxrc .
  24. touch etc/mtab
  25. touch etc/fstab
  26. cd /mnt/initrd/dev
  27. mknod –m 600 console c 5 1
  28. mknod –m 666 null    c 1 3
  29. mknod –m 666 tty     c 5 0
  30. mknod –m 600 loop0   c 7 0
  31. # Invocation du systeme de fichiers devfs pour acces au SCSI
  32. mount –t devfs devfs /mnt/initrd/devfs
  33. ln –s ../devfs/scsi   scsi
  34. ln –s ../devfs/mapper mapper
  35. ln –s ../devfs/md     md
  36. umount /mnt/initrd/devfs
  37. cd /mnt/initrd
  38. # Recopie des binaires necessaires
  39. for x in sh ls cp cat mount umout tar gzip
  40. do
  41. cp –v /bin/${x} /mnt/inird/bin
  42. done
  43. cp –v /sbin/pivot_root /mnt/initrd/bin
  44. cp –v /sbin/modprobe   /mnt/initrd/bin
  45. cp –v /usr/sbin/chroot /mnt/initrd/bin
  46. # Recopie des librairies necessaires aux binaires
  47. cd /lib
  48. for x in sh ls cp cat mount umout tar gzip
  49. do
  50. cp –v `ldd /bin/${x}|egrep lib|cut –d “=” –f1` /mnt/initrd/lib
  51. done
  52. cp –v `ldd /sbin/pivot_root|egrep lib|cut –d “=” –f1` /mnt/initrd/lib
  53. cp –v `ldd /sbin/modprobe|egrep lib|cut –d “=” –f1` /mnt/initrd/lib
  54. cp –v `ldd /usr/sbin/chroot|egrep lib|cut –d “=” –f1` /mnt/initrd/lib
  55. # Recopie des modules
  56. echo “ >> Recopie des modules kernel”
  57. mount –o loop –t cramfs /boot/initrd.img-2.6.8-686 /mnt/temp
  58. cp –R /mnt/temp/etc/modprobe.d /mnt/initrd/etc/
  59. cp –R /mnt/temp/lib /mnt/initrd/
  60. # Nettoyage du repertoire /var
  61. echo “ >> Nettoyage du repertoire /var”
  62. rm /var/cache/apt/*
  63. > /var/log/messages
  64. rm /var/log/debian-installer/cdebconf/*
  65. rm /var/log/ksymoops/*
  66. rm /var/lib/apt/lists/Debian*
  67. rm /var/lib/apt/lists/_cd*
  68. rm /var/lib/aptitude/pkgstates
  69. rm /var/lib/dpkg/info/*
  70. # Sauvegarde des repertoires etc var root home
  71. echo “ >> Sauvegarde des repertoires etc, var, root et home/dcn“
  72. tar –czp --totals –f /home/etc.tgz  /etc
  73. tar –czp --totals –f /home/var.tgz  /var
  74. tar –czp --totals –f /home/root.tgz /root
  75. tar –czp --totals –f /home/dcn.tgz  /home/dcn
  76. cd ${DEPART}
  77. # Ajout de l’option dans le menu de GRUB
  78. echo “ >> Remplacement de menu.lst de Grub“
  79. cp menu.lst /boot/grub/menu.lst
  80. # Creation de l’Init RAM
  81. echo “ >> Creation de l’Init Ram“
  82. mkfs.cramfs /mnt/initrd /boot/initrd-Debian-Maison
  83. # Et on range sa chambre avant de partir ...
  84. umount /mnt/initrd
  85. umount /mnt/temp
  86. rmdir /mnt/initrd
  87. rmdir /mnt/temp
  88. echo “ >> OK, all is done !“


===========================================================================


Message édité par sool le 02-03-2006 à 15:43:59
Reply

Marsh Posté le 01-06-2011 à 11:08:40    

Je déterre le topic, mais le sujet m'intéresse.
Je conseille énormément cette doc : http://www.kernel.org/doc/Document [...] tramfs.txt et le petit script mkinitamfs de 10 lignes bien pratique pour tester.

Reply

Marsh Posté le 02-06-2011 à 00:48:08    

En utilisant busybox (compilé en static) et switch_root, je génère l'initrd en 150 lignes de bash (script init compris), je gère plusieurs architectures (testé x86 et amd64), je crée un debootstrap debian, je le configure et je boot dessus  :whistle:
 
J'ai pas de old_root, je construis mon fs dans /newroot, et je fais la commande magique :
 

Code :
  1. exec switch_root -c /dev/console /newroot /sbin/init


 
Je pense que je publierai mes scripts bientôt :)
 
A noter, debirf pour fabriquer des initrd contenant une Debian entière : http://cmrg.fifthhorseman.net/wiki/debirf

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed