. .

gentoo Linux: mySQL-Datenbankserver für eine chroot-Umgebung einrichten


Ich beschreibe hier, wie ein mySQL-Datenbankserver in eine chroot-Umgebung auf gentoo Linux installiert werden kann.
Ziel ist es, dass es in dieser chroot-Umgebung keine Shell oder sonst irgendwelche unnötigen Programme gibt, die zum Laufen des Datenbankservers nicht notwendig sind.
Als Basisverzeichnis der neuen Umgebung wird /chroot angenommen.


Als erstes muss mySQL natürlich installiert werden. Die USE-Flags sollten bereits so gesetzt sein, wie man sie braucht.

emerge -q dev-db/mysql
emerge --config dev-db/mysql



Nach der Installation und Konfiguration des mySQL-Servers sind noch kleine Vorbereitungen zu treffen.
Die Skripte mkjailenv und addjailsw werden benötigt, die im Paket app-misc/jail zu finden sind. Zudem habe ich noch ein python-Skript geschrieben, mit dem man gentoo-Paketinstallationen in ein gechrootetes Verzeichnis übertragen kann. Python 3 habe ich allerdings nicht getestet, deswegen stelle ich auf Python 2 um.

emerge -q jail

eselect python list 
    Available Python interpreters:
      [1]   python2.7
      [2]   python3.3 *

eselect python set 1



Jetzt kann auch schon mit der Übertragung ins chroot-Verzeichnis begonnen werden.

mkjailenv /chroot/mysql

mkdir /chroot/mysql/proc
echo "none /chroot/mysql/proc proc defaults 0 0" >> /etc/fstab
mount /chroot/mysql/proc

python /root/sbin/copy2chroot.py copy -p sys-libs/glibc -o -d /chroot/mysql
python /root/sbin/copy2chroot.py copy -p dev-db/mysql -o -d /chroot/mysql

addjailsw /chroot/mysql -P /usr/sbin/mysqld --help

Als erstes werden mit mkjailenv Basisdateien installiert – so zum Beispiel /etc/passwd unterhalb von /chroot/mysql.
Das proc-Dateisystem wird von mySQL benötigt, um aktuelle Limits zu finden.
Mit dem Skript /root/sbin/copy2chroot.py werden an Hand der portage-Informationen die installierten Dateien des angegebenen installierten Pakets nach /chroot/mysql übertragen.
Und mit addjailsw wird das angegebene Programm /usr/sbin/mysqld ausgeführt. Per strace erkennt das Skript, welche Dateien und Bibliotheken verwendet werden und kopiert diese ebenfalls nach /chroot/mysql.


Als nächstes werden noch bestimmte Informationen benötigt, wie User, Gruppen und DNS-Einträge.

/bin/grep '^mysql:' /etc/passwd >> /chroot/mysql/etc/passwd
/bin/grep '^mysql:' /etc/group >> /chroot/mysql/etc/group

echo '127.0.0.1 localhost' > /chroot/mysql/etc/hosts



Mit dem nächsten Befehl werden die Default-Datenbanken (also auch die User-DB) in die chroot-Umgebung kopiert.
Gentoo stellt gerade das Verzeichnis /var/run auf /run um (/var/run ist jetzt ein Link auf /run). Will man doch nicht /var/run haben, müssen später die my.cnf und das init-Skript entsprechend konfiguriert werden.

