ho visto che la richiesta di un Linux che gira su disco USB è abbastanza ricorrente ... siccome serviva anche a me ho provato alcune soluzioni e quella che vi propongo mi sta dando ottime soddisfazioni ... Non sarò breve ! ...
Ho letto ovviamente vari articoli compreso quelli su Slacky ... e anche tutta la storia della patch al kernel che avrebbe risolto l'avvio da USB con kernel "monolitico" ... la patch non è stata accettata e quindi ci tocca proprio partire con una ramdisk ... comunque la soluzione che vi propongo permette di avviare anche un kernel statico ... vantaggio: il kernel si aggiorna abbastanza frequentemente, questa ramdisk può andar bene per anni, sempre la stessa ...
Principio di funzionamento: invece di usare una Label per identificare la partizione da montare, ho preferito usare un "signature" attraverso un file con nome di fantasia e passare questo nome come parametro di boot ... lo script init della ramdisk monta/smonta più volte tutti dischi e cerca in ogni disco il "signature file" in /etc ... se trova questo file allora tiene montato il filesystem ed avvia il sistema con il solito chroot, ecc.
Vantaggi: intanto non occorre specificare il tipo di filesystem (e non è poca cosa), poi si può usare qualsiasi partizione non necessariamente la prima, infine il sistema può essere usato anche per avviare da un normale HD semplificando non poco le cose come si dovrebbe capire leggendo avanti ...
Operativamente:
1) creiamo la ramdisk con questo scriptino, che intanto preleva dalla rete un'ottima busybox statica precompilata, in attesa di compilarne una su Slackware (si potrebbe prendere quella del DVD, ricordando però di portarsi dietro anche le librerie)
Codice: Seleziona tutto
#!/bin/sh
# *** Makeramusb *** copyleft (!C) FZ
#Thanks:
#jootamam: http://jootamam.net/howto-initramfs-image.htm
#spina: http://www.slacky.eu/wikislack/index.php?title=Slackware_su_pennina_USB
echo "Removing previous structure and files ..."
#--------------------------------------------------------
rm -Rf work
echo "Creating the folder structure ..."
#--------------------------------------------------------
mkdir -p work/initramfs/{bin,sbin,etc,proc,sys,newroot}
cd work
touch initramfs/etc/mdev.conf
echo "Getting BusyBox ..."
#--------------------------------------------------------
if [ -f ../busybox-1.10.1-static.bz2 ] ; then
cat ../busybox-1.10.1-static.bz2 | bunzip2 > initramfs/bin/busybox
else
wget http://jootamam.net/initramfs-files/busybox-1.10.1-static.bz2 -O - | bunzip2 > initramfs/bin/busybox
fi
chmod +x initramfs/bin/busybox
ln -s busybox initramfs/bin/sh
echo "Creating a init script"
#--------------------------------------------------------
echo '#!/bin/sh
export PATH=/bin:/sbin
#Create all the symlinks to /bin/busybox
/bin/busybox --install -s
#Mount things needed by this script
mount -t proc proc /proc
mount -t sysfs sysfs /sys
touch /etc/mtab
#Disable kernel messages from popping onto the screen
echo 0 > /proc/sys/kernel/printk
#Clear the screen
clear
echo
echo
echo "------------------------------------"
echo " **** USB Boot **** "
echo "------------------------------------"
echo
#Create device nodes
mknod /dev/null c 1 3
mknod /dev/tty c 5 0
echo /bin/mdev > /proc/sys/kernel/hotplug
#Scan for devices
mdev -s
#Defaults
init="/sbin/init"
root="/dev/sda1"
#Get USB-disk SIGNATURE
USB_LABEL=
COMMAND_LINE=`cat /proc/cmdline`
MOUNT_OPTIONS="r"
#Parse 12 option parameters
#------------------------------------------------
for i in 1 2 3 4 5 6 7 8 9 10 11 12
do
OPTION=`echo "$COMMAND_LINE" | cut -d" " -f$i`
PARAM=`echo "$OPTION" | cut -d"=" -f1`
VALUE=`echo "$OPTION" | cut -d"=" -f2`
#Test ro|rw mount option
case "$OPTION" in
"ro" | "read-only") MOUNT_OPTIONS="r";;
"rw" | "read-write") MOUNT_OPTIONS="w";;
esac
if [ "a$PARAM" = "aUSB_DISK_SIGNATURE" ] ; then
USB_LABEL=$VALUE
fi
done
#Search for disk signature
#------------------------------------------------
if [ "a$USB_LABEL" != "a" ] ; then
#Try to mount USB-disk
echo -n "Searching disk signature: $USB_LABEL "
n=0
#Repeat test 10 times
while [ $n -le 9 ]
do
#Rescan for new devices
mdev -s
export IFS=`echo -ne " \t\n"`
export MOUNT_OPTIONS=$MOUNT_OPTIONS
#Try to mount all sd devices
#---------------------------------------------
ls -1 /dev/sd* 2> /dev/null |
while
read TRY_DISK
do
mount -$MOUNT_OPTIONS $TRY_DISK /newroot 1> /dev/null 2> /dev/null
if [ -f /newroot/etc/$USB_LABEL ] ; then
break
fi
umount $TRY_DISK 2> /dev/null
done
#---------------------------------------------
if [ -f /newroot/etc/$USB_LABEL ] ; then
break
fi
sleep 1
let n=$n+1
echo -n "."
done
echo " done."
IS_ROOT_MOUNTED=`mount | grep /newroot`
if [ "a$IS_ROOT_MOUNTED" != "a" ] ; then
echo "$USB_LABEL --> $IS_ROOT_MOUNTED"
else
echo "Error: disk signature <<$USB_LABEL>> not found !!!"
fi
else
echo "Warning: USB_DISK_SIGNATURE not in command line ..."
fi
#If nothing mounted
#------------------------------------------------
if [ "a$IS_ROOT_MOUNTED" = "a" ] ; then
echo "Error: root device not mounted ..."
echo -n "give me another device to try (ex: /dev/sda1) : "
read ALT_DEVICE
mount -$MOUNT_OPTIONS $ALT_DEVICE /newroot 1> /dev/null 2> /dev/null
fi
#Check if $init exists and is executable
#------------------------------------------------
if [[ -x "/newroot/${init}" ]] ; then
#Unmount all other mounts so that the ram used by
#the initramfs can be cleared after switch_root
umount /sys /proc
#Switch to the new root and execute init
exec switch_root /newroot "${init}"
fi
#This will only be run if the exec above failed
echo "Failed to switch_root, dropping to a shell"
exec sh' > initramfs/init
chmod +x initramfs/init
echo "Creating the .cpio and .igz ..."
#--------------------------------------------------------
cd initramfs
find . | cpio -H newc -o > ../ramusb.cpio
cd ..
cat ramusb.cpio | gzip > ramusb.igz
echo "Done."
2) copiamo la "ramusb.igz" così creata nella /boot del nostro disco USB ... per le mie prove è /dev/sdc4, formattato ext3, montato in /mnt/sdc4
3) editiamo lilo.conf ... esempio:
Codice: Seleziona tutto
# LILO configuration file sample, by Fabio
# Start LILO global section
boot = /dev/sdc # hda,sda=MBR or hda1,sda1=bootrecord
compact # ha sempre funzionato
prompt
large-memory # non servirebbe in questo caso
timeout = 50
vga = 788
# End LILO global section
# Linux bootable partition config begins
image = /boot/linux-2.6.24.3
label = UZBlinux
initrd=/boot/ramusb.igz
read-only
append = "USB_DISK_SIGNATURE=mySlack12.2"
# Linux bootable partition config ends
4) editiamo fstab
Codice: Seleziona tutto
/dev/root / auto defaults 1 1
5) creiamo il "signature" file in /etc della USB
Codice: Seleziona tutto
touch /mnt/sdc4/etc/mySlack12.2
Codice: Seleziona tutto
lilo -r /mnt/sdc4
neanche il vmlinuz-huge-smp-2.6.27.7-smp (4.5M) riconosce i dischi USB ... io uso una "custom" (ho usato il 2.6.24.3 perché mi supportava meglio PC non nuovissimi) che non arriva a 3,5M e riconosce tutto (provato sia con HD esterni che con pennine di marca diversa) ... acc... anche questo è un porting di Slackware !
Tra l'altro, visto che il "persistent-net" in un sistema che gira su più macchine è solo un problema, ho eliminato ifrename:
Codice: Seleziona tutto
echo "" > /etc/udev/rules.d/70-persistent-net.rules
mv /sbin/ifrename /sbin/no-ifrename
- Lilo qui è installato in /dev/sdc
- per voi potrebbe essere anche /dev/sdf
- ma poi si avvierà una volta come /dev/sda
- ed un'altra come /dev/sdd
nessun problema ! ... si avvierà e funzionerà sempre allo stesso modo !
Nota2 per Lilo:
talvolta la compilazione/riparazione di Lilo dall'esterno del filesystem (lilo -r /mount_point) da dei problemi ... si rimedia ricopiando i propri devices nel filesystem da riparare:
Codice: Seleziona tutto
mv /mount_point/dev /mount_point/old-dev
cd /
cp -Rpdf dev /mount_point/
per installare Slackware sulla chiavetta, basta clonare una Slackware già esistente, ma non montata (avviando da altra partizione o da DVD), esempio:
Codice: Seleziona tutto
mount /dev/sda3 /mnt/slacky
mount /dev/sdb1 /mnt/usbpen
cd /mnt/slacky
cp -Rpdf * /mnt/usbpen