Debian-in-Debian

ovvero, come installare una distribuzione Debian GNU/Linux versione 3.0 (Woody)  su un disco rigido o in una partizione di un disco rigido disponibile su un computer sul quale sia già stata installata un'altra Debian (una qualsiasi distribuzione GNU/Linux, in realtà)
Redatto nel marzo 2005
Prima revisione: aprile 2005
Ultime modifiche (piccole correzioni): 28 luglio 2010



Nel primo CD di avvio di Debian 3.0 "Woody" si trovano questi file (supponendo che il CD Rom sia stato montato nella directory /mnt/cdrom):

$ ls -F /mnt/cdrom/install/
README.sbm  compact.bin  lin24     linux         rawrite2.txt  sbm.bin
bf24.bin    doc/         lincompt  loadlin.exe   rescue.bin    setlang.bat
boot.bat    idepci.bin   linpci    rawrite2.exe  root.bin

  Ci interessano i file: bf24.bincompact.binidepci.bin e root.bin.
Questi file sono delle immagini di filesystem ext2 compressi:

$ file /mnt/cdrom/install/{bf24,compact,idepci,root}.bin
/mnt/cdrom/install/bf24.bin:    gzip compressed data, from Unix, max compression
/mnt/cdrom/install/compact.bin: gzip compressed data, from Unix, max compression
/mnt/cdrom/install/idepci.bin:  gzip compressed data, from Unix, max compression
/mnt/cdrom/install/root.bin:    gzip compressed data, from Unix, max compression

Questi file sono le immagini compresse dei filesystem temporanei utilizzate dal programma di installazione avviato a partire dal CD-Rom d'installazione.  Corrispondono, nell'ordine, alle opzioni di avvio: bf24, compact, idepci e vanilla, selezionabili al prompt boot: mostrato all'avvio da CD Rom.
  Ne ispezioneremo adesso il contenuto di uno, quello "bf24", che consente di eseguire l'installazione con il kernel 2.4:

$ cp /mnt/cdrom/install/bf24.bin /tmp/bf24.bin.gz
$ cd /tmp
$ gunzip bf24.bin.gz
$ file bf24.bin
bf24.bin: Linux rev 1.0 ext2 filesystem data

  Adesso dobbiamo avere i diritti di superutente per poter montare in loopback il file in una directory temporanea per potervi accedere:

$ su -
Password:
# cd /tmp
# mkdir fsext2
# mount -t ext2 -o loop bf24.bin fsext2
# ls -F fsext2
bin/     instmnt/  release_notes.de  release_notes.pt  type.txt
dev/     lib/      release_notes.en  root/             unifont-reduced.bgf
etc/     linuxrc*  release_notes.es  sbin/             usr/
floppy/  mnt/      release_notes.fr  target/           var/
initrd/  proc/     release_notes.ja  tmp/

  Questo è il contenuto del filesystem temporaneo disponibile in fase di installazione quando si è scelta l'opzione "bf24".  Si puó andare a vedere:

# cd fsext2
# ls etc
dhclient-script*  ld.so.conf   messages.fr  messages.ru     pcmcia@
dhclient.conf     messages.ca  messages.gl  messages.sk     profile*
fstab             messages.cs  messages.hr  messages.sv     protocols
group             messages.da  messages.hu  messages.tr     resolv.conf@
init.d/           messages.de  messages.it  messages.zh_TW  terminfo/
inittab           messages.en  messages.ja  modules.conf
inittab.install   messages.eo  messages.ko  mtab@
keymaps.tgz       messages.es  messages.pl  nsswitch.conf
ld.so.cache       messages.fi  messages.pt  passwd

  Il file etc/inittab contiene le istruzioni del primo programma avviato dal kernel dopo il suo boot, ossia init, ed è quindi il primo file da scrutare.  Al suo interno si vedono queste righe in particolare:

# main setup program
::respawn:/sbin/udbootstrap

  Quindi, il prossimo file che andremo ad ispezionare sarà sbin/udbootstrap, sempre nel filesystem che è stato montato in loopback:

# file sbin/udbootstrap
sbin/udbootstrap: Bourne shell script text executable

