Pagina 1 di 4

Script per un chroot

Inviato: mer 11 ago 2010, 19:58
da hashbang
Ciao a tutti,
circa una settimana fa mi è venuta un'idea di fare uno script che effettuasse un'installazione della Slackware in una directory. Insomma che preparasse un ambiente di chroot.
Lo script l'ho realizzato ma vorrei sottoporlo a voi per un eventuale miglioramento. Ho voluto realizzarlo in quanto utlizzando lo script pubblicato su slackworld
(era inizialmente per slackware 11.0, ma lo adattai alla 13.1) quando arrivava all'installazione non finiva mai. Infatti i pacchetti continuavano l'installazione all'infinito. Secondo me era derivato dal fatto che lo script effettuava un

Codice: Seleziona tutto

installpkg -root $CHROOTDIR *.t?z
cioè senza seguire un'ordine.
Il mio script invece installa il tutto come nell'installer di slackware (sezione per sezione).
Ecco lo script:

Codice: Seleziona tutto

#!/bin/sh

# Chroot Environment AutoBuilder
# Copyright (C) 2010 Luca De Pandis aka atomix600
# All rights reserved.
# Contact me @ Slacky.eu ( http://www.slacky.eu )
# 
# Heavily based on the Tom Newsom's Chroot Howto ( http://slackworld.berlios.de/2007/chroot_howto.html )
#
# Thanks to conraid, zoros and metrofox for improvements
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AS IS AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Exit on most errors
set -e

