Makeramusb: avviare da disco USB con kernel statico

Forum dedicato ai Porting ufficiali e non di Slackware, vedi Slack/390, ARMedslack, Slamd64, Slackintosh, Ocsid, Sloox, Zenwalk, How-Tux, Slax etc etc

Moderatore: Staff

Regole del forum
1) Specificare nome e versione del porting.
2) Specificare se discussione/suggerimento o richiesta d'aiuto.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Luci0
Staff
Staff
Messaggi: 3591
Iscritto il: lun 27 giu 2005, 0:00
Nome Cognome: Gabriele Santanché
Slackware: 12.2 14.0
Kernel: 2.6.27.46- gen 3.2.29
Desktop: KDE 3.5.10 Xfce
Località: Forte dei Marmi
Contatta:

Re: Makeramusb: avviare da disco USB con kernel statico

Messaggio da Luci0 »

Ho trovato un pò di tempo per fare delle sperimentazioni.
Volevo chiarirmi le idee e fare il punto su come fare l' installazione su un dispositivo rimovibile tipo penna USB.

Si installa Slackware seguendo la documentazione di Spina (wiki.slacky.eu http://www.slacky.eu/wikislack), poi bisogna riavviare dal CD/DVD in modalità rescue creare lo script, avviarlo creando l' immagine, modificare lilo.conf con la immagine creata, installare lilo a questo punto si ottiene una penna USB avviabile da un qualunque PC in grado di effettuare il boot da USB...

(... continua la btteria si sta scaricando )

Avatar utente
zoros
Linux 4.x
Linux 4.x
Messaggi: 1361
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: Makeramusb: avviare da disco USB con kernel statico

Messaggio da zoros »

In attesa che Luci0 si "ricarichi" :) aggiungo qualcosa:

secondo me conviene partire da un Slackware già installata su HD, copiando l'intero filesystem sulla pennina (cp -Rpdf * /mnt/pennina), il kernel huge e la ramusb.igz ... si minimizzano così gli accessi in scrittura sulla usb-stick ... ricordo che è quasi obbligatorio usare fs not-journaled, quindi meglio ext2 ...

l'installazione sarebbe ancora più veloce ed efficiente se si creasse il filesystem dentro un file (lavorando su HD), per poi copiare questo file direttamente sulla pennina con il dd ... in questo caso gli accessi in scrittura sarebbero ridotti al minimo ...

la ramusb.igz è in grado di avviare un filesystem contenuto in un file (usando un loop device, anche in rw) ... io ho provato questa funzionalità con piccole distro e vorrei fare delle prove con una Slackware completa ... le distro live utilizzano cramfs, squashfs, ecc. per buona parte del loro filesystem ... questo accorgimento le rende veloci anche se il sistema gira su supporti notoriamente lenti come i CD/DVD ... è probabile che l'utilizzo di un unico file renda più veloce la nostra Slack su pennina grazie al diverso meccanismo di accesso al disco ... da provare ...

NOTA: il kernel standard 12.2 vmlinuz-huge-smp-2.6.27.7-smp sembra non funzionare bene (ogni tanto "tira qualche numero un po' a caso") ... credo sia proprio la versione perché anche quello che ho compilato io ha evidenziato dei problemi di gestione dei filesystem, tanto che lo ho rimosso dal mio disco di lavoro ...

P.S. @Luci0: ma non esiste il dominio di 3^ livello wiki su slacky.eu, semmai --> http://www.slacky.eu/wikislack
vorrei riavere le mie firme ...

Avatar utente
Luci0
Staff
Staff
Messaggi: 3591
Iscritto il: lun 27 giu 2005, 0:00
Nome Cognome: Gabriele Santanché
Slackware: 12.2 14.0
Kernel: 2.6.27.46- gen 3.2.29
Desktop: KDE 3.5.10 Xfce
Località: Forte dei Marmi
Contatta:

Re: Makeramusb: avviare da disco USB con kernel statico

Messaggio da Luci0 »

Offtopic:
zoros ha scritto:
Offtopic: P.S. @Luci0: ma non esiste il dominio di 3^ livello wiki su slacky.eu, semmai --> http://www.slacky.eu/wikislack
Offtopic:
ho corretto il post precedente ... sto perdendo colpi !

Avatar utente
Luci0
Staff
Staff
Messaggi: 3591
Iscritto il: lun 27 giu 2005, 0:00
Nome Cognome: Gabriele Santanché
Slackware: 12.2 14.0
Kernel: 2.6.27.46- gen 3.2.29
Desktop: KDE 3.5.10 Xfce
Località: Forte dei Marmi
Contatta:

Re: Makeramusb: avviare da disco USB con kernel statico

Messaggio da Luci0 »