# cat sbin/udbootstrap
#!/bin/sh
if (</dev/fb0) 2>/dev/null &&   ! grep -q console=ttyS /proc/cmdline 2> /dev/null &&    ! grep -q nolangchooser /proc/cmdline 2> /dev/null ; then
LC_CTYPE=C@utf-8
export LC_CTYPE
exec /usr/bin/bterm -f /unifont-reduced.bgf /sbin/dbootstrap
fi
TERM=vt102
export TERM
exec /sbin/dbootstrap

  Si vede che, dopo un paio di operazioni preliminari, sostituisce a se stesso il programma "sbin/dbootstrap", che è un file binario eseguibile:

# file sbin/dbootstrap
sbin/dbootstrap: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.30, dynamically linked (uses shared libs), stripped

  Bene, per avviare il programma di installazione Debian 3.0 Woody si deve quindi mandare in esecuzione questo programma.  Si deve però tenere a mente che questo programma deve accedere ai file che si vedono nella directory /tmp/fsext2 come fossero nella sua root directory, dobbiamo quindi mandare in esecuzione questo file binario in una cosiddetta "gabbia chroot" con il comando che segue:

# chroot /tmp/fsext2 /sbin/dbootstrap
E: /proc does not appear to be mounted (No such file or directory)

  Primo aggiustamento: si deve rendere disponibile il filesystem virtuale /proc ai programmi che saranno eseguiti entro la gabbia di chroot:

# mount -t proc proc /tmp/fsext2/proc

  ATTENZIONE: per avere una via d'uscita rapida e comoda dal programma d'installazione, si faccia in modo di avere un secondo terminale disponibile nel computer sul quale si sta operando (tornerebbe comodo si dovesse mandare un segnale di terminazione al processo di installazione).  Si lavorasse invece su una macchina remota via connessione seriale, ad esempio, questo non sarebbe possibile (anche se si potrebbe usare screen per poter fare una cosa simile).  Allora, si smonti adesso il CD Rom da dove lo si era montato, perché servirà montato dentro la gabbia di chroot (ho notato che questo non crea problemi su una Gentoo con Linux 2.4.29, ma meglio fare le cose "per bene"):

# umount /mnt/cdrom

  Un'altra cosa che servirà in futuro è di rendere disponibili al programma di installazione i moduli del kernel sotto il quale sta girando il programma di installazione.  Si potrebbe infatti vedere saettare sotto gli occhi il messaggio:

modprobe: Can't open dependencies file /lib/modules/2.4.29.0-yamuna/modules.dep (No such file or directory)

  Si potrebbe quindi pensare di copiare tutto l'albero dei moduli nell'ambiente di chroot, ma il filesystem contenuto nell'immagine "bf24.bin" potrebbe non contenere lo spazio sufficiente:

# df fsext2
# Filesystem            Size  Used Avail Use% Mounted on
# /tmp/bf24.bin         6.4M  4.6M  1.8M  73% /tmp/fsext2

  Se non si ha la necessità di configurare dispositivi peculiari, basterà copiare questi moduli (in un kernel 2.4.29 molto modularizzato) nella directory dei moduli del filesystem sul quale sarà installato il sistema operativo base, che si suppone essere il primo disco SCSI nella sua prima partizione, ossia il dispositivo /dev/sda1, che si suppone già preparato con un filesystem ext2:

# MOD="/lib/modules/`uname -r`/kernel/drivers"
# rm -f fsext2/lib/modules
removed `fsext2/lib/modules'

(nell'immagine del filesystem di boot questo è un collegamento simbolico, ma in queste operazioni serve una vera directory)

# mkdir -p
fsext2"$MOD"
# cp -a "$MOD"/scsi fsext2"$MOD"
# cp -a "$MOD"/cdrom fsext2"$MOD"
# cp -a "$MOD"/net fsext2"$MOD"

  Proviamo a generare il file "modules.dep":

# depmod --all --errsyms --basedir /tmp/fsext2/
depmod: *** Unresolved symbols in /tmp/fsext2/lib/modules/2.4.29.0-yamuna/kernel/scsi/imm.o
depmod:         parport_unregister_device
depmod:         parport_enumerate
depmod:         parport_register_device
depmod:         parport_claim
depmod:         parport_release
depmod: *** Unresolved symbols in /tmp/fsext2/lib/modules/2.4.29.0-yamuna/kernel/scsi/ppa.o
depmod:         parport_unregister_device
depmod:         parport_enumerate
depmod:         parport_register_device
depmod:         parport_claim
depmod:         parport_release
depmod: *** Unresolved symbols in /tmp/fsext2/lib/modules/2.4.29.0-yamuna/kernel/scsi/sr_mod.o
depmod:         cdrom_open
depmod:         cdrom_release
depmod:         register_cdrom
depmod:         cdrom_ioctl
depmod:         cdrom_media_changed
depmod:         unregister_cdrom
depmod:         cdrom_number_of_slots

  I moduli mancanti sono relativi ai gestori del kernel per i dispositivi su porta parallela.  Nei miei esperimenti mi sono pure trovato in analoga difficoltà per i moduli relativi al supporto del protocollo PPP.  Non avendo bisogno di tale supporto, alla fine ho risolto cancellando i moduli che mi generavano questi simboli irrisolti:

# rm -f /tmp/fsext2"$MOD"/net/plip.o \
/tmp/fsext2"$MOD"/net/ppp_deflate.o \
/tmp/fsext2"$MOD"/scsi/imm.o \
/tmp/fsext2"$MOD"/scsi/ppa.o


  Si riprovi a generare il file "modules.dep":

# depmod --all --errsyms --basedir /tmp/fsext2/
#

  Operazione riuscita.
  Adesso i moduli che potrebbero servire a lanciare il programma "dbootstrap" sono a posto; mancano quelli da rendere disponibili al processo di installazione.  I primi sono stati aggiunti al filesystem montato in loopback nella directory /tmp/fsext2, i secondi si devono copiare nella partizione del disco rigido sul quale si sta per installare il nuovo sistema nella partizione che ospiterà la directory /lib/modules (che si suppone sia la partizione /dev/sda1).  Lo si faccia, copiandoci tutti i moduli del kernel che si sta usando adesso (la directory "target" è quella dove il programma di installazione Debian monta il filesystem nel quale deve installare il sistema base):

# mount -t ext2 /dev/sda1 fsext2/target
# mkdir -p fsext2/target/lib/modules
# cp -a /lib/modules/`uname -r` fsext2/target/lib/modules/
# umount fsext2/target

  Si puó adesso riprovare con il programma di installazione:

# chroot /tmp/fsext2 /sbin/dbootstrap

  Ma si puó anche scegliere di lanciare in chroot una shell prima, per eseguire /sbin/dbootstrap da essa; questo permetterà di uscire dal programma di installazione tornando all'ambiente di chroot, come vedremo in seguito.  Adesso, si faccia così:

# chroot /tmp/fsext2 /bin/ash
\[\033[01;31m\]\h \[\033[01;34m\]\W \$ \[\033[00m\]

  La shell ash ha ereditato il prompt della shell sotto la quale è stato eseguito il comando chroot, che però non è di aiuto in questa shell.  Lo si imposti allora a qualcosa di non fastidioso, così, ad esempio:

\[\033[01;31m\]\h \[\033[01;34m\]\W \$ \[\033[00m\]export PS1='Prompt> '
Prompt>

  Ed ora, si avvii il programma di installazione Debian:

Prompt> /sbin/dbootstrap

  +----------------------------+ Release Notes +-----------------------------+
  |                     Software in the Public Interest                      #
  |                                presents                                  :
  |                      *** Debian GNU/Linux 3.0 ***                        :
  |                                                                          :
  | This is the Debian installation system, somewhat inaccurately            :
  | named 'boot-floppies', version 3.0.23.                                   :
  |                                                                          :
  | This installation set was built on 2002-05-15 by Adam Di Carlo           :
  | <aph@debian.org>.                                                        :
  |                                                                          :
  | Debian is created by a worldwide team of over 900 volunteers             :
  | collaborating via the Internet. We have formed the non-profit            :
  | organization "Software in the Public Interest" to sponsor this           :
  | development. We'd like to thank the many businesses, universities, and   :
  | individuals who contributed the free software upon which Debian is       :
  | based. The Free Software Foundation should also be recognized for the    :
  | many programs they have contributed and for their pioneering role in     :
  | developing the free software concept and the GNU project.                :
  |                                  <Continue>                              
  +--------------------------------------------------------------------------+


  Eureka!   :-)


Si continui adesso con la fase due:

< Torna al livello precedente <
<< Torna alla prima pagina <<