# Set variables
SLACKVERSION=${SLACKVERSION:-13.1}
PKGDIR=${PKGDIR:-/tmp/Slack_$SLACKVERSION}
SERIESDIR=${SERIESDIR:-"a ap d e f k kde kdei l n t tcl x xap y"}
CHROOTDIR=${CHROOTDIR:-/mnt/chroot}
MIRROR=${MIRROR:-ftp.slackware.at}
KDELANG=${KDELANG:-it} # Change this value for different language
PKGA=${PKGA:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/a/*.t?z}
PKGAP=${PKGAP:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/ap/*.t?z}
PKGD=${PKGD:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/d/*.t?z} 
PKGE=${PKGE:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/e/*.t?z}
PKGF=${PKGF:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/f/*.t?z}
PKGK=${PKGK:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/k/*.t?z}
PKGKDE=${PKGKDE:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/kde/*.t?z}
PKGKDEI=${PKGKDEI:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/kdei/*$KDELANG*.t?z}
PKGL=${PKGL:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/l/*.t?z}
PKGN=${PKGN:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/n/*.t?z}
PKGT=${PKGT:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/t/*.t?z}
PKGTCL=${PKGTCL:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/tcl/*.t?z}
PKGX=${PKGX:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/x/*.t?z}
PKGXAP=${PKGXAP:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/xap/*.t?z}
PKGY=${PKGY:-ftp://$MIRROR/slackware-$SLACKVERSION/slackware/y/*.t?z}
PATCHES=${PATCHES:-ftp://$MIRROR/slackware-$SLACKVERSION/patches/packages/*.t?z}
PATCHDIR=${PATCHDIR:-patches}
HOSTFILE=${HOSTFILE:-/etc/hosts}
FSTABFILE=${FSTABFILE:-/etc/fstab}
SPACE_REQUIRED=7 # GByte


# Set Functions
check_space_on_hd()
{
     SPACE=$(df -P -m $PKGDIR 2> /dev/null | tr -s ' ' | cut -f4 -d' ' | tail -1)
     if [ -z "$SPACE" ]; then
       echo 2 #error
     elif [ $(expr $SPACE - $SPACE_REQUIRED) -gt 0 ]; then
       echo 1
     else
       echo 0
     fi
}

connection_check() 
{
 messaggio="[ERROR] This script was not be able to connect to the mirror. Try later or check your internet connection."
 if [ -z "$ftp" ]; then
    ping -c5 ftp.slackware.at > /dev/null 2>&1
    if [ $? != 0 ]; then
       echo $messaggio
       exit 1
    fi
 fi
}

echo "+----------------------------------+"
echo "|  StArTiNg ChRoOt AuToBuIlDeR...  |"
echo "+----------------------------------+"

echo "This script will install Slackware $SLACKVERSION in a chroot environment."
echo "The estimated time for completion of the transaction is 80 minutes,"
echo "but it may vary depending on the configuration of the computer."
echo "[WARNING] you'll need about ${SPACE_REQUIRED} GiB in / to run this script [WARNING]"
echo "[WARNING] it's recommended a fast internet connection for download [WARNING]"

# Remove directories if that is necessary
echo -n "Checking for directories... "
rm -rf $PKGDIR
rm -rf $CHROOTDIR
mkdir -p $PKGDIR
echo "DONE"

# Check available space on hard disk
echo -n "Checking for space... "
CHECK=$(check_space_on_hd)
if [ $CHECK = 0 -o $CHECK = 2 ]; then
  echo "FAIL. There is NOT enough space."
else
  echo "OK"
fi

# Ping Mirror
echo -n "Checking for mirror... "
CHECK=$(connection_check)
echo "OK"

# Download Slackware Packages
cd $PKGDIR
mkdir -p $SERIESDIR
echo "Downloading packages from mirror..."
echo -n "Downloading Series A...    "
cd $PKGDIR/a
wget -c $PKGA > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series AP...   "
cd $PKGDIR/ap
wget -c $PKGAP > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series D...    "
cd $PKGDIR/d
wget -c $PKGD > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series E...    "
cd $PKGDIR/e
wget -c $PKGE > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series F...    "
cd $PKGDIR/f
wget -c $PKGF > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series K...    "
cd $PKGDIR/k
wget -c $PKGK > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series KDE...  "
cd $PKGDIR/kde
wget -c $PKGKDE > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series KDEI... "
cd $PKGDIR/kdei
wget -c $PKGKDEI > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series L...    "
cd $PKGDIR/l
wget -c $PKGL > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series N...    "
cd $PKGDIR/n
wget -c $PKGN > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series T...    "
cd $PKGDIR/t
wget -c $PKGT > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series TCL...  "
cd $PKGDIR/tcl
wget -c $PKGTCL > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series X...    "
cd $PKGDIR/x
wget -c $PKGX > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series XAP...  "
cd $PKGDIR/xap
wget -c $PKGXAP > /dev/null 2>&1
echo "DONE"

echo -n "Downloading Series Y...    "
cd $PKGDIR/y
wget -c $PKGY > /dev/null 2>&1
echo "DONE"

echo "Slackware $SLACKVERSION was downloaded successfully..."

# Prepare your Chroot Environment
echo "Starting Installation..."
cd $PKGDIR
mkdir -p $CHROOTDIR

# Install packages in chroot
echo -n "Installing series A...    "
installpkg -root $CHROOTDIR a/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series AP...   "
installpkg -root $CHROOTDIR ap/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series D...    "
installpkg -root $CHROOTDIR d/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series E...    "
installpkg -root $CHROOTDIR e/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series F...    "
installpkg -root $CHROOTDIR f/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series K...    "
installpkg -root $CHROOTDIR k/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series KDE...  "
installpkg -root $CHROOTDIR kde/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series KDEI... "
installpkg -root $CHROOTDIR kdei/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series L...    "
installpkg -root $CHROOTDIR l/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series N...    "
installpkg -root $CHROOTDIR n/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series T...    "
installpkg -root $CHROOTDIR t/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series TCL...  "
installpkg -root $CHROOTDIR tcl/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series X...    "
installpkg -root $CHROOTDIR x/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series XAP...  "
installpkg -root $CHROOTDIR xap/*.t?z > /dev/null 2>&1
echo "DONE"

echo -n "Installing series Y...    "
installpkg -root $CHROOTDIR y/*.t?z > /dev/null 2>&1
echo "DONE"

echo "Slackware $SLACKVERSION was installed successfully"

# Download patches
echo -n "Downloading patches... "
mkdir -p $PATCHDIR
(cd $PATCHDIR
wget -c $PATCHES > /dev/null 2>&1)
echo "DONE"

# Install patches
echo -n "Patching Slackware... "
ROOT=$CHROOTDIR upgradepkg --install-new patches/*.t?z > /dev/null 2>&1
echo "DONE"

# Copy host name and host partition table
echo -n "Configuring hostname and partition table... "
cp -a $HOSTFILE $CHROOTDIR/etc/hosts
cp -a $FSTABFILE $CHROOTDIR/etc/fstab
echo "DONE"

# Remove Slackware Packages
echo -n "Cleaning Cache... "
cd /tmp
rm -r $PKGDIR
echo "DONE"

echo "Finish!!!"

echo "+----------------------------------+"
echo "|  Thank you for using my builder  |"
echo "+----------------------------------+"

echo "#####################################################"
echo " If you want to start this chroot environment:"
echo " mount -o bind /proc $CHROOTDIR/proc"
echo " mount -o bind /dev $CHROOTDIR/dev"
echo " chroot $CHROOTDIR /bin/bash"
echo "#####################################################"
Che ne pensate?

EDIT: Ecco lo script con alcuni piccoli accorgimenti.

Re: Script per un chroot

Inviato: mer 11 ago 2010, 20:07
da navajo
be intanto, leggere qui: directory invece che directory----- mi vien da pensare ..

Re: Script per un chroot

Inviato: mer 11 ago 2010, 20:33
da conraid
bah, io ogni volta faccio

Codice: Seleziona tutto

installpkg --root /dir/dove/voglio */*.t?z
e non ho problemi

Re: Script per un chroot

Inviato: mer 11 ago 2010, 20:39
da hashbang
è strano, perchè a me col suo script, scaricava tutto in una directory e poi installava, il problema era che l'installazione a distanza di ore non finiva (lo misi di pomeriggio e quando tornai di notte non aveva ancora finito, poi mi accorsi che installava sempre gli stessi pacchetti a rotazione). Comunque conraid anche io ho eseguito il tuo metodo solo che io ho specificato di volta in volta la directory delle sezioni. Forse mi sono complicato la vita ma è stato efficace. Comunque proverò il tuo metodo e vedo che problemi mi da.

Re: Script per un chroot

Inviato: mer 11 ago 2010, 20:47
da conraid
script? mio metodo?
è semplicemente un comando da terminale

Re: Script per un chroot

Inviato: mer 11 ago 2010, 20:56
da hashbang
conraid ha scritto:script? mio metodo?
è semplicemente un comando da terminale
Mi sono espresso male, lo script a cui mi riferisco è quello messo a disposizione su slackworld.

Re: Script per un chroot

Inviato: gio 12 ago 2010, 21:50
da zoros
conraid ha scritto:bah, io ogni volta faccio

Codice: Seleziona tutto

installpkg --root /dir/dove/voglio */*.t?z
e non ho problemi
be! tutto sommato è un metodo: documenta il fatto che l'installazione "full" di Slackware si riduce ad una sola riga di comando da terminale ...

il "metodo" funziona anche per installazioni "normali" con l'accorgimento di creare una voce per il filesystem "/" in fstab ed installare Lilo prima del reboot ... al riavvio si perfeziona in pkgtool --> setup eseguendo mkfontdir e fontconfig ...

scusate l'OT, ma forse può essere simpatico provare così ;) ...

Re: Script per un chroot

Inviato: ven 13 ago 2010, 12:54
da twister
[OT]
Immagine!=Immagine
[/OT]

Re: Script per un chroot

Inviato: ven 13 ago 2010, 14:22
da metrofox
Un'altra cosa:

Codice: Seleziona tutto

# Ping Mirror
echo "Checking for mirror..."
ping -c5 $MIRROR
Se il mirror è offline che succede? :D Lo script continua ad andare, quando invece se il mirror non è pingabile bisognerebbe cambiarlo o fermare lo script, metti un if o inventati qualcosa

Dopodiché:

Codice: Seleziona tutto

installpkg --root $CHROOTDIR */*.t?z
Efficiente e ti risparmia un sacco di fatica, come dice conraid...

Re: Script per un chroot

Inviato: ven 13 ago 2010, 22:20
da zoros
ripensandoci ... finora avevo usato una procedura tipo:

Codice: Seleziona tutto

cd /hd-linux
for packages in a ap d e f n l t tcl x xap kde kdei k y
do
 installpkg -root /hd-linux /cdrom/$packages_path/$packages/*.t?z
done
(in /hd-linux una partizione vuota montata)

proprio oggi mi serviva una 10.0, così ho lanciato questo comando:

Codice: Seleziona tutto

installpkg --root /mnt/sdb4/slackware/10.0/rootfs */*.t?z
non so perché (forse il path troppo lungo?), ma il --root non l'ha preso, iniziando ad installare in "/" ... pochi secondi e mi sono ritrovato con questa root:

Codice: Seleziona tutto

root@FabioX:/mnt/sda3# ls -l
totale 216
...
lrwxrwxrwx  1 root root    10 13 ago 16:48 include -> ../include
lrwxrwxrwx  1 root root     6 13 ago 16:48 lib -> ../lib
lrwxrwxrwx  1 root root    10 13 ago 16:48 libexec -> ../libexec
...
lrwxrwxrwx  1 root root     6 13 ago 16:48 man -> ../man
...
lrwxrwxrwx  1 root root     8 13 ago 16:48 share -> ../share
...
più l'intero sistema X11 rimosso! ...

per ripristinare ho dovuto ricopiare "a manina" tutte le parti mancanti (sostituite, come si vede, da link al nulla!) ...

giusto per info, così magari per pensare a qualche controllo aggiuntivo "di coerenza" nello script :)

