본문 바로가기

삽질

도커 없이 컨테이너 만들기 - 3

0. 개요

이 글은 아래 글과 이어집니다.

https://ksb-dev.tistory.com/373

 

도커 없이 컨테이너 만들기 - 2

0. 개요이 글은 아래 글과 이어집니다.https://ksb-dev.tistory.com/372 vm에 접속한 상태여야 합니다.vagrant ssh그리고 관리자 상태로 변경 후 tmp 파일을 만듭니다.# 관리자로 변경sudo -Es# tmp 파일 생성후 이

ksb-dev.tistory.com

 

 

아래 내용은 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