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