Io ho installato una Slackware sul eeePC con l' hdd da 4Gb e ho messo reiserfs per ottimizzare un pò la gestione dei file piccoli e risparmiare spazio, mi stavo domandando se la cosa é conveniente per le e pennine USB ... forse conoscendo qualche tweak si può cercare di limitare o disabilitare il journaling.

Avatar utente
zoros
Linux 4.x
Linux 4.x
Messaggi: 1361
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: Makeramusb: avviare da disco USB con kernel statico

Messaggio da zoros »

A questo punto del discorso, una applicazione pratica che ci fa superare il limiti di usbboot.img ... vediamo cosa significa:

per installare Slackware in mancanza di lettore CD/DVD si può usare "usbboot.img" che è in pratica l'immagine di un superfloppy FAT16/32 che sia avvia con syslinux ... questo metodo, pur efficace, ha evidenziato alcuni limiti, in particolare al momento del boot (non sempre certo), nella lentezza di caricamento (alcuni BIOS caricano lentamente da USB ... e sono decine di mega da caricare), nel fatto che il tutto funziona solo usando la prima partizione (così sembra) ...

ma questa usbboot.img contiene semplicemente un kernel-huge, la initrd.gz (la stessa del CD/DVD) e pochi file per l'avvio mediante syslinux ... tanto vale fare il boot direttamente della initrd.gz dopo averla "ricondotta" a normale filesystem ... visto che la ramusb.igz ci avvia anche un sistema contenuto in una directory, metteremo tutto in una directory ...

prepariamo il nostro filesystem:

Codice: Seleziona tutto

mkdir -p slack-initrd-12.2
cd slack-initrd-12.2
cp /dal_DVD_12.2/isolinux/initrd.gz .
mv initrd.img initrd.gz
gunzip initrd.gz
cpio -i < initrd > /dev/null
rm initrd
cp /dal_DVD_12.2/kernels/hugesmp.s/bzImage .
cp /where_is_work/ramusb.igz .
cd ..
in pratica ora abbiamo un fileystem Linux completo contenuto nella directory "slack-initrd-12.2" ... ora lo copiamo sulla pennina (immaginiamo /dev/sdc2, formattata ext2):

Codice: Seleziona tutto

mkdir USB
mount /dev/sdc2 USB
cp -Rpdf slack-initrd-12.2 USB/
il nostro filesytem è ora sulla pennina, ben confinato all'interno di un'unica directory ... la voce di lilo.conf per avviarlo sarà circa così:

Codice: Seleziona tutto

image = /slack-initrd-12.2/bzImage
  label = USB12.2-install
  initrd=/slack-initrd-12.2/ramusb.igz
  read-write
  append = "USB_DISK_SIGNATURE=slack-initrd-12.2 rootfstype=ext2 rw SLACK_KERNEL=hugesmp.s"
così finalmente evitiamo di usare la FAT ...
vorrei riavere le mie firme ...

Avatar utente
zoros
Linux 4.x
Linux 4.x
Messaggi: 1361
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: Makeramusb: avviare da disco USB con kernel statico

Messaggio da zoros »

Parliamo ora di Raid hardware ... fai una ricerca sull'argomento e dove capiti ? ... ovviamente su slacky.eu ...

ho aggiornato allora lo script per la ramusb.igz per avviare una Slackware installata su una partizione Raid hardware, anche se, come si evince dall'articolo di cui sopra, spesso si tratta di un fakeraid gestito via software da un driver (proprietario in Windows, attraverso l'utility dmraid in Linux) ... il nuovo script allora aggiunge questo dmraid alla ramdisk, scaricandolo proprio da Slacky ... il tgz contiene una versione statica, ottimo !

Slackware 12.2 installato ha tutto ciò che serve per gestire questi fakeraid, anche il kernel huge-smp ha incorporati i moduli dm-mod e dm-mirror, moduli che gestiscono l'array di dischi creando non solo i devices in /dev/mapper ma anche /dev/dm-0 (l'intero disco), /dev/dm-1,/dev/dm-2,ecc. (le varie partizioni) ... problema: il DVD di Slackware non gestisce invece queste cose, il kernel crea il /dev/mapper, ma poi manca l'applicativo dmraid ! ... io ho usato altri tool (ovviamente), però è sicuramente possibile portarsi dietro il binario dmraid.static su una pennina USB ed eseguirlo da lì ... "dmraid -ay" crea immediatamente i devices in /dev/mapper/, un "mdev -s" successivo fa "apparire" anche i vari /dev/md-x (che si vedonono anche in /proc/partitions) ...

attivato il device raid (mettiamo che i dischi siano nuovi di fabbrica) un semplice "fdisk /dev/md-0" (o cfdisk) vi permetterà di creare le partizioni ...

