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/archives/1307

자 이제 설치에 들어갑니다.

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

아래 명령 또는 텍스터 에디터로

vi /opt/etc/init.d/S99debian

아래와 같은 내용으로 /opt/etc/init.d/S99debian 파일을 생성합니다.

#!/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 사용자로 전환하고, 아래 명령들을 내립니다.

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 – 이후 아래 명령만 내리면 됩니다.)

localhost> debian enter
mount: mount point /opt/debian/dev/pts does not exist
root@NAS4dual:/#

프롬프트가 위와 같이 변경되면 성공입니다. (pts 관련 에러가 발생하지만 무시해도 됩니다)

아래 명령으로 각종 패키지를 최신 버전으로 업데이트합니다.

apt update && apt upgrade -y

아래 명령으로 시간을 설정합니다.

dpkg-reconfigure tzdata

아래 명령으로 패키지를 하나 설치해봅니다. (ncftp)

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 환경을 벗어나려면 아래 명령을 내립니다.

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에 있는 파일명입니다).

localhost> su -
localhost> vi /opt/etc/chroot-services.list

참고로 위 파일의 내용 샘플입니다. chroot 환경 기준으로 /etc/init.d/dnsmasq, /etc/init.d/S90-abc.sh 파일을 자동 실행시킬 경우 아래처럼 작성합니다.

dnsmasq
S90-abc.sh

이제 시스템을 재시작하면 dnsmasq와 S90-abc.sh가 자동 실행됩니다.

참고 사이트: https://www.hqt.ro/how-to-install-debian-jessie-arm/