Re: Script per un chroot

Inviato: dom 15 ago 2010, 17:09
da hashbang
Lo script è quasi pronto....ho apportato le modifiche da voi suggerite tranne quella dell'

Codice: Seleziona tutto

installpkg $CHROOTDIR */*.t?z
Non l'ho modificato per una questione di trasparenza...in questo modo chi esegue lo script sa a che punto sta l'installazione...per il controllo del mirror tutto ok...ora fa un check VERO. Se il mirror è ok parte il download, se il mirror è OUT il download non va e si chiude lo script :) ho postato la revisione nello stesso tag code del primo post (ovviamente ho sostituito la vecchia versione) :)

Re: Script per un chroot

Inviato: dom 15 ago 2010, 17:11
da hashbang
zoros ha scritto:ripensandoci ... finora avevo usato una procedura tipo:

Codice: Seleziona tutto

cd /hd-linux
for packages in a ap d e f n l t tcl x xap kde kdei k y
do
 installpkg -root /hd-linux /cdrom/$packages_path/$packages/*.t?z
done
(in /hd-linux una partizione vuota montata)

proprio oggi mi serviva una 10.0, così ho lanciato questo comando:

Codice: Seleziona tutto

installpkg --root /mnt/sdb4/slackware/10.0/rootfs */*.t?z
non so perché (forse il path troppo lungo?), ma il --root non l'ha preso, iniziando ad installare in "/" ... pochi secondi e mi sono ritrovato con questa root:

