chroot - run command or interactive shell with special root directory
以製作一個只有 bash 和 ls 兩條命令的隔離環境爲例。實踐環境 Aliyun ubuntu18.04
製作一個 chroot 隔離環境
創建一個 new root, 並切換到 jail 目錄
mkdir jail
cd jail
在 jail 下創建 bin 目錄
mkdir bin
複製 bin 和 bash 到 jail/bin
cp -v /bin/{bash,ls} ./bin
將 /bin/bash 和 /bin/ls 的依賴複製到 jail 對應的目錄
- ldd /bin/bash
root@aliyun:bin# ldd /bin/bash
linux-vdso.so.1 (0x00007ffd9b6b8000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007feb160d5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007feb15ed1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feb15ae0000)
/lib64/ld-linux-x86-64.so.2 (0x00007feb16619000)
- 在 jail 這個 new root 目錄下創建
lib/x86_64-linux-gnu
和lib64
目錄
mkdir -p lib/x86_64-linux-gnu
mkdir lib64
- 複製 /bin/bash 的依賴庫
cp /lib/x86_64-linux-gnu/libtinfo.so.5 .lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libdl.so.2 .lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 .lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 .lib64
- 複製
/bin/ls
的依賴庫
root@aliyun:bin# ldd /bin/ls
linux-vdso.so.1 (0x00007ffe6f32b000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ff1e7296000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff1e6ea5000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ff1e6c33000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff1e6a2f000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff1e76e0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff1e6810000)
cp /lib/x86_64-linux-gnu/libselinux.so.1 ./lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libpcre.so.3 ./lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libpthread.so.0 ./lib/x86_64-linux-gnu/
jail 這個 new root 構建完畢
執行 chroot jail /bin/bash
如上圖所示,chroot jail /bin/bash
進入了構建的隔離環境。執行 ls
可以查看文件。因爲只構建了 bash 和 ls 兩條命令,其餘的命令無法執行。
chroot 是啥?
通過上面的實踐 chroot 一個基本功能就是可以切換到一個隔離的環境,與宿主機進行隔離。不錯,這其實也就是 docker 的功能。只不過 docker 功能更強大。