cp -a /var/lib/mysql/* /chroot/mysql/var/lib/mysql/.

rm -f /chroot/mysql/var/run
mkdir -p /chroot/mysql/var/run/mysqld
chown mysql:mysql /chroot/mysql/var/run/mysqld



Wichtig ist nun, dass die Library libgcc_s.so.1 übertragen wird – und zwar diese, mit der auch mySQL kompiliert wurde.

cp -a /usr/lib64/gcc/x86_64-pc-linux-gnu/`gcc-config -l | /bin/grep '*' | awk -F'-' '{print $NF}' | cut -d' ' -f1`/libgcc_s.so.1 /chroot/ftp/usr/lib64/



Als nächstes kann wie bei einer normalen Installation die my.cnf bearbeitet werden (die für die gechrootete Umgebung).

rm -f /chroot/mysql/etc/mysql/my.cnf

vim /chroot/mysql/etc/mysql/my.cnf
*******************************************************************************
[client]
port=3306
socket=/var/run/mysqld/mysqld.sock

[mysql]
character-sets-dir=/usr/share/mysql/charsets
character-set-server=latin1
prompt="\u - \d >\_"
socket=/var/run/mysqld/mysqld.sock

[mysqladmin]
character-sets-dir=/usr/share/mysql/charsets
character-set-server=latin1

[mysqlcheck]
character-sets-dir=/usr/share/mysql/charsets
character-set-server=latin1

[mysqldump]
character-sets-dir=/usr/share/mysql/charsets
character-set-server=latin1

[mysqlimport]
character-sets-dir=/usr/share/mysql/charsets
character-set-server=latin1

[mysqlshow]
character-sets-dir=/usr/share/mysql/charsets
character-set-server=latin1

[myisamchk]
character-sets-dir=/usr/share/mysql/charsets

[myisampack]
character-sets-dir=/usr/share/mysql/charsets

[mysqld_safe]
err-log=/var/log/mysql/mysql.err

[mysqld]
character-set-server=latin1
user=mysql
port=3306
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysql/mysqld.err
basedir=/usr
datadir=/var/lib/mysql
skip-external-locking
key_buffer=16M
max_allowed_packet=1M
table_cache=64
sort_buffer_size=512K
net_buffer_length=8K
read_buffer_size=256K
read_rnd_buffer_size=512K
myisam_sort_buffer_size=8M
local-infile=0
skip-networking
bind-address=127.0.0.1
server-id=1
tmpdir=/tmp/
innodb_buffer_pool_size=16M
innodb_additional_mem_pool_size=2M
innodb_data_file_path=ibdata1:10M:autoextend:max:128M
innodb_log_file_size=5M
innodb_log_buffer_size=8M
innodb_log_files_in_group=2
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
innodb_file_per_table

[mysqldump]
quick
max_allowed_packet=16M

[isamchk]
key_buffer=20M
sort_buffer_size=20M
read_buffer=2M
write_buffer=2M

[myisamchk]
key_buffer=20M
sort_buffer_size=20M
read_buffer=2M
write_buffer=2M

[mysqlhotcopy]
interactive-timeout
*******************************************************************************



Die lokale my.cnf braucht nicht mehr zu enthalten als die Informationen zum Socket (sofern man nicht einen zweiten DB-Server laufen lassen will):

vim /etc/mysql/my.cnf
*******************************************************************************
[client]
port=3306
socket=/chroot/mysql/var/run/mysqld/mysqld.sock

[mysql]
character-sets-dir=/chroot/mysql/usr/share/mysql/charsets
prompt="\u - \d >\_"
socket=/chroot/mysql/var/run/mysqld/mysqld.sock
*******************************************************************************



Was jetzt noch fehlt, ist ein init-Script. Das könnte so aussehen:

vim /etc/init.d/chrooted_mysql
*******************************************************************************
#!/sbin/runscript
# Distributed under the terms of the GNU General Public License v2

depend() {
    use dns net localmount netmount nfsmount
}
start() {
    ebegin "Starting ${SVCNAME}"

        chroot $CHROOT /usr/sbin/mysqld --user=mysql > /dev/null &
        sleep 5
        kill -0 $( cat $CHROOT/var/run/mysqld/mysqld.pid ) >/dev/null
        eend $?
}
stop() {
    ebegin "Stopping ${SVCNAME}"

        CHROOT="/chroot/mysql"

        kill -TERM $( cat $CHROOT/var/run/mysqld/mysqld.pid ) >/dev/null
        sleep 5

        if [ -e $CHROOT/var/run/mysqld/mysqld.sock ] ; then
                rm $CHROOT/var/run/mysqld/mysqld.sock
        fi

        if [ -e $CHROOT/var/run/mysqld/mysqld.pid ] ; then
            rm $CHROOT/var/run/mysqld/mysqld.pid
        fi
        eend $?
}
*******************************************************************************



In dem Init-Skript wird die Variable $CHROOT verwendet – diese wird in der Datei /etc/conf.d/chrooted_mysql festgelegt. Sollte man mal den Rechner neu booten müssen, ist es vielleicht nicht schlecht, wenn mySQL von selbst startet.

echo 'CHROOT="/chroot/mysql"' > /etc/conf.d/chrooted_mysql

chmod +x /etc/init.d/chrooted_mysql
rc-update add chrooted_mysql default
rc-update del mysql
/etc/init.d/chrooted_mysql start



Nach Ausführen des Befehls /etc/init.d/chrooted_mysql start sollte man jetzt mit den über emerge –config dev-db/mysql erstellten Zugangsdaten eine Verbindung zum Server aufbauen lassen können.


Je nachdem, was man vorhat, kann nun die nicht gechrootete Datenbankserverinstallation mittels emerge –unmerge dev-db/mysql wieder entfernt werden.
An für sich können auch nicht verwendete mySQL-Kommandos aus der gechrooteten Umgebung gelöscht werden, z.B. /chroot/mysql/usr/bin/mysql.


Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>