Linux chroot környezet kialakítása
A chroot környezet a minimális konténer futtató környezet bemutatására szolgál. Először a bash shell telepítése és testreszabása történik meg, majd a futtatáshoz szükséges környezetek. Végül a szükséges fájlrendszerek csatlakoztatása.
Létre kell hozni egy könyvtárat. Ez tartalmazza a program futásához szükséges könyvtárakat és fájlokat.
# mkdir -p /opt/program
A szükséges könyvtárak és szimbolikus hivatkozások létrehozása
# mkdir -p /opt/program/usr/bin # ln -s usr/bin /opt/program/bin
A futtatandó shell program másolása a forrásrendszer könyvtárstruktúrájának megfelelően
# cp -a /usr/bin/bash /opt/program/usr/bin/bash
Chroot működésének tesztelése
# chroot /opt/program /usr/bin/bash chroot: failed to run command ‘/usr/bin/bash’: No such file or directory
A program működéséhez szükséges megosztott objektumfájlok listázása.
# ldd /usr/bin/bash linux-vdso.so.1 (0x00007f65ff555000) libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f65ff39b000) libc.so.6 => /lib64/libc.so.6 (0x00007f65ff1a7000) /lib64/ld-linux-x86-64.so.2 (0x00007f65ff557000)
A szükséges könyvtárstruktúra létrehozása.
# mkdir /opt/program/usr/lib64 # ln -s usr/lib64 /opt/program/lib64
Állományok másolása. Fontos megjegyezni, hogy a forrás fájlok időnként szimbolikus hivatkozások, így a hivatkozott állományokat is másolni kell.
# cp -a /usr/lib64/libtinfo.so.6* /opt/program/usr/lib64 # cp -a /usr/lib64/libc.so.6* /opt/program/usr/lib64 # cp -a /usr/lib64/ld-linux-x86-64.so.2* /opt/program/usr/lib64
A teljes struktúra a következő
# tree /opt/program
/opt/program
├── bin -> usr/bin
├── lib64 -> usr/lib64
└── usr
├── bin
│ └── bash
└── lib64
├── ld-linux-x86-64.so.2
├── libc.so.6
├── libtinfo.so.6 -> libtinfo.so.6.5
└── libtinfo.so.6.5
Teszteljük a chroot működését
# chroot /opt/program /usr/bin/bash bash-5.3# exit exit
Próbáljuk listázni a chroot környezet tartalmát.
# chroot /opt/program /usr/bin/bash # ls / bash: ls: command not found bash-5.3# exit exit
Mivel nincs ls parancs, telepítsük a chroot könyvtárába. Itt is figyeljünk a megosztott objektumfájlokra.
# ldd /usr/bin/ls linux-vdso.so.1 (0x00007fae7efca000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fae7ef5d000) libcap.so.2 => /lib64/libcap.so.2 (0x00007fae7ef51000) libc.so.6 => /lib64/libc.so.6 (0x00007fae7ed5d000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fae7ecb0000) /lib64/ld-linux-x86-64.so.2 (0x00007fae7efcc000)
Másolási műveletek.
# cp -a /usr/bin/ls /opt/program/usr/bin/ls # cp -a /usr/lib64/libselinux.so.1* /opt/program/usr/lib64 # cp -a /usr/lib64/libcap.so.2* /opt/program/usr/lib64 # cp -a /usr/lib64/libpcre2-8.so.0* /opt/program/usr/lib64
Ellenőrzés.
# tree /opt/program
# tree /opt/program
/opt/program
├── bin -> usr/bin
├── lib64 -> usr/lib64
└── usr
├── bin
│ ├── bash
│ └── ls
└── lib64
├── ld-linux-x86-64.so.2
├── libcap.so.2 -> libcap.so.2.76
├── libcap.so.2.76
├── libc.so.6
├── libpcre2-8.so.0 -> libpcre2-8.so.0.15.0
├── libpcre2-8.so.0.15.0
├── libselinux.so.1
├── libtinfo.so.6 -> libtinfo.so.6.5
└── libtinfo.so.6.5
Futtassuk a bash programot a chroot környezetben és listázzuk a fájlokat.
# chroot /opt/program /usr/bin/bash bash-5.3# ls -l / total 4 lrwxrwxrwx. 1 0 0 7 Dec 1 07:13 bin -> usr/bin lrwxrwxrwx. 1 0 0 9 Dec 1 07:20 lib64 -> usr/lib64 drwxr-xr-x. 4 0 0 4096 Dec 1 07:20 usr
Az ls parancs közvetlenül hívható, nem szükséges a shell. Így működnek a konténerek is. Ott az entrypoint lesz a program ami a konténer indításakor automatikusan lefut.
# chroot /opt/program /usr/bin/ls -l / total 4 lrwxrwxrwx. 1 0 0 7 Dec 1 07:13 bin -> usr/bin lrwxrwxrwx. 1 0 0 9 Dec 1 07:20 lib64 -> usr/lib64 drwxr-xr-x. 4 0 0 4096 Dec 1 07:20 usr
Ha elhagyjuk a chroot második paraméterében a futtatandó programot, akkor automatikusan a /bin/bash indul.
# chroot /opt/program /bin/bash bash-5.3# exit exit # chroot /opt/program bash-5.3# exit exit
Programok egy részének futtatásához szükség van a /proc, a /sys és néha a /dev könyvtárakra. Ezek a könyvtárak csatlakoztathatók többféle módszerrel. A könyvtárakat előre létre kell hozni a chroot környezetben.
# mkdir /opt/program/dev # mkdir /opt/program/proc # mkdir /opt/program/sys
A /proc fájlrendszer kezelése
A /proc fájlrendszer csatlakoztatása (1. módszer)
# mount -t proc proc /opt/program/proc # chroot /opt/program /usr/bin/ls /proc 1 18846 21 2439 37 5 7369 9817 kpagecgroup 10 18950 2119 2444 3716 50 744 9818 kpagecount ...
A /proc fájlrendszer leválasztása.
# umount /opt/program/proc
A /proc fájlrendszer csatlakoztatása (2. módszer)
# mount --bind /proc /opt/program/proc # chroot /opt/program /usr/bin/ls /proc 1 18846 21 2439 37 5 7369 9817 kpagecgroup 10 18950 2119 2444 3716 50 744 9818 kpagecount ...
A /proc fájlrendszer leválasztása.
# umount /opt/program/proc
A /sys fájlrendszer kezelése
A /sys fájlrendszer csatlakoztatása (1. módszer)
# mount -t sysfs none /opt/program/sys # chroot /opt/program /usr/bin/ls /sys block class devices fs kernel power bus dev firmware hypervisor module
A /sys fájlrendszer leválasztása.
# umount /opt/program/sys
A /sys fájlrendszer csatlakoztatása (2. módszer)
# mount --bind /sys /opt/program/sys # chroot /opt/program /usr/bin/ls /sys block class devices fs kernel power bus dev firmware hypervisor module
A /sys fájlrendszer leválasztása.
# umount /opt/program/proc
A /sys fájlrendszer kezelése
A /dev fájlrendszer csatlakoztatása
# mount --bind /dev /opt/program/dev # chroot /opt/program /usr/bin/ls /dev autofs log sgx_vepc tty34 ttyS10 userfaultfd block loop-control shm tty35 ttyS11 v4l ...
A /dev fájlrendszer leválasztása.
# umount /opt/program/dev
Az elkészült chroot környezet kiegészíthető további állományokkal, programokkal.
# tree /opt/program/
/opt/program/
├── bin -> usr/bin
├── dev
├── lib64 -> usr/lib64
├── proc
├── sys
└── usr
├── bin
│ ├── bash
│ └── ls
└── lib64
├── ld-linux-x86-64.so.2
├── libcap.so.2 -> libcap.so.2.76
├── libcap.so.2.76
├── libc.so.6
├── libpcre2-8.so.0 -> libpcre2-8.so.0.15.0
├── libpcre2-8.so.0.15.0
├── libselinux.so.1
├── libtinfo.so.6 -> libtinfo.so.6.5
└── libtinfo.so.6.5
