====== 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