le cose non sono proprio semplicissime, per esempio l'installazione si completa perfettamente sul disco raid, ma poi Lilo si rifiuta di riconoscere qualsiasi cosa che si chiami /dev/md-x ... soluzione: installare due Lilo, uno sul disco sda, uno sul disco sdb (i due dischi fisici che compongono l'array nel mio caso) ... quindi "dmraid -an" per "spegnere" l'array e quindi un mcedit sui due lilo.conf (e poi lilo) ... uno dei due lilo.conf (con il kernel 2.6.29.2 aggiunto):

Codice: Seleziona tutto

# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
lba32 # Allow booting past 1024th cylinder with a recent BIOS
append=" vt.default_utf8=0"
boot = /dev/sda

bitmap = /boot/slack.bmp
bmp-colors = 255,0,255,0,255,0
bmp-table = 60,6,1,16
bmp-timer = 65,27,0,255

prompt
timeout = 60
compact
large-memory

# Linux bootable partition config begins
image=/boot/vmlinuz-huge-smp-2.6.29.2-smp
initrd=/boot/ramusb.igz
append="DMRAID root=/dev/dm-3 ro"
#root = /dev/sda3
label = Linux26292
read-only

image=/boot/vmlinuz-huge-smp-2.6.27.7-smp
initrd=/boot/ramusb.igz
append="DMRAID root=/dev/dm-3 ro"
#root = /dev/sda3
label = Linux26277
read-only

# Linux bootable partition config ends
Importante: /etc/fstab deve contenere una riga che descrive il filesystem "/" altrimenti lo script "rc.S" va in loop continuo di fsck ... mah !

Codice: Seleziona tutto

/dev/root / auto defaults 1 1
questo lo script per la ramusb.igz:

Codice: Seleziona tutto

#!/bin/sh
# *** Makeramusb-slack *** copyleft (!C) FZ
# *** rev 0.5 - 05/03/2009 - fakeraid support added

echo "Removing previous structure and files ..."
#--------------------------------------------------------
rm -Rf work
rm -Rf initrd-tree

echo "Getting mkinitrd busybox ..."
#--------------------------------------------------------
if [ ! -f ./initrd-tree.tar.gz ] ; then
 cp -f /usr/share/mkinitrd/initrd-tree.tar.gz .
fi

if [ -f ./initrd-tree.tar.gz ] ; then
 mkdir -p initrd-tree
 tar -C initrd-tree -xzplf initrd-tree.tar.gz
else
 echo  "
./initrd-tree.tar.gz not found
/usr/share/mkinitrd/initrd-tree.tar.gz not found

get and install mkinitrd package ... exit
"
 exit
fi

echo "Getting dmraid ..."
#--------------------------------------------------------
if [ ! -f ./dmraid-1.0.0.rc13-i486-1bl.tgz ] ; then
 wget -c  http://repository.slacky.eu/slackware-11.0/system/dmraid/1.0.0.rc13/dmraid-1.0.0.rc13-i486-1bl.tgz .
fi

if [ -f ./dmraid-1.0.0.rc13-i486-1bl.tgz ] ; then
 mkdir -p dmraid-tree
 tar -C dmraid-tree -xzplf dmraid-1.0.0.rc13-i486-1bl.tgz
else
echo  "
./dmraid-1.0.0.rc13-i486-1bl.tgz not found
get and install dmraid package ... exit
"
 exit
fi

echo "Creating the folder structure ..."
#--------------------------------------------------------
mkdir -p work/initramfs/{dev,bin,sbin,etc,proc,sys,newroot,usr,usr/bin,usr/sbin}

#Create device nodes
mknod work/initramfs/dev/null c 1 3
mknod work/initramfs/dev/tty c 5 0
mknod work/initramfs/dev/console c 5 1

cp -f ./initrd-tree/bin/busybox ./work/initramfs/bin/
cp -f ./dmraid-tree/sbin/dmraid.static ./work/initramfs/bin/dmraid

cd work
touch initramfs/etc/mdev.conf

chmod +x initramfs/bin/busybox
ln -s busybox initramfs/bin/sh

echo "Creating a init script"
#--------------------------------------------------------
echo '#!/bin/sh

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

#Mount things needed by this script
busybox mount -t proc proc /proc
busybox mount -t sysfs sysfs /sys

#Create all the symlinks to /bin/busybox
/bin/busybox --install -s

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 "     **** FaZo Boot v 0.5 ****      "
echo "        with dmraid function        "
echo "------------------------------------"
echo

echo /bin/mdev > /proc/sys/kernel/hotplug

#Scan for devices
mdev -s

#Defaults
init="/sbin/init"
root="/dev/sda1"

HD_FOUND=

#Get USB-disk SIGNATURE
USB_LABEL=
COMMAND_LINE=`cat /proc/cmdline`

#adjust command line, remove white spaces, etc.
COMMAND_LINE=`echo $COMMAND_LINE | sed s/\s+//`
COMMAND_LINE=`echo $COMMAND_LINE | sed "s/ =/=/g"`
COMMAND_LINE=`echo $COMMAND_LINE | sed "s/= /=/g"`

