Utilitaire d'aide à la création d'un dossier chroot
Le 18 septembre 2007 à 09:48, 3ième version du billet (Correction par Dab (mkdir et trace)).
L'objectif de ce script est de fournir une fonction simple pour stocker dans un dossier un binaire et toutes ses dépendances en respectant l'arborescence d'origine (ma_racine/usr/lib,ma_racine/usr/bin, etc...) L'utilisation "typique" est de créer une environnement chrooté qui ne contient que les commandes que nous avons décidé de mettre dans sa racine.
- v3 - Correction par Dab (mkdir et trace) (2008-07-30 13:55)
- v2 - Un version un peu plus évoluée (2007-09-18 14:41)
Syntaxe
mk-chroot racine commandes
- racine
- Le dossier racine qui va recevoir les fichiers
-
- commandes
- commande [commandes]
-
- commande
- Une commande à intégrer dans le dossier racine
-
Exemple
mkdir ~
/maRacine
mk-chroot ~
/maRacine bash
ls rm
chroot ~
/maRacine
/bin
/bash
Scripte
#! /bin/sh
function _copy
{
source="$1"
if [ ! -f $
1 ] ;
then
source=`whereis $
1 | awk '{ print $2}'`
fi
static=`ldd $source | grep "not a dynamic executable"`
if [ -z
"$static" ] ;
then
libs=`ldd -v
$source | cut -d
">" -f2
| grep "/"| cut -d
"(" -f1
| tr ":" " " | awk '{print $1};' | sort -u
`
else
libs=$source
fi
for lib
in $libs ;
do
if [ -h
$lib ] ;
then
if [ ! -h .
/$lib ] ;
then
target=`dirname .
$lib`
echo "Copy link from $lib to $target"
if [ ! -d
$target ] ;
then
mkdir -p
$target
fi
cp -d
$lib $target
fi
lib=$
(readlink -f
$lib)
fi
if [ ! -f .
/$lib ] ;
then
target=`dirname .
$lib`
echo "Copy file from $lib to $target"
if [ ! -d
$target ] ;
then
mkdir -p
$target
fi
man/linux
/commandes
/cp">
cp -d
$lib $target
fi
done
}
cd $
1
shift
for command in $* ;
do
_copy
$command
done
- répondre
Dab, le 18 September, 2007 - 13:11Sympa et très pratique ce petit programme par contre il ne fonctionne pas chez moi. Cela est dû à deux raisons:
1 - le /bin/sh est un lien qui pointe sur un shell qui n'est pas forcement le bash (exemple sous ubuntu c'est le dash or le dash ne connait pas 'function' et donc remplacer /bin/sh par /bin/bash
2 - les liens font référence au répertoire de chroot
mkdir ~/maRacine
./mk-chroot ~/maRacine bash
/bin/bash -> /bin/bash
/lib/ld-linux.so.2 -> /lib/ld-2.5.so
/lib/libncurses.so.5 -> /lib/libncurses.so.5.5
/lib/tls/i686/cmov/libc.so.6 -> /lib/tls/i686/cmov/libc-2.5.so
/lib/tls/i686/cmov/libdl.so.2 -> /lib/tls/i686/cmov/libdl-2.5.so
en fait :
cd maRacine/lib/
ls -l
-rwxr-xr-x 1 root root 109268 2007-09-18 13:58 ld-2.5.so
lrwxrwxrwx 1 root root 28 2007-09-18 13:58 ld-linux.so.2 -> /root/maRacine/lib/ld-2.5.so
lrwxrwxrwx 1 root root 36 2007-09-18 13:58 libncurses.so.5 -> /root/maRacine/lib/libncurses.so.5.5
-rw-r--r-- 1 root root 268600 2007-09-18 13:58 libncurses.so.5.5
les liens devraient pointer sir /lib et non /root/maRacine/lib.
- répondre
Ulhume, le 18 September, 2007 - 14:43Pour le 1/ je suis pas bien sur de comprendre. Moi aussi c'est un symlink mais cela n'empêche pas le script de fonctionner ?
Pour le 2/ J'ai fait une petite mise à jour avec une version plus évoluée qui prends en compte les symlinks. Je l'avais faite dans un autre cadre (compilation pour zaurus dans un env chrooté) mais cela devrait marcher mieux dans ton cas je pense.
- répondre
Dab, le 18 September, 2007 - 16:061 - Le script ne fonctionne pas car le dash ne comprend pas le mot clé 'function'
----- toto.sh ----------
#!/bin/dash
function titi {
echo "titi";
}
titi
------------------------
./toto.sh
./toto.sh: 3: function: not found
titi
./toto.sh: 5: Syntax error: "}" unexpected
2 - Yes
excepté deux petites bricoles
trace : commande inconnue -> remplacée par 'echo'
Les mkdir sont à remplacer par 'mkdir -p' et ça roule
- répondre
Ulhume, le 19 September, 2007 - 00:28ok je change cela, merci
Pour le coup du dash, je ne savais pas mais la fonction est facilement supprimable en l'encaplusant dans la bouche for. Bizarre tout de même, c'est pourtant utile.. les fonctions !
Poster un nouveau commentaire