====== 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ány. Á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ővített 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
# tree /opt/chroot/05-nginx-final/
/opt/chroot/05-nginx-final/
├── bin -> usr/bin
├── dev
│ └── null
├── etc
│ ├── bashrc
│ ├── group
│ ├── nginx
│ │ ├── mime.types
│ │ └── nginx.conf
│ └── passwd
├── lib64 -> usr/lib64
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── sys
├── usr
│ ├── bin
│ │ ├── bash
│ │ ├── cat
│ │ ├── id
│ │ └── ls
│ ├── lib64
│ │ ├── ld-linux-x86-64.so.2
│ │ ├── libcap.so.2 -> libcap.so.2.48
│ │ ├── libcap.so.2.48
│ │ ├── libcrypto.so.3 -> libcrypto.so.3.5.1
│ │ ├── libcrypto.so.3.5.1
│ │ ├── libcrypt.so.2 -> libcrypt.so.2.0.0
│ │ ├── libcrypt.so.2.0.0
│ │ ├── libc.so.6
│ │ ├── libpcre2-8.so.0 -> libpcre2-8.so.0.11.0
│ │ ├── libpcre2-8.so.0.11.0
│ │ ├── libpcre.so.1 -> libpcre.so.1.2.12
│ │ ├── libpcre.so.1.2.12
│ │ ├── libselinux.so.1
│ │ ├── libssl.so.3 -> libssl.so.3.5.1
│ │ ├── libssl.so.3.5.1
│ │ ├── libtinfo.so.6 -> libtinfo.so.6.2
│ │ ├── libtinfo.so.6.2
│ │ ├── libz.so.1 -> libz.so.1.2.11
│ │ └── libz.so.1.2.11
│ ├── sbin
│ │ └── nginx
│ └── share
│ └── nginx
│ └── html
│ └── index.html
└── var
├── lib
│ └── nginx
│ └── tmp
└── log
└── nginx
├── access.log -> /dev/stdout
└── error.log -> /dev/stderr
23 directories, 33 files
===== 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