Ez a dokumentum egy előző változata!
Tartalomjegyzék
Chroot
A chroot utasítás segítségével az operációs rendszer egy könyvtárában alakítjuk ki a program futásához szükséges környezetet. Ebben a környezetben a futtatáshoz szükséges összes állományt a forrás fájlrendszer struktúráját követve adjuk meg.
Programok futtatása
Egyszerű shell futtatása
Létrehozzuk a chroot könyvtárat, majd bemásoljuk a 'bash' programot. majd 'chroot' paramétereként.
# mkdir -p /opt/chroot/01-shell-minimal # type bash bash: /usr/sbin/bash # mkdir -p /opt/chroot/01-shell-minimal/usr/bin cp -a /usr/bin/bash /opt/chroot/01-shell-minimal/usr/bin
Futtatjuk a programot chroot nélkül. Ellenőrizzük a szülö shell PID-jét, a futtatot program PID-jét, majd kilépés után újra a szülőt.
# echo $$ 4595 # /opt/chroot/01-shell-minimal/usr/bin/bash # echo $$ 5121 # exit exit # echo $$ 4595
Futtassuk a programot 'chroot' segítségével. Hibát kapunk, mert a programhoz tartozó megosztott függvényeket tartalmazó állományok hiányoznak.
# chroot /opt/chroot/01-shell-minimal /usr/bin/bash chroot: failed to run command ‘/usr/bin/bash’: No such file or directory
Ellenőrizzük mire van szükség.
# ldd /usr/bin/bash linux-vdso.so.1 (0x00007f5879c64000) libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f5879aa9000) libc.so.6 => /lib64/libc.so.6 (0x00007f58798b6000) /lib64/ld-linux-x86-64.so.2 (0x00007f5879c66000)
A hiányzó állományok listájában három típust különböztetünk meg:
- a programhoz linkelt állomány 'linux-vdso.so.1 (0x00007f5879c64000)' nincs vele teendő.
- dinamikusan linkelt állomány amit a program hivatkozás segítségével ér el 'libtinfo.so.6 ⇒ /lib64/libtinfo.so.6 (0x00007f5879aa9000)'.
- statikusan megadott állomány, amelynek helye nem módosítható '/lib64/ld-linux-x86-64.so.2 (0x00007f5879c66000)'.
Hozzuk létre a könyvtárstruktúrát és másoljuk be az állományokat. A példában a szimbolikus linkeket is létrehozzuk.
# mkdir /opt/chroot/01-shell-minimal/usr/lib64
# ln -s usr/bin /opt/chroot/01-shell-minimal/bin
# ln -s usr/lib64 /opt/chroot/01-shell-minimal/lib64
# cp -a /lib64/libtinfo.so.6* /lib64/libc.so.6* /lib64/ld-linux-x86-64.so.2 /opt/chroot/01-shell-minimal/usr/lib64/
# tree /opt/chroot/01-shell-minimal/
/opt/chroot/01-shell-minimal/
├── 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
6 directories, 5 files
Futtassuk ismét a 'bash' programot chroot környezetben.
# chroot /opt/chroot/01-shell-minimal /usr/bin/bash bash-5.3# exit exit
Bővített környezet segédprogramokkal
A chroot-ban futtatott 'bash' shell csak a beépített utasításokat képes futtatni (pwd, cd). Minden külső program (ls, cat) hiányzik. A programok futtatásához és ellenőrzéséhez szükséges minimális programokat be kell másolni a strukrtúrába.
# chroot /opt/chroot/01-shell-minimal /usr/bin/bash bash-5.3# ls bash: ls: command not found bash-5.3# exit exit
Készítsünk másolatot a könyvtárról és bővítsük az alapvető utasításokkal.
# cp -a /opt/chroot/01-shell-minimal /opt/chroot/02-shell-extended # cp -a /usr/bin/cat /usr/bin/id /usr/bin/ls /opt/chroot/02-shell-extended/usr/bin # chroot /opt/chroot/02-shell-extended /usr/bin/bash bash-5.3# ls ls: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory
Hiányzik egy újabb megosztott könyvtári függvényeket tartalmazó állomán. Át kell nézni a bemásolt programokat és be kell másolni a hiányzó állományokat.
# ldd /usr/bin/cat linux-vdso.so.1 (0x00007f6c600ce000) libc.so.6 => /lib64/libc.so.6 (0x00007f6c5feb9000) /lib64/ld-linux-x86-64.so.2 (0x00007f6c600d0000)
A 'cat parancs futtatásához szükséges állományok már rendelkezésre állnak.
# ldd /usr/bin/id linux-vdso.so.1 (0x00007fa0165b3000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa01655f000) libc.so.6 => /lib64/libc.so.6 (0x00007fa01636c000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fa0162bf000) /lib64/ld-linux-x86-64.so.2 (0x00007fa0165b5000) # ldd /usr/bin/ls linux-vdso.so.1 (0x00007f53cf8f6000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f53cf888000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f53cf87c000) libc.so.6 => /lib64/libc.so.6 (0x00007f53cf689000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f53cf5dc000) /lib64/ld-linux-x86-64.so.2 (0x00007f53cf8f8000)
A hiányzó állományok másolását el kell végezni.
# cp -a /lib64/libselinux.so.1* /lib64/libcap.so.2* /lib64/libpcre2-8.so.0* /opt/chroot/02-shell-extended/usr/lib64
# tree /opt/chroot/02-shell-extended
/opt/chroot/02-shell-extended
├── bin -> usr/bin
├── lib64 -> usr/lib64
└── usr
├── bin
│ ├── bash
│ ├── cat
│ ├── id
│ └── 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
6 directories, 13 files
Ellenőrizzük a környezetet
# chroot /opt/chroot/02-shell-extended /usr/bin/bash bash-5.3# ls bin lib64 usr bash-5.3# exit exit
Végezzünk el néhány szépészeti beavatkozást. Létrehozzuk a '/etc' és a '/root' könyvtárakat és bemásoljuk az inicializáló állományokat.
# mkdir -p /opt/chroot/02-shell-extended/etc # mkdir -p /opt/chroot/02-shell-extended/root # cp -a /etc/skel/.bash* /opt/chroot/02-shell-extended/root/ # cp -a /etc/bashrc /opt/chroot/02-shell-extended/etc/
Futtassuk a 'bash' utasítást a chroot környezetben. A prompt megváltozik.
# chroot /opt/chroot/02-shell-extended /usr/bin/bash [I have no name!@gepnev /]# id uid=0 gid=0 groups=0 [I have no name!@gepnev /]# exit exit
Az 'I have no name!' üzenet azért jelenik meg, mert a rendszer nem talál bejegyzést a futtató felhasználóhoz és a csoporthoz. Ez a bejegyzés a '/etc/passwd' és '/etc/group' fájlokban találhatók.
# echo 'root::0:0:Super User:/root:/bin/bash' > /opt/chroot/02-shell-extended/etc/passwd # echo 'root::0:' > /opt/chroot/02-shell-extended/etc/group # echo $$ 4595 # chroot /opt/chroot/02-shell-extended /usr/bin/bash [root@gepnev /]# echo $$ 9737 [root@gepnev /]# exit exit # echo $$ 4595
NGINX szerver futtatása chroot környezetben
A legegszerűbb megoldásként az operációs rendszer csomagjait használjuk az NGINX szerver környezet kialakításához.
Töltsük le a szükséges csomagokat.
# dnf download nginx-core nginx-filesystem Last metadata expiration check: 3:03:15 ago on Tue 14 Apr 2026 06:45:25 AM CEST. (1/2): nginx-filesystem-1.20.1-24.0.1.el9_7.2.n 53 kB/s | 10 kB 00:00 (2/2): nginx-core-1.20.1-24.0.1.el9_7.2.x86_64. 1.9 MB/s | 589 kB 00:00
Átmeneti könyvtárba csomagoljuk ki az állományokat
# rm -rf /tmp/nginx && mkdir /tmp/nginx && cd /tmp/nginx && rpm2cpio /root/nginx-core*.rpm | cpio -idmu && rpm2cpio /root/nginx-filesystem*.rpm | cpio -idmu 3287 blokk 3 blokk
Hozzuk létre az új NGINX szervert futtató chroot környezetet a kibővitett shell futtató környezetből.
# cp -a /opt/chroot/02-shell-extended/ /opt/chroot/03-nginx-minimal # mkdir /opt/chroot/03-nginx-minimal/usr/sbin # ln -s usr/sbin /opt/chroot/03-nginx-minimal/sbin
Másoljuk be a szükséges bináris állományt és a megosztott függvényeket tartalmazó állományokat.
# cp -a /tmp/nginx/usr/sbin/nginx /opt/chroot/03-nginx-minimal/usr/sbin/ # ldd /tmp/nginx/usr/sbin/nginx linux-vdso.so.1 (0x00007f5ffd906000) libcrypt.so.2 => /lib64/libcrypt.so.2 (0x00007f5ffd761000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f5ffd6e9000) libssl.so.3 => /lib64/libssl.so.3 (0x00007f5ffd5f0000) libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007f5ffd000000) libz.so.1 => /lib64/libz.so.1 (0x00007f5ffd5d4000) libc.so.6 => /lib64/libc.so.6 (0x00007f5ffcc00000) /lib64/ld-linux-x86-64.so.2 (0x00007f5ffd908000) # cp -a /lib64/libcrypt.so.2* /lib64/libpcre.so.1* /lib64/libssl.so.3* /lib64/libcrypto.so.3* /lib64/libz.so.1* /opt/chroot/03-nginx-minimal/usr/lib64
Teszteljük a program indítását és a megjelenő hibáknál végezzük el a javítási műveleteket.
# chroot /opt/chroot/03-nginx-minimal/ /usr/bin/bash [root@gepnev]# /usr/sbin/nginx nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (2: No such file or directory) 2026/04/14 07:57:03 [emerg] 488951#488951: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory) [root@gepnev]# exit exit
Hozzuk létre a könyvtárakat és másoljuk be a megfelelő állományokat és próbáljuk újra.
# mkdir /opt/chroot/03-nginx-minimal/etc/nginx
# cp -a /tmp/nginx/etc/nginx/nginx.conf /tmp/nginx/etc/nginx/mime.types /opt/chroot/03-nginx-minimal/etc/nginx/
# mkdir -p /opt/chroot/03-nginx-minimal/var/log/nginx
# /usr/sbin/nginx
nginx: [emerg] getpwnam("nginx") failed in /etc/nginx/nginx.conf:5
A nginx szerver futtatásához szükséges bejegyzés hiányzik a /etc/passwd és a /etc/group fájlokban.
# echo 'nginx::101:101::/var/lib/nginx:/sbin/nologin' >> /opt/chroot/03-nginx-minimal/etc/passwd
# echo 'nginx::101:' >> /opt/chroot/03-nginx-minimal/etc/group
# mkdir -p /opt/chroot/03-nginx-minimal/var/lib/nginx/tmp
# chroot /opt/chroot/03-nginx-minimal/ /usr/bin/bash
# /usr/sbin/nginx
nginx: [emerg] open() "/run/nginx.pid" failed (2: No such file or directory)
nginx: [emerg] open("/dev/null") failed (2: No such file or directory)
# exit
exit
Hozzuk létre a hiányzó könyvtárakat és másoljuk be, vagy csatlakoztassuk a speciális '/dev/null' állományt.
# mkdir /opt/chroot/03-nginx-minimal/dev # mkdir /opt/chroot/03-nginx-minimal/run # cp -a /dev/null /opt/chroot/03-nginx-minimal/dev/ # chroot /opt/chroot/03-nginx-minimal/ /usr/bin/bash # /usr/sbin/nginx # exit exit
A program fut, ami ellenőrizhető a futtató környezetből.
# ps -ef | grep -v grep | grep nginx root 493299 1 0 10:14 ? 00:00:00 nginx: master process /usr/sbin/nginx 101 493300 493299 0 10:14 ? 00:00:00 nginx: worker process 101 493301 493299 0 10:14 ? 00:00:00 nginx: worker process
Állítsuk le a megfelelő jelzés segítségével.
# kill -2 493299
Készítsük el a teljes futtatói környezetet. Létrehozzuk a '/proc' és a '/sys' könyvtárakat. Egyszerűsítjük az nginx szerver konfigurációját '/etc/nginx/nginx.conf'. Létrehozzuk az index.html állományt egyszerű tartalommal.
# cp -a /opt/chroot/03-nginx-minimal /opt/chroot/04-nginx-extended/
# cat > /opt/chroot/04-nginx-extended/etc/nginx/nginx.conf <<'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
}
}
EOF
# mkdir -m 0555 /opt/chroot/04-nginx-extended/proc
# mkdir -m 0555 /opt/chroot/04-nginx-extended/sys
# mkdir -p /opt/chroot/04-nginx-extended/usr/share/nginx/html
# echo 'Üdvözöl az NGINX szerver' > /opt/chroot/04-nginx-extended/usr/share/nginx/html/index.html
# chroot /opt/chroot/04-nginx-extended/ /usr/bin/bash
# /usr/sbin/nginx
# exit
Ellenőrizzük a futást.
# curl http://127.0.0.1 Üdvözöl az NGINX szerver
Állítsuk le a szervert és takarítsuk ki a felesleges állományokat.
# ps -ef | grep nginx root 498367 1 0 10:34 ? 00:00:00 nginx: master process /usr/sbin/nginx 101 498368 498367 0 10:34 ? 00:00:00 nginx: worker process 101 498369 498367 0 10:34 ? 00:00:00 nginx: worker process root 500487 496201 0 10:42 pts/0 00:00:00 grep --color=auto nginx # kill -2 498367 # ps -ef | grep nginx root 500579 496201 0 10:43 pts/0 00:00:00 grep --color=auto nginx # cd /opt/chroot/04-nginx-extended/ # rm -rf root/.bash_history run/nginx.pid var/lib/nginx/tmp/* var/log/nginx/*
Hozzuk létre a végleges könyvtárat és tegyük hozzá a konténer működéshez szükséges állományokat.
# cp -a /opt/chroot/04-nginx-extended /opt/chroot/05-nginx-final # ln -s /dev/stdout /opt/chroot/05-nginx-final/var/log/nginx/access.log # ln -s /dev/stderr /opt/chroot/05-nginx-final/var/log/nginx/error.log
Konténer image létrehozása
Létrehozzuk a konténer készítéséhez szükséges könyvtárat. A tar program segítségével a végleges fájlrendszer struktúrát összecsomagoljuk.
# mkdir /opt/nginx-kontener # cd /opt/chroot/05-nginx-final && tar -czf /opt/nginx-kontener/rootfs.tar.gz . # ls /opt/nginx-kontener/ rootfs.tar.gz # cat > /opt/nginx-kontener/Dockerfile <<'EOF' FROM scratch ADD rootfs.tar.gz / CMD ["/usr/sbin/nginx", "-g", "daemon off;"] EOF
Futtassuk a build folyamatot.
# cd /opt/nginx-kontener/ # podman build -t custom-nginx:1.20 . STEP 1/3: FROM scratch STEP 2/3: ADD rootfs.tar.gz / --> 24bfe43d6b1e STEP 3/3: CMD ["/usr/sbin/nginx", "-g", "daemon off;"] COMMIT custom-nginx:1.20 --> 39f8c1b752ea Successfully tagged localhost/custom-nginx:1.20 39f8c1b752ea12cb5fa8331a9a1ea87b27941e0b45b21696eeb111582f123d51 # podman image ls REPOSITORY TAG IMAGE ID CREATED SIZE localhost/custom-nginx 1.20 39f8c1b752ea 24 seconds ago 15.5 MB
Indítsuk és teszteljük a konténert.
# podman run -d --rm --name nginx-test -p 80:80 custom-nginx:1.20 28d56790d6c596cdd1a192fc7253c909f624d3aed9d7f96ac917d41ea4cedd7c # podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28d56790d6c5 localhost/custom-nginx:1.20 /usr/sbin/nginx -... About a minute ago Up About a minute 0.0.0.0:80->80/tcp nginx-test # curl http://127.0.0.1 Üdvözöl az NGINX szerver
