0. 개요
이 글은 아래 글과 이어집니다.
https://ksb-dev.tistory.com/373
아래 내용은 chroot를 사용합니다.
chroot란, 프로세스의 루트 디렉토리를 변경하여 해당 디렉토리 밖으로 벗어나지 못하게 합니다.
1. chroot해서 sh 실행하기
우선 이전에 만든 tmp 파일 밑에 myroot 폴더를 만듭니다.
cd /tmp
mkdir myroot
chroot의 명령어는 아래와 같습니다.
chroot [옵션] '변경할루트' [커맨드]
먼저 아래 명령어를 실행해 봅니다.
chroot myroot /bin/sh
위 에러와 같이 /bin/sh를 찾을 수 없다고 합니다.
그럴 수 밖에 없습니다.
mkdir 내부에는 아무것도 없기 때문입니다.
Ubuntu에서 sh 명령어가 저장되어 있는 위치는 which를 통해 찾을 수 있습니다.
which sh
또, sh 명령어가 사용하는 의존성 라이브러리는 ldd를 통해 찾을 수 있습니다.
ldd /bin/sh
myroot 내부에서 sh 명령어를 사용하기 위해서는 ubuntu와 같이 위치해야 합니다.
때문에, 파일을 복사합니다.
mkdir -p myroot/bin
cp /bin/sh myroot/bin/
mkdir -p myroot/{lib64,lib/x86_64-linux-gnu};
cp /lib/x86_64-linux-gnu/libc.so.6 myroot/lib/x86_64-linux-gnu
cp /lib64/ld-linux-x86-64.so.2 myroot/lib64
복사가 완료되면 아래와 같이 myroot 내부에 폴더 및 파일이 존재해야 합니다.
tree myroot
다시 실패했던 명령어를 실행하면 성공합니다.
chroot myroot /bin/sh
2. chroot에서 ls 실행하기
chroot로 실행된 /bin/sh에서 ls 명령어를 사용할 수 없다고 나옵니다.
그럴 수 밖에 없습니다.
sh 명령어를 사용하기 위해 sh 파일의 위치를 찾아서 복사했듯이, ls 명령어 역시 파일을 복사해야 사용할 수 있습니다.
exit으로 쉘을 나간 뒤 which로 ls 명령어의 위치를 찾습니다.
which ls
ls가 사용하는 의존성 라이브러리는 ldd로 찾습니다.
ldd /bin/ls
마찬가지로 파일을 복사합니다.
cp /bin/ls myroot/bin/
cp /lib/x86_64-linux-gnu/{libselinux.so.1,libc.so.6,libpcre2-8.so.0,libdl.so.2,libpthread.so.0} myroot/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 myroot/lib64/;
💡 [주의!!] 무작성 복붙이 안될 수 있습니다. 예제의 경우 libpcre.so.3이었지만, 저의 경우 libpcre2-8.so.0의 파일이 존재했습니다. 주의깊게 파일이름을 비교해보세요.
파일을 복사한 뒤 아래와 같이 myroot 내부에 파일이 있어야 합니다.
이제 ls 명령어를 사용할 수 있게 됩니다.
2. ps 실행하기
이제 명령어를 사용하기 위해 파일을 복사하는 것은 익숙해졌을 것입니다.
일일히 명령어를 치는 것은 귀찮으므로 예제에서 스크립트를 복사해서 사용할 수 있도록 파일을 제공했습니다.
wget https://raw.githubusercontent.com/sam0kim/container-internal/main/scripts/chroot_ps.sh
bash chroot_ps.sh
단, 저의 경우 스크립트의 파일 내용과 일치하지 않는 파일 이름이 있어서 약간의 수정을 했습니다.
#!/bin/bash
# copy ps
ldd /bin/ps;
cp /bin/ps /tmp/myroot/bin/;
cp /lib/x86_64-linux-gnu/{libprocps.so.8,libdl.so.2,libc.so.6,libsystemd.so.0,librt.so.1,liblzma.so.5,liblz4.so.1,libgcrypt.so.20,libpthread.so.0,libgpg-error.so.0} /tmp/myroot/lib/x86_64-linux-gnu/;
mkdir -p /tmp/myroot/usr/lib/x86_64-linux-gnu;
cp /usr/lib/x86_64-linux-gnu/liblz4.so.1 /tmp/myroot/usr/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/myroot/lib64/;
# copy mount
ldd /bin/mount;
cp /bin/mount /tmp/myroot/bin/;
cp /lib/x86_64-linux-gnu/{libmount.so.1,libc.so.6,libblkid.so.1,libselinux.so.1,librt.so.1,libuuid.so.1,libpcre2-8.so.0,libdl.so.2,libpthread.so.0} /tmp/myroot/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/myroot/lib64/;
# copy mkdir
ldd /bin/mkdir;
cp /bin/mkdir /tmp/myroot/bin/;
cp /lib/x86_64-linux-gnu/{libselinux.so.1,libc.so.6,libpcre2-8.so.0,libdl.so.2,libpthread.so.0} /tmp/myroot/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/myroot/lib64/;
이제 ps를 실행해 봤습니다.
하지만, 아래와 같이 오류가 발생했습니다.
오류에 나온 것 처럼 명령어를 치니 또 다른 오류를 만났습니다.
mkdir로 /proc 파일을 만드니 정상적으로 동작 했습니다.
ps 명령어를 위해서는 mkdir과 mount가 필요하기 때문에 예제에서도 ps, mount, mkdir을 한 번에 파일을 복사하는 스크립트를 제공하는 것이었습니다.
host에서 mount를 하면 마운트 된 것을 확인할 수 있습니다.
mount
umount를 통해 마운트를 해제해 실습 환경을 초기화합니다.
umount /tmp/myroot/proc
'삽질' 카테고리의 다른 글
도커 없이 컨테이너 만들기 - 5 (0) | 2024.08.23 |
---|---|
도커 없이 컨테이너 만들기 - 4 (0) | 2024.08.23 |
도커 없이 컨테이너 만들기 - 2 (0) | 2024.08.19 |
도커 없이 컨테이너 만들기 - 1 (0) | 2024.08.19 |
하둡 (0) | 2024.08.08 |