2013/04/23

Install Ubuntu Core on NAS




好久之前入手了一台華芸科技 ASUSTOR AS-604T 的 NAS,對於某些玩家來說(像我),不能方便的用 apt 安裝自己想要的軟體實在是很麻煩,還好的是用 Ubuntu Core 來在上面製作一個簡單的 Ubuntu rootfs 是非常容易的。本文最後將在 Ubuntu Core 上安裝另一個 SSH server 做為介紹。

考量到為了以後方便移植軟體進去 NAS,推薦使用跟 AS-604T 相容的 Ubuntu 版本 (11.10) 未來才不會遇到太多函式庫相依的問題。

接著本文將展示
  • 使用 Ubuntu Core
  • Hacking ASUSTOR NAS

安裝 Ubuntu Core

$ ssh root@192.168.0.50 # ssh to your NAS
$ # Download Ubuntu Core 11.10
$ cd /volume1/ 
$ wget http://cdimage.ubuntu.com/ubuntu-core/releases/11.10/release/ubuntu-core-11.10-core-amd64.tar.gz
$ # Extract it to ubuntu
$ mkdir ubuntu && tar xvf ubuntu-core-11.10-core-amd64.tar.gz -C ubuntu/

mount.sh

$ cat << END > mount.sh
#!/bin/sh
ubuntu=/volume1/ubuntu
if [ "\$1" == "umount" ]; then
    if grep -q " \$ubuntu/" /proc/mounts; then
        awk -v ubuntu=$ubuntu '$2 ~ /ubuntu\// { print \$2 }' /proc/mounts | sort -u | xargs umount
    else
     true
    fi
elif [ "\$1" == "mount" ]; then
    grep -q " \$ubuntu/proc " /proc/mounts || mount -o bind /proc \$ubuntu/proc
    grep -q " \$ubuntu/sys " /proc/mounts || mount -o bind /sys \$ubuntu/sys
    grep -q " \$ubuntu/mnt" /proc/mounts || mount -o bind /volume1 \$ubuntu/mnt
    grep -q " \$ubuntu/dev/pts" /proc/mounts || mount -t devpts /dev/pts \$ubuntu/dev/pts
else
    awk -v ubuntu=\$ubuntu '\$2 ~ /ubuntu\// { print \$2 }' /proc/mounts | sort -u
fi
END
$ chmod +x mount.sh

chroot.sh

$ cat << END > chroot.sh
#!/bin/sh
if [ \$# == "0" ] ; then
    chroot /volume1/ubuntu /bin/bash
else
    chroot /volume1/ubuntu \$*
fi
END
$ chmod +x chroot.sh

安裝基本工具 and 切換到 Ubuntu

$ echo nameserver 8.8.8.8 >> /etc/resolv.conf
$ cat << END >> /etc/apt/source.list
deb http://tw.archive.ubuntu.com/ubuntu/ precise universe
deb-src http://tw.archive.ubuntu.com/ubuntu/ precise universe
deb http://tw.archive.ubuntu.com/ubuntu/ precise-updates universe
deb-src http://tw.archive.ubuntu.com/ubuntu/ precise-updates universe
END
$ ./mount.sh mount # 掛載 filesystems,每次開機只要做一次
$ ./chroot.sh #切換到 Ubuntu
$ apt-get update
$ apt-get install command-not-found less vim x11-apps
至此我們已經有一個 Ubuntu 可以使用了。

安裝另一個 OpenSSH server

$ apt-get install openssh-server
$ passwd root
$ sed -i 's/^Port 22$/Port 2222/' /etc/ssh/sshd_config
$ /etc/init.d/ssh start
從別台電腦登入新開的 ssh server,順便啟用 X11 Forwarding
$ xhost +
$ ssh -X root@192.168.0.50 -p 2222
$ # 設 local ip:display number
$ export DISPLAY=192.168.0.100:0
$ xclock
結果如同第一張圖所示,我們新開了一個 ssh service 在 2222 埠,連進去後 X11 Forwarding 也能順利使用(原先 ASUSTOR NAS 的 ssh server 不提供 X11 forwarding)。

順便提供自動設 DISPLAY 參數的 script,可以加在 ~/.bashrc,以後就不用每次 export DISPLAY=...
# DISPLAY
remote_ip=`env | awk '$0 ~ /^SSH_CLIENT=/ {print substr($1, index($1, "=") + 1)}'`
if [ ! -z "$remote_ip" ] ; then
    export DISPLAY=$remote_ip:0
    echo DISPLAY=$DISPLAY
fi

ASUSTOR NAS 程式自動啟動


可以在 /usr/local/AppCentral/*/CONTROL/start-stop.sh 找到一些 ASUSTOR NAS 的啟動 script。我隨便挑了一個 python 的 start-stop.sh 來偷加入剛才的 ssh server 啟動結束指令,如下列第 11 及 17 行

1 #!/bin/sh
     2
     3 EASY_INSTALL_BIN=/usr/local/AppCentral/python/bin/easy_install
     4 EASY_INSTALL_LINK=/usr/local/bin/easy_install
     5
     6 case $1 in
     7
     8  start)
     9   echo "Starting python..."
    10   ln -sf $EASY_INSTALL_BIN $EASY_INSTALL_LINK
    11   /volume1/mount.sh mount && /volume1/chroot.sh /etc/init.d/ssh start
    12   ;;
    13
    14  stop)
    15   echo "Stopping python..."
    16   rm -rf $EASY_INSTALL_LINK
    17   /volume1/chroot.sh /etc/init.d/ssh stop && /volume1/mount.sh umount
    18   ;;
    19
    20  *)
    21   echo "usage: $0 {start|stop}"
    22   exit 1
    23   ;;
    24
    25 esac
    26 exit 0

(為什麼 NAS 系統不直接以 Ubuntu/Debian/... 當做 base system 就好)

No comments: