chroot를 설치하는 방법입니다.
chroot의 의미는 wikipedia에 아래와 같이 설명되어 있습니다.
유닉스 운영 체제에서 chroot는 현재 실행 중인 프로세스와 차일드 프로세스 그룹에서 루트 디렉터리를 변경하는 작업이다.
이렇게 수정된 환경에서 실행되는 프로그램은 지정된 디렉터리 트리 밖의 파일들의 이름을 지정할 수 없으므로(즉, 일반적으로는 접근이 불가능하므로) chroot 감옥으로 부른다.
나스 같은 환경에서는 특정 디렉토리에 리눅스(주로 데비안) 시스템 파일을 올려두고 그 디렉토리를 루트 디렉토리로 변경하여 기본 환경에 없는 각종 프로그램을 이용하는 목적으로 많이 사용합니다.
아래는 Arm 프로세서를 사용하는 라우트(RT-AC56U, RT-AC68U, RT-AC87U, RT-AC88U, RT-AC3200, RT-AC5300…)용으로 chroot를 설치하는 방법을 nas4dual에 맞게 수정한 것입니다.
원본은 아래 링크에서 확인할 수 있습니다.
https://www.hqt.ro/how-to-install-debian-jessie-arm/
준비 작업
아래 링크를 참고하여 entware를 설치합니다.
https://isulnara.com/wp/archives/1307
자 이제 설치에 들어갑니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
localhost> opkg install binutils Installing binutils (2.26.1-1) to root... Downloading http://pkg.entware.net/binaries/armv7/binutils_2.26.1-1_armv7soft.ip k. Installing objdump (2.26.1-1) to root... Downloading http://pkg.entware.net/binaries/armv7/objdump_2.26.1-1_armv7soft.ipk . Installing libopcodes (2.26.1-1) to root... Downloading http://pkg.entware.net/binaries/armv7/libopcodes_2.26.1-1_armv7soft. ipk. Installing libbfd (2.26.1-1) to root... Downloading http://pkg.entware.net/binaries/armv7/libbfd_2.26.1-1_armv7soft.ipk. Installing libiconv-full (1.11.1-3) to root... Downloading http://pkg.entware.net/binaries/armv7/libiconv-full_1.11.1-3_armv7so ft.ipk. Installing libintl-full (0.19.8.1-1) to root... Downloading http://pkg.entware.net/binaries/armv7/libintl-full_0.19.8.1-1_armv7soft.ipk. Installing ar (2.26.1-1) to root... Downloading http://pkg.entware.net/binaries/armv7/ar_2.26.1-1_armv7soft.ipk. Configuring libiconv-full. Configuring libintl-full. Configuring libbfd. Configuring libopcodes. Configuring objdump. Configuring ar. Configuring binutils. localhost> opkg install coreutils-chroot Installing coreutils-chroot (8.23-2) to root... Downloading http://pkg.entware.net/binaries/armv7/coreutils-chroot_8.23-2_armv7soft.ipk. Configuring coreutils-chroot. localhost> cd /opt localhost> /opt/bin/wget -c -O debian_jessie8.9-arm_clean.tgz https://nas.fft.kr/nasXdual/chroot/?download=debian_jessie8.9-arm_clean.tgz localhost> tar -xvzf ./debian_jessie8.9-arm_clean.tgz localhost> rm -rf debian_jessie8.9-arm_clean.tgz |
아래 명령 또는 텍스터 에디터로
1 2 3 |
vi /opt/etc/init.d/S99debian |
아래와 같은 내용으로 /opt/etc/init.d/S99debian 파일을 생성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
#!/bin/sh PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin # Folder with Debian Jessie CHROOT_DIR=/opt/debian # Some folder outside of sandbox, # will be mounted to /mnt folder in Debian # Uncommented next line if you need to mount a folder inside debian EXT_DIR=/mnt/HDD1/@chroot/media/ CHROOT_SERVICES_LIST=/opt/etc/chroot-services.list if [ ! -e "$CHROOT_SERVICES_LIST" ]; then echo "Please, define Debian services to start in $CHROOT_SERVICES_LIST first!" echo "One service per line. Hint: this is a script names from Debian's /etc/init.d/" exit 1 fi MountedDirCount="$(mount | grep $CHROOT_DIR | wc -l)" start() { if [ $MountedDirCount -gt 0 ]; then echo "Chroot'ed services seems to be already started, exiting..." exit 1 fi echo "Starting chroot'ed Debian services..." for dir in dev proc sys; do mount -o bind /$dir $CHROOT_DIR/$dir done [ -z "$EXT_DIR" ] || mount -o bind $EXT_DIR $CHROOT_DIR/mnt for item in $(cat $CHROOT_SERVICES_LIST); do chroot $CHROOT_DIR /etc/init.d/$item start done } stop() { if [ $MountedDirCount -eq 0 ]; then echo "Chroot'ed services seems to be already stopped, exiting..." exit 1 fi echo "Stopping chroot'ed Debian services..." for item in $(cat $CHROOT_SERVICES_LIST); do chroot $CHROOT_DIR /etc/init.d/$item stop sleep 2 done mount | grep $CHROOT_DIR | awk '{print $3}' | xargs umount -l } restart() { if [ $MountedDirCount -eq 0 ]; then echo "Chroot'ed services seems to be already stopped" start else echo "Stopping chroot'ed Debian services..." for item in $(cat $CHROOT_SERVICES_LIST); do chroot $CHROOT_DIR /etc/init.d/$item stop sleep 2 done mount | grep $CHROOT_DIR | awk '{print $3}' | xargs umount -l echo "Restarting chroot'ed Debian services..." for dir in dev proc sys; do mount -o bind /$dir $CHROOT_DIR/$dir done [ -z "$EXT_DIR" ] || mount -o bind $EXT_DIR $CHROOT_DIR/mnt for item in $(cat $CHROOT_SERVICES_LIST); do chroot $CHROOT_DIR /etc/init.d/$item start done fi } enter() { [ -z "$EXT_DIR" ] || mount -o bind $EXT_DIR $CHROOT_DIR/mnt mount -o bind /dev/ /opt/debian/dev/ mount -o bind /dev/pts /opt/debian/dev/pts mount -o bind /proc/ /opt/debian/proc/ mount -o bind /sys/ /opt/debian/sys/ chroot /opt/debian /bin/bash } status() { if [ $MountedDirCount -gt 0 ]; then echo "Chroot'ed services running..." else echo "Chroot'ed services not running!" fi } case "$1" in start) start ;; stop) stop ;; restart) restart ;; enter) enter ;; status) status ;; *) echo "Usage: (start|stop|restart|enter|status)" exit 1 ;; esac echo Done. exit 0 |
위 내용 중 EXT_DIR=/mnt/HDD1/@chroot/media/는 자신의 환경에 맞게 수정합니다.
root 권한이 필요한 부분이 있어서 아래 명령으로 root 사용자로 전환하고, 아래 명령들을 내립니다.
1 2 3 4 5 6 7 8 9 10 11 |
localhost> su - localhost> chmod 755 /opt/etc/init.d/S99debian localhost> touch /opt/etc/chroot-services.list localhost> ln -s /opt/etc/init.d/S99debian /opt/bin/debian localhost> cp /etc/hosts /opt/debian/etc/ localhost> mkdir -p /mnt/HDD1/@chroot/media |
위의 마지막 명령에서 /mnt/HDD1/@chroot/media의 경로는 이전 단계 /opt/etc/init.d/S99debian 파일에 있는 EXT_DIR에 설정된 값으로 수정합니다.
이제 모든 설치와 설정이 끝났습니다.
아래 명령으로 chroot 환경의 데비안으로 접속합니다.(이후부터는 su – 이후 아래 명령만 내리면 됩니다.)
1 2 3 4 5 |
localhost> debian enter mount: mount point /opt/debian/dev/pts does not exist root@NAS4dual:/# |
프롬프트가 위와 같이 변경되면 성공입니다. (pts 관련 에러가 발생하지만 무시해도 됩니다)
아래 명령으로 각종 패키지를 최신 버전으로 업데이트합니다.
1 2 3 |
apt update && apt upgrade -y |
아래 명령으로 시간을 설정합니다.
1 2 3 |
dpkg-reconfigure tzdata |
아래 명령으로 패키지를 하나 설치해봅니다. (ncftp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@NAS4dual:/# apt-get install ncftp Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: ncftp 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 531 kB of archives. After this operation, 1032 kB of additional disk space will be used. Get:1 http://httpredir.debian.org/debian/ stable/main ncftp armel 2:3.2.5-1.1 [531 kB] Fetched 531 kB in 1s (431 kB/s) E: Can not write log (Is /dev/pts mounted?) - posix_openpt (28: No space left on device) Selecting previously unselected package ncftp. (Reading database ... 8963 files and directories currently installed.) Preparing to unpack .../ncftp_2%3a3.2.5-1.1_armel.deb ... Unpacking ncftp (2:3.2.5-1.1) ... Setting up ncftp (2:3.2.5-1.1) ... update-alternatives: using /usr/bin/ncftp3 to provide /usr/bin/ncftp (ncftp) in auto mode |
chroot 환경을 벗어나려면 아래 명령을 내립니다.
1 2 3 4 5 |
root@NAS4dual:/# exit exit Done. |
2019-10-09 추가
chroot 환경에 설치된 서비스 시스템 리부팅 시 자동 시작
터미널에 root 권한으로 접속하여 /opt/etc/chroot-services.list 파일에 chroot 환경에서 설치된 서비스명을 한 줄에 하나씩 추가합니다. 서비스명은 chroot 환경 기준으로 /etc/init.d에 있는 파일명입니다(chroot 환경이 아닌 메인 시스템 기준으로는 /opt/debian/etc/init.d에 있는 파일명입니다).
1 2 3 4 |
localhost> su - localhost> vi /opt/etc/chroot-services.list |
참고로 위 파일의 내용 샘플입니다. chroot 환경 기준으로 /etc/init.d/dnsmasq, /etc/init.d/S90-abc.sh 파일을 자동 실행시킬 경우 아래처럼 작성합니다.
1 2 3 4 |
dnsmasq S90-abc.sh |
이제 시스템을 재시작하면 dnsmasq와 S90-abc.sh가 자동 실행됩니다.
참고 사이트: https://www.hqt.ro/how-to-install-debian-jessie-arm/
설치 후 기억을 더듬어 작성한 글이라 오류가 있을 수 있습니다. 혹시나 위와 같이 했는데 정상 동작하지 않는다면 댓글을 남겨주시기 바랍니다.
binutils 를 먼저 설치하고 하는 거군요.
고생하신 거 잘 배워갑니다. ^^
사실 목적이 다른 곳에 있어(?) ^^ 다른 방법으로 해 봤는데, 문제가 해결이 안되네요.
데비안을 올려서 설치를 시도해 보면 어떨까 해서요~ 고맙습니다.
백만년만에 리눅스를 접하니, 생소한 게 많이 나왔네요.
크로스 컴파일도 방법이 될 거 같고.. 근데 물어볼 곳이 없어 귀찮게 해드렸네요.
감사해요 ^^
binutils외에도 기본 wget이 아닌 /opt/bin/wget을 사용하는 것도 중요하고, su -로 root 사용자로 전환하는 것도 중요합니다.
Tvheadend 성공하길 바라겠습니다^^
잘 지내셨어요 ^^
nas4dual 이 어떤 설정이 되어 있어선지, entware 를 설치해서 Tvheadend 하면 실행은 문제 없이 실행되는데, 다른 건 다 되는데, 통신이 안됩니다. iptables 로 방화벽를 점검해 봐도 아무 것도 없는데 안되네요.
암튼 생각해 봤는데, nas4dual은 직접 컴파일 할 수 없나요? 아예 직접 컴파일을 해봤으면 좋겠는데요.
https://tvheadend.org/projects/tvheadend/wiki/Building
우분투나 데비안 건데, 임베디드는 직접 컴파일이 안되나요?
git, make 설치하고 그냥 하면 되나요?
안녕하세요.
직접 컴파일 하려면 build-essential 설치하면 될 겁니다.
git은 소스를 내려받기 위한 툴입니다.
localhost> opkg install coreutils-chroot
Package coreutils-chroot (8.23-3) installed in root is up to date.
localhost> opkg install binutils
Package binutils (2.27-1) installed in root is up to date.
localhost> cd /opt
localhost> /opt/bin/wget -c -O debian_jessie8.6-arm_clean.tgz http://goo.gl/Yp7CwA
-sh: /opt/bin/wget: not found
localhost> tar -xvzf ./debian_jessie8.6-arm_clean.tgz
tar: ./debian_jessie8.6-arm_clean.tgz: No such file or directory
localhost> /opt/bin/wget -c -O debian_jessie8.6-arm_clean.tgz http://goo.gl/Yp7CwA
-sh: /opt/bin/wget: not found
이런 메시지와 함께 더 진행이 안되는데 뭐가 문제 일까요.
영문이 많아서 스팸으로 인식되었네요.
한글부터 시작해서 영문이 나중에 나오면 스팸으로 인식되지 않습니다.
wget이 설치되지 않은 것 같습니다.
아래 명령으로 wget부터 설치해보세요
안녕하세요
su – 를 했음에도 불구하고…
chmod 755 /opt/etc/init.d/S99debian
가 먹질않습니다.. 에러가 뜨는건아닌데
정상적으로 콘솔은 먹히는데
실질적으로 권한은 변경되지않고 모두
-rwxrwxrwx 입니다.. chown 으로 소유자,그룹은 변경이되는데
chmod 는 변경이되지않습니다. 혹시 추가적으로 수정해야되는부분이 있을까요?
entware는 설치된 상태인거죠?
su – 명령을 내렸을 때 아래처럼 쉘이 변경되는지요?
localhost> su –
BusyBox v1.00-rc3 (2016.05.13-01:37+0000) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.
localhost>
localhost> opkg install coreutils-chroot
Package coreutils-chroot (8.23-3) installed in root is up to date.
localhost> opkg install binutils
Package binutils (2.27-1) installed in root is up to date.
localhost> cd /opt
localhost> /opt/bin/wget -c -O debian_jessie8.6-arm_clean.tgz http://goo.gl/Yp7CwA
-sh: /opt/bin/wget: not found
localhost> tar -xvzf ./debian_jessie8.6-arm_clean.tgz
tar: ./debian_jessie8.6-arm_clean.tgz: No such file or directory
localhost> /opt/bin/wget -c -O debian_jessie8.6-arm_clean.tgz http://goo.gl/Yp7CwA
-sh: /opt/bin/wget: not found
디렉토리 변경을 하고 실행을 해도 해당 디렉토리가 찾을 수 없다고 나오는데
어떻게 해야 할지 조언 좀 부탁 드립니다.
wget 명령이 없어서 그렇습니다.
아래 명령으로 설치하면 됩니다.
그리고, http://goo.gl/Yp7CwA 링크에 있던 파일이 없어졌네요.
본문에서 URL 수정하였습니다.
댓글이 안 남겨 지는건가요.
계속 글을 적어도 남겨지질 않네요.
안녕하세요.
블로그 운영 중인 서버를 성능이 낮은 무료 서버를 이용하다 보니 그런 것 같습니다. 가끔 안될때가 있네요.
그리고 영문이 아주 많은 경우 스팸으로 인식되어서 안될 수도 있습니다.
리눅스에 대한 전반적인 지식이 부족해서 죄송스럽게도 요청글만 올리게 되네요.
현재 nas2dual 에 git 과 같은 오픈 소스 들을 구축 해서 쓰고 싶어서 지금 해보고 있는건데요.
이런게 다 가능 하려면 어디를 참고를 하는게 좋을 지도 알려 주실 수 있으실까요.
특별히 참고할만한 사이트는 모르겠네요.
일단 nas2dual에 git부터 설치해야 됩니다.
아래 링크를 참고해서 entware을 설치했다면
https://isulnara.com/wp/archives/1307
아래 명령으로 git을 설치하면 됩니다.
localhost> -sh: /opt/bin/wget: Permission denied
-sh: -sh:: not found
원래는 디렉토리를 찾을 수 없다고 나오다가 현재는 이렇게 나오네요.
-sh 명령은 없는 명령어입니다.
어떤 명령을 내리려고 하는 것인가요?
이전에 남기신 글이 스팸으로 분류되어서 해제하고 댓글 남겼습니다.
”
localhost> cd /opt
localhost> /opt/bin/wget -c -O debian_jessie8.6-arm_clean.tgz http://goo.gl/Yp7CwA
-sh: /opt/bin/wget: Permission denied
”
이렇게 메시지가 나오는데 어떻게 진행을 해야 할까요.
아래 명령 내린 결과를 남겨주세요.
아래처럼 나와야 됩니다.
혹시나 다르다면 아래 명령을 내린 후 해보세요.
감사합니다.
업데이트된 내용으로 다시 따라하니 정상적으로 데비안 까지 설치 진입 잘 되네요.
그런데 nas를 재부팅 하면 엔트웨어 설치했던 폴더도 다시 없어졌는데
이부분은 엔트웨어 설치 글에 있는 쉘 시작 하는 부분을 수정 하면 유지가 되는 걸까요?
예.. entware 설치 부분의 BubbleUPNPServer 스크립트 수정하는 부분을 적용하면 해결될 것 같습니다.
지금은 2020년.. ipTIME 가 새 Entware 지원 공유기를 내놓으면서 이 글이 엄청 유용했습니다.
고맙습니다^^
PUTTY 열고 vi /opt/etc/init.d/S99debian 입력하고 밑에 105줄 복사 붙여넣기 한다음 어떻게해야되는지요? 엔터 쳐도 안되고 저장?하고 나가기 이런것도 없는데
맨밑에 — Insert — 나오고 local host 입력하는 게 안보입니다…
:wq 엔터 눌러서 나가는것까지…. 찾아서 마무리했습니다….
localhost> debian enter
mount: mount point /opt/debian/dev/pts does not exist
/opt/bin/debian: 102: chroot: not found
Done.
이렇게 나오는데 뭐가 잘못된걸까요./..
안녕하세요.
debian enter 명령 내리기 전에
su – 명령으로 root 사용자 전환하신 것인지요?
만약 그렇다면 아래 명령 실행 시 설치가 제대로 되었는지도 확인 바랍니다.
opkg install coreutils-chroot
localhost> /opt/bin/wget -c -O debian_jessie8.9-arm_clean.tgz https://nas.fft.kr/nasXdual/chroot/?download=debian_jessie8.9-arm_clean.tgz
https://nas.fft.kr/nasXdual/chroot/?download=debian_jessie8.9-arm_clean.tgz: HTTPS support not compiled in.
안녕하세요, 이렇게 오류가 나오는데 혹시 tgz파일 링크가 잘못되었을까요?ㅠ
localhost> /opt/bin/wget -c -O debian_jessie8.9-arm_clean.tgz https://nas.fft.kr/nasXdual/chroot/?download=debian_jessie8.9-arm_clean.tgz
혹시 링크가 맞을까요? 안되는것 같아서요 ㅠ
에구.. 해당 문장은 넘어갔는데 아래 처럼 나옵니다
localhost> tar -xvzf debian_jessie8.9-arm_clean.tgz
tar: Short read
localhost> wget -c -O debian_jessie8.9-arm_clean.tgz https://nas.fft.kr/nasXdual/chroot/?download=debian_jessie8.9-arm_clean.tgz
wget: not an http or ftp url: https://nas.fft.kr/nasXdual/chroot/?download=debian_jessie8.9-arm_clean.tgz
안녕하세요. 죄송합니다. 서버 재설치하면서 현재 해당 링크가 존재하지 않네요.
복구 후 다시 댓글 남기겠습니다.
링크에 있는 파일 다운로드 되게 다시 살렸습니다.
debian_jessie8.9-arm_clean.tgz 다운로드 명령부터 다시 시작해보세요.
불편을 드려 죄송합니다.
감사합니다!