Aggancia questa barra allo schermo |  Disattiva gli effetti grafici


Una mini Slackware su pendrive


 

Vi presento uno script bash che crea una mini Slackware su pendrive in automatico.

script

Questo esempio fa riferimento a Slackware dalla 14.0 in poi sia a 32 bit che 64 bit.
Cerca i pacchetti elencati nell'array se sono già presenti nella directory impostata, se non li trova e se c'è il dvd di Slackware montato li copia da esso, altrimenti li scarica da internet.
Poi esegue una procedura ispirata alla guida presente su slacky.eu.

A partire da Slackware 14.1, non sono più stati inclusi builtin i driver per l'USB (sono stati abilitati come moduli), quindi ho dovuto fare delle piccole aggiunte allo script per poter includere tali driver nell'initrd.

mk.minislack (Slackware >= 14.0)

#!/bin/sh
# Copyright (C) 2013-2017, Andrea Peluso <sya54m@gmail.com>
# Tutti i diritti riservati.
#
# ___ changelog ___
#
# 14.2.2 (19/11/2017)
# corretto bug mancanza directory packages
# aggiornati pacchetti current
#
# 14.2.1 (27/05/2016)
# corretto bug su 64 bit
#
# 14.2 (12/05/2016)
# aggiunta lista pacchetti di Slackware 14.2
# modifica dell'initrd per includere i driver usb
# aggiunto supporto 64 bit
# aggiunto controllo esistenza dispositivo passato per argomento
# aggiunta configurazione del file lang.sh
# rilevamento automatico delle versioni dei pacchetti
# rilevamento automatico delle dipendenze di mount
#
# 14.1.1 (26/05/2015)
# aggiunte patch di sicurezza rilasciate per la 14.1
# aggiunto controllo permessi root
# modificato messaggio di aiuto
#
# 14.1 (14/11/2013)
# aggiornata lista pacchetti a Slackware 14.1
# modifica dell'initrd per includere i driver usb
#
# 14.0 (29/04/2013)
# prima versione (basata su Slackware 14.0)

#### Configurazione ####
TMPPKG="/tmp/minislackpkg"
TMPINITRD="/tmp/initrd"
MNT="/mnt/memory"
DVD="/media/SlackDVD"
MIRROR="http://ftp.slackware.com/pub/slackware"
ARCH="" # vuoto per 32 bit, "64" per 64 bit
VERSION="current"
lng="it"
COD="UTF-8"
########################

if [ "$VERSION" == "current" ]; then
  PKG=(
aaa_base- aaa_elflibs- aaa_terminfo- acl- acpid- attr- bash- btrfs-progs- bin-
coreutils- dcron- devs- dialog- dosfstools- e2fsprogs- elvis- etc-
eudev- file- findutils- glibc-solibs- glibc-zoneinfo- gpm- grep- gzip- hdparm-
hwdata- kbd- kernel-firmware- kernel-huge-smp- kernel-modules-smp- kmod- less-
libcgroup- libgudev- mkinitrd- ntfs-3g- openssl-solibs- pciutils- pkgtools-
procps-ng- sed- shadow- sharutils- smartmontools- sysvinit-[0-9]
sysvinit-scripts- tar- util-linux- xz-
dmidecode- lm_sensors- mc- nano-
libxml2-
net-tools- network-scripts- openssh-
)
elif [ "$VERSION" == "14.2" ]; then
  PKG=(
aaa_base- aaa_elflibs- aaa_terminfo- acl- acpid- attr- bash- btrfs-progs- bin-
coreutils- dcron- devs- dialog- dosfstools- e2fsprogs- eject- elvis- etc-
eudev- file- findutils- glibc-solibs- glibc-zoneinfo- gpm- grep- gzip- hdparm-
hwdata- kbd- kernel-firmware- kernel-huge-smp- kernel-modules-smp- kmod- less-
libcgroup- libgudev- mkinitrd- ntfs-3g- openssl-solibs- pciutils- pkgtools-
procps-ng- sed- shadow- sharutils- smartmontools- sysvinit-[0-9]
sysvinit-scripts- tar- util-linux- xz-
dmidecode- lm_sensors- mc- nano-
json-c- libxml2-
net-tools- network-scripts- openssh-
)
elif [ "$VERSION" == "14.1" -o "$VERSION" == "14.0" ]; then
  PKG=(
aaa_base- aaa_elflibs- aaa_terminfo- acl- acpid- attr- bash- bin- btrfs-progs-
coreutils- cxxlibs- dcron- devs- dialog- dosfstools- e2fsprogs- eject- elvis-
etc- file- findutils- glibc-solibs- glibc-zoneinfo- gpm- grep- gzip- hdparm-
kbd- kernel-firmware- kernel-huge-smp- kernel-modules-smp- kmod- less-
libcgroup- ntfs-3g- openssl-solibs- pciutils- pkgtools- procps- sed- shadow-
sharutils- smartmontools- sysvinit- sysvinit-scripts- tar- udev- util-linux-
xz-
dmidecode- lm_sensors- mc- nano-
net-tools- network-scripts- openssh-
)
fi