R_RW_OPT="-r"
FS_TYPE=""
ROOTDEV=""

#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")  R_RW_OPT="-r";;
  "rw" | "read-write") R_RW_OPT="-w";;
  "dmraid" | "DMRAID")
   echo "Enable dmraid fakeraid-devices ..."
   dmraid -ay
   mdev -s
  ;;
 esac

 #Test fs type
 if [ "a$PARAM" = "arootfstype" ] ; then
   FS_TYPE="-t $VALUE"
 fi

 #Test root device
 if [ "a$PARAM" = "aroot" ] ; then
   ROOTDEV="$VALUE"
 fi

 if [ "a$PARAM" = "aUSB_DISK_SIGNATURE" ] ; then
   USB_LABEL=$VALUE
 fi

done

export R_RW_OPT=$R_RW_OPT
export FS_TYPE=$FS_TYPE
export ROOTDEV=$ROOTDEV

export IFS=`echo -ne " \t\n"`

#Search for disk signature in HDs
#------------------------------------------------

if [ "a$USB_LABEL" != "a" ] ; then

 #Try to mount USB-disk
 echo -n "Searching disk signature: $USB_LABEL "

 #Rescan for new devices
 mdev -s

 #Try to mount all HD devices
 #---------------------------------------------

 ls -1 /dev/hd* 2> /dev/null |
 while
  read TRY_DISK
  do
   mount $R_RW_OPT $FS_TYPE $TRY_DISK /newroot 1> /dev/null 2> /dev/null
   if [ -e /newroot/$USB_LABEL ] ; then
    echo "$USB_LABEL --> HARD DISK $TRY_DISK found"
    HD_FOUND="yes"
    break
   fi
   umount $TRY_DISK 2> /dev/null
 done

fi

#Search for disk signature in SDs
#------------------------------------------------

if [ "a$USB_LABEL" != "a" ] && [ "a$HD_FOUND" = "a" ] ; then

 #Try to mount USB-disk

 n=0

 #Repeat test 10 times
 while [ $n -le 9 ]
 do
  #Rescan for new devices
  mdev -s

  #Try to mount all sd devices
  #---------------------------------------------

  ls -1 /dev/sd* 2> /dev/null |
  while
   read TRY_DISK
   do
    mount $R_RW_OPT $FS_TYPE $TRY_DISK /newroot 1> /dev/null 2> /dev/null
    if [ -e /newroot/$USB_LABEL ] ; then
     echo
     echo "$USB_LABEL found in --> $TRY_DISK"
     echo
     break
    fi
    umount $TRY_DISK 2> /dev/null
  done
  #---------------------------------------------

  if [ -e /newroot/$USB_LABEL ] ; then
   break
  fi

  sleep 1
  let n=$n+1
  echo -n "."
 done

 echo " done."

fi

IS_ROOT_MOUNTED=`mount | grep /newroot`

#Check if device with LABEL is mounted
#-------------------------------------
if [ "a$USB_LABEL" != "a" ] ; then

 if [ "a$IS_ROOT_MOUNTED" != "a" ] ; then

  #try also to mount USB_SIGNATURE_FILE as loop device
  #---------------------------------------------------
  if [ -f /newroot/$USB_LABEL ] ; then
   mount /newroot/$USB_LABEL /newroot -o loop  1> /dev/null 2> /dev/null
  fi

 else
  echo "Error: disk signature <<$USB_LABEL>> not found !!!"

 fi
fi

#If nothing mounted try root= parameter
#------------------------------------------------
if [ "a$IS_ROOT_MOUNTED" = "a" ] && [ "a$ROOTDEV" != "a" ] ; then
 echo "Try to mount append device root=$ROOTDEV ..."
 mount $R_RW_OPT $FS_TYPE $ROOTDEV /newroot 1> /dev/null 2> /dev/null
fi

IS_ROOT_MOUNTED=`mount | grep /newroot`

#If nothing mounted ... ask
#------------------------------------------------

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

 echo "mount $R_RW_OPT $FS_TYPE $ALT_DEVICE /newroot"
 mount $R_RW_OPT $FS_TYPE $ALT_DEVICE /newroot 1> /dev/null 2> /dev/null
fi

#Check if $init exists and is executable
#------------------------------------------------

#check if perform chroot to /pathname, before
if [ -d /newroot/$USB_LABEL ] && [ -x "/newroot/$USB_LABEL/${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
 mount -o bind /newroot/$USB_LABEL /newroot
 exec switch_root /newroot "${init}"
fi

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."
più o meno ho detto tutto, il resto a vostra fantasia ... prossima mossa: ramusb.igz con supporto raid software ...
vorrei riavere le mie firme ...

Rispondi