Codice: Seleziona tutto

root@FabioX:/mnt/sda3# ls -l
totale 216
...
lrwxrwxrwx  1 root root    10 13 ago 16:48 include -> ../include
lrwxrwxrwx  1 root root     6 13 ago 16:48 lib -> ../lib
lrwxrwxrwx  1 root root    10 13 ago 16:48 libexec -> ../libexec
...
lrwxrwxrwx  1 root root     6 13 ago 16:48 man -> ../man
...
lrwxrwxrwx  1 root root     8 13 ago 16:48 share -> ../share
...
più l'intero sistema X11 rimosso! ...

per ripristinare ho dovuto ricopiare "a manina" tutte le parti mancanti (sostituite, come si vede, da link al nulla!) ...

giusto per info, così magari per pensare a qualche controllo aggiuntivo "di coerenza" nello script :)
Per questo ho usato un percorso per la directory di chroot molto breve: /mnt/chroot.
Inoltre lo script l'ho testato sul mio pc e non ho riscontrato nessun problema da te descritto....quindi se lasci la variablie $CHROOTDIR originale non dovresti avere problemi ;)

Re: Script per un chroot

Inviato: dom 15 ago 2010, 18:31
da metrofox
Allora, sarebbe bene aumentarne la portabilità, l'efficienza di uno script oltre al fatto che debba essere scritto bene è anche il fatto che funzioni su svariati computer, così come un programma... Ad esempio, per il riconoscimento automatico della versione di slackware al posto di fare:

