Chroot Script
Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Скрипт для помещения чего-угодно в чрут, написаный на скорую руку.
Хорошо работал на 32-битной генту, на 64 бит убунте часть файлов приглось доложить руками (lib32 и lib64)
Давно не доробатывался, изначально писался под помещение апача в чрут но работает и с другими пакетами
#!/bin/bash
# За основу взят скрит Den aka Diesel <diesel@sherdart.net> отсюда http://slackware.tomsk.ru/docs/?p=chroot
# create chrooted environment for Apache 1.3 + PHP 5
# Я (sirmax) его творчески переработал. Оснаваная мысль - "зачем помнить о том какие файлы принвдлежат
# пакту, если можео спросить пакетный менеджер?"
# Найти все файлы apache2
# за исключением манов
# для помещения в croot()
# update
# Лень писать новый - допилю по-быстрому для убунты.
# оригинал 2006 года
EQUERY='/usr/bin/equery'
DPKG=`which dpkg-query`
#PKG_NAMES='net-www/apachedev-php/mod_php'
PKG_NAMES='bash quagga coreutils iproute'
EXCLUDE1='/usr/share'
EXCLUDE2='/usr/include'
CHROOT_PREFIX='/etc/quagga/bgpd1'
if ! [ -d $CHROOT_PREFIX ]
then
mkdir -p $CHROOT_PREFIX
fi
function check_libs(){
FILE_NAME=$1
LIB_NAMES=`ldd $FILE_NAME|awk '{print $3}'`
for LIB_NAME in $LIB_NAMES
do
echo $LIB_NAME
if [ -f $LIB_NAME ]
then
LIB_DIR_NAME=$(dirname $LIB_NAME)
mkdir -p $CHROOT_PREFIX'/'$LIB_DIR_NAME
if [ -f $CHROOT_PREFIX'/'$LIB_DIR_NAME ]
then
continue
fi
cp $LIB_NAME $CHROOT_PREFIX'/'$LIB_DIR_NAME
if [ -x $LIB_NAME ]
then
check_libs $LIB_NAME
fi
fi
done
}
for PKG_NAME in $PKG_NAMES
do
echo $PKG_NAME
# Совсем неоптимально - зато работает безотказно :)
# В первом проходе создадим все папки, за исключением заведомо ненужных (EXCLUDE)
# for FILE_NAME in `$EQUERY files $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 `
for FILE_NAME in `$DPKG -L $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 `
do
echo $FILE_NAME
# если файл - дириктория, то тогда создаем его в chroot jail
if [ -d $FILE_NAME ]
then
mkdir -p $CHROOT_PREFIX'/'$FILE_NAME
fi
done
# for FILE_NAME in `$EQUERY files $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 `
for FILE_NAME in `$DPKG -L $PKG_NAME | grep -v $EXCLUDE1 |grep -v $EXCLUDE2 `
do
if [ -f $FILE_NAME ]
then
cp $FILE_NAME $CHROOT_PREFIX'/'$FILE_NAME
# Если файл - исполняемый, то нужно забрать и все библиотеки
# которые он использует
if [ -x $FILE_NAME ]
then
check_libs $FILE_NAME
fi
fi
done
done
# Теперь библиоттеки
# создаем структуру каталогов:
mkdir -p $CHROOT_PREFIX
mkdir -p $CHROOT_PREFIX/dev
mkdir -p $CHROOT_PREFIX/etc
mkdir -p $CHROOT_PREFIX/lib
mkdir -p $CHROOT_PREFIX/tmp
mkdir -p $CHROOT_PREFIX/var/cache/proxy
mkdir -p $CHROOT_PREFIX/var/run
mkdir -p $CHROOT_PREFIX/var/run/mysql
mkdir -p $CHROOT_PREFIX/home
# выставляем 'sticky bit' на /tmp:
chmod 1777 $CHROOT_PREFIX/tmp
# создаем файл устройства /dev/null:
mknod $CHROOT_PREFIX/dev/null c 1 3
chmod 666 $CHROOT_PREFIX/dev/null
chown root:sys $CHROOT_PREFIX/dev/null
cp -a /dev/random $CHROOT_PREFIX/dev
cp -a /dev/urandom $CHROOT_PREFIX/dev
# копируем конфигурационные файлы:
#cat /etc/group|egrep "he:|nobody:|nogroup:" > $CHROOT_PREFIX/etc/group
#cat /etc/passwd|egrep "apache:|nobody:" > $CHROOT_PREFIX/etc/passwd
#cat /etc/shadow|egrep "apache:|nobody:" > $CHROOT_PREFIX/etc/shadow
chmod 640 $CHROOT_PREFIX/etc/shadow
cp /etc/host.conf $CHROOT_PREFIX/etc
cp /etc/hosts $CHROOT_PREFIX/etc
cp /etc/nsswitch.conf $CHROOT_PREFIX/etc
cp /etc/resolv.conf $CHROOT_PREFIX/etc
cp /etc/localtime $CHROOT_PREFIX/etc
# копируем данные и лог-файлы:
# (не уверен что это нужно)
#cp -R $APACHE_DATADIR $PREFIX`dirname $APACHE_DATADIR`
#cp -R /var/log/apache2 $PREFIX/var/log
# копируем бинарные файлы:
# копируем библиотеки:
cp -d /lib/i386-linux-gnu/libnss_compat* $CHROOT_PREFIX/lib/i386-linux-gnu/
cp -d /lib/libnss_dns* $CHROOT_PREFIX/lib
cp -d /lib/ld-* $CHROOT_PREFIX/lib
cp -d /lib/libnsl* $CHROOT_PREFIX/lib
cp -R -d /usr/lib/gconv $CHROOT_PREFIX/usr/lib
cp -d -R /usr/lib/locale/en_GB $CHROOT_PREFIX/usr/lib/locale
cp -d -R /usr/lib/locale/en_GB.utf8 $CHROOT_PREFIX/usr/lib/locale
cp -d -R /usr/lib/locale/ru_RU $CHROOT_PREFIX/usr/lib/locale
cp -d -R /usr/lib/locale/ru_RU.koi8r $CHROOT_PREFIX/usr/lib/locale
cp -d -R /usr/lib/locale/ru_RU.utf8 $CHROOT_PREFIX/usr/lib/locale
#
cp -d -R /etc/mime.types $CHROOT_PREFIX/etc
#cp -a /etc/apache2 $CHROOT_PREFIX/etc/apache2