TEST=$?
if [ $# -ne 1 -o $TEST -ne 0 ]; then
  echo -e "Uso: $0 /dev/sdx\n"
  echo "Procedura automatizzata per la costruzione di una mini Slackware."
  echo "Copyright (C) 2013-2016, Andrea Peluso."
  echo "Esempio:"
  echo "  $(basename $0) /dev/sdX"
  echo -e "\nSegnalare i bug di mk.minislack a <sya54m@gmail.com>"
  echo -e "Sito web di mk.minislack: <http://www.sya54m.eu/>\n"
  exit 1
fi
if [ "$(whoami)" != "root" ]; then
  echo -e "Permesso negato: eseguire come root.\n"
  exit 1
fi
if [ ! -b "$1" ]; then
  echo -e "Errore: il dispositivo $1 non esiste.\n"
  exit 1
fi
LNG=$(echo $lng | tr "[:lower:]" "[:upper:]")
rm -rf $TMPINITRD
umount $11 2> /dev/null
set -e
mkdir -p $TMPPKG $MNT
cd $TMPPKG
if [ ! -r FILE_LIST ] || [ -r FILE_LIST -a $(expr `date +%s` - `stat -c %Z FILE_LIST`) -gt 3600 ]; then
	wget $MIRROR/slackware$ARCH-$VERSION/slackware$ARCH/FILE_LIST -O FILE_LIST
fi
if [ ! -r patchesFILE_LIST ] || [ -r patchesFILE_LIST -a $(expr `date +%s` - `stat -c %Z patchesFILE_LIST`) -gt 3600 ]; then
	wget $MIRROR/slackware$ARCH-$VERSION/patches/FILE_LIST -O patchesFILE_LIST
fi
NUM=0
while [ "$NUM" -lt "${#PKG[*]}" ]; do
  if [ "$ARCH" == "64" -a -n "`echo ${PKG[$NUM]} |grep kernel`" ]; then
    PKG[$NUM]=$(echo ${PKG[$NUM]} |sed "s|-smp||g")
  fi
  FILE[$NUM]=$(cat patchesFILE_LIST |egrep ".tgz|.txz" |egrep -v ".asc|.md5" |egrep /${PKG[$NUM]} |cut -d / -f2,3,4)
  if [ -z "${FILE[$NUM]}" ]; then
    FILE[$NUM]=$(cat FILE_LIST |egrep ".tgz|.txz" |egrep -v ".asc|.md5" |egrep /${PKG[$NUM]} |cut -d / -f2,3)
  fi
  if [ -n "$(echo ${FILE[$NUM]} |grep "/kernel-huge")" ]; then
    KERNELVER=$(ls $TMPPKG/${FILE[$NUM]} |rev |cut -d- -f3 |rev)
  fi
  if [ -n "$(echo ${FILE[$NUM]} |grep "/kernel-modules-")" ]; then
    kmodules=$(ls $TMPPKG/${FILE[$NUM]} |rev |cut -d/ -f1 |cut -f2- -d. |rev)
    kmodulesp=$TMPPKG/${FILE[$NUM]}
  fi
  if [ ! -f "$TMPPKG/${FILE[$NUM]}" ]; then
    if [ -r "$DVD/slackware$ARCH/${FILE[$NUM]}" ]; then
      echo "+=============================================================================="
      echo "| Copia del file `expr $NUM + 1` di ${#PKG[*]}: ${FILE[$NUM]}"
      echo "+=============================================================================="
      cp "$DVD/slackware$ARCH/${FILE[$NUM]}" "$TMPPKG/${FILE[$NUM]}" || rm "$TMPPKG/${FILE[$NUM]}"
    else
      echo "+=============================================================================="
      echo "| Download del file `expr $NUM + 1` di ${#PKG[*]}: ${FILE[$NUM]}"
      echo "+=============================================================================="
      if [ "$VERSION" == "current" ]; then
        curl "$MIRROR/slackware$ARCH-$VERSION/slackware$ARCH/${FILE[$NUM]}" --create-dirs -o "$TMPPKG/${FILE[$NUM]}" || rm "$TMPPKG/${FILE[$NUM]}"
      else
        if [ -n "$(echo ${FILE[$NUM]} |grep "packages/")" ]; then
          curl "$MIRROR/slackware$ARCH-$VERSION/patches/${FILE[$NUM]}" --create-dirs -o "$TMPPKG/${FILE[$NUM]}" || rm "$TMPPKG/${FILE[$NUM]}"
        else
          curl "$MIRROR/slackware$ARCH-$VERSION/slackware$ARCH/${FILE[$NUM]}" --create-dirs -o "$TMPPKG/${FILE[$NUM]}" || rm "$TMPPKG/${FILE[$NUM]}"
        fi
      fi
    fi
  fi
  NUM=`expr $NUM + 1`
done
echo -e "\E[031;1mDownload completati.\E[031;0m"
mkfs.ext4 -L minislack $11
tune2fs -O ^has_journal $11
mount -o exec -rw -t ext4 $11 $MNT
installpkg -root $MNT $TMPPKG/*/*.t?z
if [ -n "$(ls $TMPPKG/*.t?z 2> /dev/null)" ]; then
  installpkg -root $MNT $TMPPKG/*.t?z
fi
if [ -n "$(ls $TMPPKG/*/*/*.t?z 2> /dev/null)" ]; then
  installpkg -root $MNT $TMPPKG/*/*/*.t?z
fi
mkdir $TMPINITRD
cd $TMPINITRD
mkdir bin
tar -C $TMPINITRD -zxf $MNT/usr/share/mkinitrd/initrd-tree.tar.gz './bin/busybox'
cd bin
cp -p $MNT/bin/mount $TMPINITRD/bin
mkdir $TMPINITRD/lib$ARCH
libmount=(`ldd $MNT/bin/mount |cut -d' ' -f1 |tr -d '\t' |cut -d/ -f3`)
NUM=0
while [ "$NUM" -lt "${#libmount[*]}" ]; do
  if [ -f $MNT/lib$ARCH/${libmount[$NUM]} ]; then
    cp -p $MNT/lib$ARCH/${libmount[$NUM]} $TMPINITRD/lib$ARCH
  fi
  NUM=`expr $NUM + 1`
done
if [ -f $MNT/lib$ARCH/libm.so.6 ]; then
  cp -p $MNT/lib$ARCH/libm.so.6 $TMPINITRD/lib$ARCH
fi
ln -s busybox ash
ln -s busybox echo
ln -s busybox umount
ln -s busybox sleep
ln -s busybox switch_root
if [ "$VERSION" != "14.0" ]; then
  mkdir $TMPINITRD/sbin
  cd $TMPINITRD/sbin
  ln -s ../bin/busybox modprobe
  controllo=0
  if [ -z "`ls /var/log/packages/$kmodules 2> /dev/null`" ]; then
    controllo=1
    tar -C $TMPPKG -xf $kmodulesp "lib/modules/"$(echo $KERNELVER |tr _ -)
    mv $TMPPKG/lib/modules/$(echo $KERNELVER |tr _ -) /lib/modules/$(echo $KERNELVER |tr _ -)-minislack
    rm -rf $TMPPKG/lib
  fi
  if [ "$VERSION" == "14.1" ]; then
    mkinitrd -c -k $(echo $KERNELVER |tr _ -)-minislack -m ehci-pci:xhci-hcd:uhci-hcd:ohci-hcd:usb-storage
  else
    mkinitrd -c -k $(echo $KERNELVER |tr _ -)-minislack -m ehci-pci:xhci-hcd:xhci-pci:uhci-hcd:ohci-hcd:usb-storage
  fi
  if [ "$controllo" == "1" ]; then
    rm -rf /lib/modules/$(echo $KERNELVER |tr _ -)-minislack
  fi
  mkdir -p $TMPINITRD/lib/modules
  cp -r /boot/initrd-tree/lib/modules/$(echo $KERNELVER |tr _ -)-minislack $TMPINITRD/lib/modules/$(echo $KERNELVER |tr _ -)
fi
mkdir $TMPINITRD/etc
touch $TMPINITRD/etc/mtab
mkdir $TMPINITRD/dev
cp -r /dev/null $TMPINITRD/dev
mknod $TMPINITRD/dev/sda1 b 8 1
mknod $TMPINITRD/dev/sdb1 b 8 17
mknod $TMPINITRD/dev/sdc1 b 8 33
mknod $TMPINITRD/dev/sdd1 b 8 49
mknod $TMPINITRD/dev/sde1 b 8 65
mknod $TMPINITRD/dev/sdf1 b 8 81
mknod $TMPINITRD/dev/sdg1 b 8 97
mkdir $TMPINITRD/proc $TMPINITRD/mnt
if [ "$VERSION" == "14.0" ]; then
  moduli=""
elif [ "$VERSION" == "14.1" ]; then
  moduli="/sbin/modprobe ehci-hcd
/sbin/modprobe ehci-pci
/sbin/modprobe xhci-hcd
/sbin/modprobe uhci-hcd
/sbin/modprobe ohci-hcd
/sbin/modprobe usb-storage"
else
  moduli="/sbin/modprobe ehci-hcd
/sbin/modprobe ehci-pci
/sbin/modprobe xhci-hcd
/sbin/modprobe xhci-pci
/sbin/modprobe uhci-hcd
/sbin/modprobe ohci-hcd
/sbin/modprobe usb-storage"
fi
cat > $TMPINITRD/init <<EOF
#!/bin/ash
mount -n proc /proc -t proc
$moduli
echo "Cerco la partizione con etichetta minislack..."
while ! mount -n -r -L minislack /mnt 2> /dev/null;
 do
    sleep 1;
 done
umount /proc
exec switch_root /mnt /sbin/init \$@
EOF
chmod u+x $TMPINITRD/init
cd $TMPINITRD
chown -R root:root .
find . | cpio -o -H newc | gzip -9 -n > $MNT/boot/initrd.gz
echo -e "LABEL=minislack\t\t/\text4\tdefaults,noatime\t0 1" > $MNT/etc/fstab
cat > $MNT/etc/hardwareclock <<EOF
localtime
EOF
cat > $MNT/etc/rc.d/rc.keymap <<EOF
#!/bin/sh
if [ -x /usr/bin/loadkeys ]; then
 /usr/bin/loadkeys $lng.map
fi
EOF
chmod 755 $MNT/etc/rc.d/rc.keymap
sed -i "s|en_US|$lng\_$LNG.$COD|g" $MNT/etc/profile.d/lang.sh
cat > $MNT/etc/lilo.conf <<EOF
boot = $1
map=$MNT/boot/map
compact
lba32
large-memory

image = $MNT/boot/vmlinuz
  label = Slackware
  initrd = $MNT/boot/initrd.gz
EOF
lilo -C $MNT/etc/lilo.conf
Scarica [.sh]    ...scaricato 225 volte, dimensione: 10 KB

È sufficiente eseguirlo in questo modo:

# ./mk.minislack /dev/sdX

Dove /dev/sdX è il devicenode che punta alla pendrive.

Scritto da: Andrea Peluso (sya54M), . Ultimo aggiornamento: .

Commenti

5 commenti

purtroppo lo script si blocca quando arriva al download 29 e genera questo errore:
==============================================================================
| Download del file 29 di 60: a/kbd-1.15.3-x86_64-2.txz
+==============================================================================
--2016-05-27 11:42:50-- http://ftp.slackware.com/pub/slackware/slackware64-current/slackware64/a/kbd-1.15.3-x86_64-2.txz
Risoluzione di ftp.slackware.com (ftp.slackware.com)... 140.211.166.134
Connessione a ftp.slackware.com (ftp.slackware.com)|140.211.166.134|:80... connesso.
Richiesta HTTP inviata, in attesa di risposta... 200 OK
Lunghezza: 1147168 (1,1M)
Salvataggio in: "/tmp/minislackpkg/a/kbd-1.15.3-x86_64-2.txz"

/tmp/minislackpkg/a 100%[===================>] 1,09M 786KB/s in 1,4s

2016-05-27 11:42:52 (786 KB/s) - "/tmp/minislackpkg/a/kbd-1.15.3-x86_64-2.txz" salvato [1147168/1147168]

tr: opzione non valida -- "m"
Try 'tr --help' for more information.

Unica cosa che ho cambiato nello script, aggiunta del 64 all'interno delle virgolette nella riga Arch=""

Luca

-

Chiedo scusa, ho pubblicato senza testare la versione a 64 bit, ho sistemato. Grazie della segnalazione.

Andrea Peluso

http://www.sya54m.eu

ciao Andrea!..

nei pacchetti current selezionati sono inclusi i moduli nvme del kernel ?..

sono inseriti nella live edition di alien bob e in slackellive, che riconoscono correttamente il mio ssd m.2 v-nand 950 pro nvme (2400mb/sec), ma non sono installabili su hd/ssd.. dunque pensavo di usare questa (meno ingombrante) per effettuare dei test, in attesa di installare la 14.2 che sicuramente ne dovrebbe disporre.


franz

http://kanzy.altervista.org

Ciao Franz, sì, viene usato il kernel huge di Slackware, che come si vede dal config:

CONFIG_BLK_DEV_NVME=y

è incluso nell'immagine del kernel.

Andrea Peluso

http://www.sya54m.eu

grazie 1000.. adesso la scarico

franz

http://kanzy.altervista.org

I campi contrassegnati con * sono obbligatori.

Condividi sui tuoi social preferiti!

Facebook Linkedin Twitter Google+
.