Codice: Seleziona tutto

SLACKVERSION=${SLACKVERSION:-13.1}
Potresti anche fare:

Codice: Seleziona tutto

SLACKVERSION=${SLACKVERSION:-$(cat /etc/slackware-version)}
Poi un'altra cosa:

Codice: Seleziona tutto

if [ -z "$ftp" ]; then
Stai facendo una condizione con una variabile che non è stata dichiarata, non che abbia un senso molto logico dopotutto...

Re: Script per un chroot

Inviato: dom 15 ago 2010, 19:50
da hashbang
metrofox ha scritto:Allora, sarebbe bene aumentarne la portabilità, l'efficienza di uno script oltre al fatto che debba essere scritto bene è anche il fatto che funzioni su svariati computer, così come un programma... Ad esempio, per il riconoscimento automatico della versione di slackware al posto di fare:

Codice: Seleziona tutto

SLACKVERSION=${SLACKVERSION:-13.1}
Potresti anche fare:

Codice: Seleziona tutto

SLACKVERSION=${SLACKVERSION:-$(cat /etc/slackware-version)}
Poi un'altra cosa:

Codice: Seleziona tutto

if [ -z "$ftp" ]; then
Stai facendo una condizione con una variabile che non è stata dichiarata, non che abbia un senso molto logico dopotutto...
Ok per il primo punto non è stato chiaro il valore di $SLACKVERSION. Quella variabile indica la versione di slackware su cui bisogna operare e non quella in uso. Se tu imposti il valore 13.0 lui scaricherà i pacchetti di Slackware 13.0. Nel momento in cui uscirà, se sarà sempre della serie 13x, la 13.2 basterà cambiare il valore della variabile per chrootare una nuova versione della Slack. Ed è proprio per motivi di portabilità che ho scelto di utilizzare quella variabile. Infatti se hai fatto caso la uso anche nelle variabili dei pacchetti. Per il secondo punto hai ragione, sto correggendo il problema. Però è strano, la variabile è sbagliata ma fa il suo dovere :D .

Re: Script per un chroot

Inviato: dom 15 ago 2010, 21:18
da metrofox
Ok per il primo punto non è stato chiaro il valore di $SLACKVERSION. Quella variabile indica la versione di slackware su cui bisogna operare e non quella in uso. Se tu imposti il valore 13.0 lui scaricherà i pacchetti di Slackware 13.0.
Ah vero, avevo dimenticato, sorry.
Però è strano, la variabile è sbagliata ma fa il suo dovere
Bhè, ma ci mancherebbe altro, fai una condizione che dice: "Se la variabile $ftp è nulla allora fai..." Non è un buon metodo comunque:

Offtopic: Post n.666
LOL