Magari per lo sviluppo avete piuttosto installato una slackware in chroot, ma non è la stessa cosa, visto che non ci potete fare il boot.
Certo, è l'ideale se dovete compilare pacchetti, ma non ci potete fare il boot; magari lo si può emulare facendogli caricare qualcuno degli script rc, ma non è la stessa cosa che fare un boot.
Io ho trovato la soluzione per effettuare il boot da una macchina chrootata.
La procedura è testata con slackware ma si dovrebbe poter applicare senza troppi problemi anche a tutte le altre distribuzioni.
Il test per la precisione è stato effettuato lanciando una slackware 32bit installata in una sottodirectory nella partizione di una slackware 64bit ma è possibile anche installarla in una sottodirectory di una partizione in cui non c'è nessuna distribuzione installata (è leggermente più difficile per il fatto che non si ha una distribuzione da cui lavorare, ma con una live il gioco è fatto).
Può anche essere utile effettuare l'installazione in una sottodirectory di un dispositivo usb o in un file immagine ( -o loop ... ) e chi più ha fantasia più ne aggiunga.
La procedura è semplice.
Intanto installiamo la nostra slackware in una directory per esempio /slack1 e che si trovi nella partizione /dev/hda1
poi
Codice: Seleziona tutto
# mkdir /tmp/initrd
# cd /tmp/initrd
# tar -zxf /slack1/usr/share/mkinitrd/initrd-tree.tar.gz './bin/busybox'
# mkdir part proc dev newroot sbin
### 32bit:
# mkdir lib
# cp -p /lib/ld-linux.so.2 /lib/libc.so.6 /lib/libm.so.6 lib
### 64bit:
# mkdir lib64
# cp -p /lib64/ld-linux-x86-64.so.2 /lib64/libc.so.6 /lib64/libm.so.6 lib64
# mount -t proc proc proc
# chroot /tmp/initrd bin/busybox --install -s
# umount proc
# cp -a /dev/hda1 dev
# vi init
#!/bin/ash
mount -n -t proc proc /proc
mount -n -r /dev/hda1 /part
mount -n -r --bind /part/slack1 /newroot
umount -n /part
umount -n /proc
exec chroot /newroot /sbin/init $@
# chmod +x init
# find . | cpio -o -H newc | gzip -9 -n > /slack1/boot/initrd.gz
# vi /etc/lilo.conf
image=/slack1/boot/vmlinuz
label=slack1
initrd=/slack1/boot/initrd.gz
# lilo -v
# reboot
ricordate di creare /slack1/etc/fstab prima del reboot:
/dev/sda2 / ext3 defaults 1 1
/dev/sda1 swap swap defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
Riferimenti utili: http://www.slacky.eu/wikislack/index.ph ... ennina_USB
Il funzionamento:
In pratica viene prodotto un initrd in quanto al kernel non gli si può dire di montare una directory come root filesystem ma solo una partizione.
Dopo aver montato la partizione però posso fare un mount virtuale (con --bind) di una singola directory (la nostra /slack1) su un altro mountpoint e poi smontare quello principale; poi possiamo fare il chroot
Con la stessa tecnica è possibile sharare directory tra le varie chroot, per esempio la /home ci potrebbe essere utile lasciarla in comune. In tal caso modificare l'init:
Codice: Seleziona tutto
#!/bin/ash
mount -n -t proc proc /proc
mount -n -r /dev/hda1 /part
mount -n -r --bind /part/slack1 /newroot
mount -n -r --bind /part/home /newroot/home
umount -n /part
umount -n /proc
exec chroot /newroot /sbin/init $@
Codice: Seleziona tutto
/dev/hda1 /home ext3 remount,rw,defaults 0 0
In caso di usb si aggiungono alcuni fattori complicanti che riguardano il ritardo con cui il kernel riconosce tali dispositivi e il problema di non sapere a priori quale sia il nome del device, soprattutto nel caso in cui si configura l'initrd su una macchina con dischi ide e poi si usa tale initrd su macchine con dischi sata (il che implica una traslazione dei nomi dei device.
Nel link segnalato si ovvia al problema facendo uso delle label sul filesystem al posto dei device.
Ciao
01