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.

Historique (tout afficher)
  • 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

Commentaires

Dab, le 18 September, 2007 - 13:11

Sympa 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.

Ulhume, le 18 September, 2007 - 14:43

Pour 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.

Dab, le 18 September, 2007 - 16:06

1 - 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 Smiling excepté deux petites bricoles
trace : commande inconnue -> remplacée par 'echo'
Les mkdir sont à remplacer par 'mkdir -p' et ça roule Smiling

Ulhume, le 19 September, 2007 - 00:28

ok je change cela, merci Smiling

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

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...