Banana PI (中文名:香蕉派,以下簡稱 BPI)是比 Raspberry PI (中文名:樹莓派)性能更強、功能更多、內置 AllWinner A20 雙核 CPU、1GB DDR3內存、SATA 硬盤接口、千兆網口、HDMI接口、可運行 Linux/OpenWRT/Android 等系統、而且價格比較便宜的單板微型電腦;詳見:www.bananapi.com
在 BPI 官網上提供有幾個常見系統的 IMG 供下載(http://www.lemaker.org/resources/9-38/image_files.html),可直接燒寫到 SD 卡用於啓動 BPI;本文試驗了另一種自行構建 BPI 系統的方法,可根據需要定製系統各部件和功能;本文打算嘗試構建一個最小的基本 Linux 服務器系統;爲了方便,本文直接選用目前廣泛使用的 Ubuntu 提供的成熟 core 作爲 rootfs,這樣既能保證系統穩定可靠,又便於後期功能定製,節省時間和精力。安裝 ubuntu core 14 和 gcc 開發環境等常用軟件後總共佔用600MB存儲空間,內存佔用50MB左右,系統運行狀況如下:
== A. 準備工作 ==
一、所需硬件
需要 Banana PI 開發板一塊;
一臺正常運行 Linux 系統的電腦(Linux 虛擬機也行);
容量大於 1GB SD 卡,或者 TF 配卡套,以及相應讀卡設備;
另準備一張 4GB SD 卡,用於燒寫現有 .img 以啓動 BPI 作輔助操作;
二、所需軟件
從 ubuntu 網站 http://cdimage.ubuntu.com/ubuntu-core/releases/ 下載 ubuntu-core-14.04.1-core-armhf.tar.gz 包文件(60MB)
從 banana pi 網站 http://www.lemaker.org/resources/9-38/image_files.html 下載 Raspbian_For_BananaPi_v3_0.img 包文件
從 sunxi 網站 http://dl.linux-sunxi.org/nightly/u-boot-sunxi/u-boot-sunxi/u-boot-sunxi-latest/ 下載 u-boot-sunxi-bananapi.tar.xz 包
== B. 主要步驟 ==
一、SD 卡分區
$ sudo fdisk -l
如果系統中沒有連接別的設備,通常此 SD 卡設備名爲: /dev/sdb ;以下假設此卡就爲 /dev/sdb,須根據實際情況進行替換;命令中寫錯設備名後果難料;
進入 fdisk 分區程序,用 n 子命令將此卡空間分成兩個分區,提示輸入第一分區大小時輸入 +30M,其他參數均以回車接受默認值即可;
$ sudo fdisk /dev/sdb
以 p 子命令查看分區情況,確認無誤後,輸入 w 子命令確認分區寫入卡設備中並退出;
二、格式化分區
$ sudo mkfs.vfat /dev/sdb1
$ sudo mkfs.ext4 /dev/sdb2
三、寫入 U-Boot 啓動代碼
先清除 SD 卡前段內容;
$ sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1023 seek=1
接着在特定位置寫入啓動代碼和數據
$ sudo dd if=/path/to/u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
注意:此處命令行假設所有下載的文件包均存放在 /path/to 虛擬目錄中,操作時須替換成實際目錄;
四、安裝內核啓動文件
先查看 IMG 包中第一分區的起始塊位置,這裏假設爲 8192,將其乘以 512 的結果 4194304 放入下面命令中;
$ sudo mkdir /mnt/img
$ fdisk -l /path/to/Raspbian_For_BananaPi_v3_0.img
$ sudo mount -t vfat -o loop,offset=4194304
/path/to/Raspbian_For_BananaPi_v3_0.img /mnt/img
掛載成功後,從 /mnt/img 目錄中複製出來這三個內核文件即可;
$ cp /mnt/img/uEnv.txt ./
$ cp /mnt/img/bananapi/uImage ./
$ cp /mnt/img/bananapi/script.bin ./
$ sudo umount /mnt/img
由於 ./Raspbian_For_BananaPi_v3_0.img 包中內核放在子目錄 ./bananapi 中,現在我們打算將此三個內核文件直接放在 SD 卡第一分區根目錄中,所以還需要將複製出來的 uEnv.txt 內容用 vi 命令稍稍編輯一下,去掉內核文件的目錄路徑,使其內容寫成這樣子,然後保存退出 vi 命令;
bootargs=console=ttyS0,115200 console=tty0
disp.screen0_output_mode=EDID:1280x720p50 hdmi.audio=EDID:0
console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline
rootwait
aload_script=fatload mmc 0 0x43000000 script.bin;
aload_kernel=fatload mmc 0 0x48000000 uImage; bootm 0x48000000;
uenvcmd=run aload_script aload_kernel
內核文件提取出來後,就可以複製到 SD 卡第一分區中;
$ sudo mkdir /mnt/sd
$ sudo mount -t vfat /dev/sdb1 /mnt/sd
$ cp uEnv.txt script.bin uImage /mnt/sd
$ sudo umount /mnt/sd
如果需要調整 script.bin 中參數,比如AV口接電視機,則需要先用 bin2fex 軟件來實現文件格式轉換成文本文件,再作修改,參見:linux-sunxi.org/Fex_Guide
五、安裝 rootfs
$ sudo mount /dev/sdb2 /mnt/sd
$ cd /mnt/sd
$ tar xzvf /path/to/ubuntu-core-14.04.1-core-armhf.tar.gz
六、安裝 modules 和 firmware 文件
先查出 IMG 包中第二分區的起始塊位置,這裏假設爲 122880,將其乘以 512 的結果 62914560 放入下面命令中;
$ fdisk -l /path/to/Raspbian_For_BananaPi_v3_0.img
$ sudo mount -t ext4 -o loop,offset=62914560 /path/to/Raspbian_For_BananaPi_v3_0.img /mnt/img
掛載成功後,從 /mnt/img 目錄中複製內核版本對應的 modules/firmware 硬件驅動相關文件到 /mnt/sd;
$ sudo cp -r /mnt/img/lib/firmware /mnt/sd/lib/
$ sudo cp -r /mnt/img/lib/modules/3.4.90 /mnt/sd/lib/modules
從宿主系統複製 DNS 服務器地址信息 resolv.conf 到 /mnt/sd/etc,稍後可能需要在線安裝軟件;
$ sudo cp -p /etc/resolv.conf /mnt/sd/etc
完成以上步驟,SD 卡中 core 系統所需文件基本都已就緒,只待對新系統稍作配置即可開始工作了;
七、初步配置新系統
由於上述操作過程均是在一臺 x86 Linux 主系統上進行,而 chroot 需要使用 arm 架構的主系統,所以,這裏利用另一張 SD 卡啓動 Banana PI 作爲主系統進行操作;如果你使用的主系統電腦本身就是 arm 架構,就不必另啓 BPI 了,可直接利主系統進行其餘操作;
爲了切換到 BPI arm 主系統中進行 chroot 操作,須先卸載 x86 系統上掛載的 SD 卡,同時清除臨時目錄;
$ sync
$ sudo umount /mnt/img
$ sudo umount /mnt/sd
$ sudo rm -r /mnt/img /mnt/sd
用燒寫好的另一張 SD 卡啓動 BPI(可以採用 Raspbian_For_BananaPi_v3_0.img),並將新系統 SD 卡通過讀卡器連接到 BPI USB端口,先查看系統中已自動識別的 USB
設備,以確定新 SD 卡的設備名稱,這裏假設新SD卡設備名稱爲:/dev/sdb
$ lsusb
$ lsblk
掛載新SD卡的第二分區到 /mnt 目錄,然後進入 chroot 狀態;
$ sudo mount /dev/sdb2 /mnt
$ sudo chroot /mnt /bin/bash
正常進入 chroot 後,所有命令均直接針對新系統進行操作;首先,設置 root 密碼;
# passwd
然後配置主機名稱、設置 noatime、添加用戶帳戶、並開啓網絡接口等;
# echo "ucore14" > /etc/hostname
# adduser newid
在啓動命令文件 /etc/rc.local 中插入一行:mount -o remount -o noatime / ,以提升性能同時防止頻繁擦寫弄壞 SD 卡;
# vi /etc/rc.local
然後設置時區;
# mv /etc/localtime /etc/localtime.0
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
在 /etc/network/interfaces 輸入網卡配置,比如,打算以 DHCP 方式連接路由器,則在其中填入以下內容:
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
如果還需要配置 wifi 網絡,則須另購一隻兼容的 USB 接口 wifi 網卡,然後通過 wpa_supplicant 軟件進行配置;這裏暫時不考慮安裝wifi網卡,待新系統正常運行起來再配置其他子系統即可;
至此,一個最基本的 Ubuntu 核心系統即安裝完成,如果一切正常,便可使用此 SD 卡正常啓動 Banana PI 了;不過得注意,下載得到的 ubuntu-core-14.04.1-core-armhf.tar.gz 包文件中並未安裝 sshd 軟件包,這意味着無法遠程登錄進入系統;假如你沒有 HDMI 顯示器可用,或者你的 Banana PI 只作服務器運行,則在退出 chroot 狀態前,安裝上 ssh 軟件包是很有必要的,爲此,需要跳轉到下一步驟;
如果此時不打算安裝 ssh 服務,也不再進行其他配置和操作,則可以考慮退出 chroot 狀態,並卸載 SD 卡;
# exit
# sync
# sudo umount /mnt
八、安裝 SSH 遠程登錄(無屏必需)
在上面 chroot 狀態中繼續安裝 ssh 軟件包;如果此前已退出 chroot 則需再次進入 chroot ;
# apt-get update
# apt-get install ssh
此命令需要在線下載軟件包,這也是前面需要事先複製 /etc/resolv.conf 到 SD 卡 rootfs 的原因;網速正常的話,通常幾分鐘即可下載安裝完成;
由於默認安裝的 sshd_config 配置,基於對安全性的考慮,不允許以密碼方式遠程登錄 root 帳戶和空密碼遠程登錄,只允許使用 ssh-key 遠程登錄 root 帳戶;這裏爲了方便登錄,決定暫時開啓密碼登錄,編輯 /etc/ssh/sshd_config 配置文件;
# vi /etc/ssh/sshd_config
將此項設置的值由 "without-password" 改爲 "yes" 即可,或者將原設置行註釋掉,再輸入新的設置行,如下:
# PermitRootLogin without-password
PermitRootLogin yes
保存此項設置修改後,必要的安裝和配置就全部完成了,退出 chroot,卸載 SD 卡並關機;
# exit
# sync
# sudo umount /mnt
# sudo poweroff
至此,此 SD 卡中已包含有一個可啓動的 Ubuntu Core 14.04 for Banana PI;將此 SD 卡插入 Banana PI 開機,如果順利,很快就可啓動出來,並可以 ssh 遠程登錄進入系統;上面配置 Banana PI 以 DHCP 方式從路由器自動獲取 IP 地址,所以,在 ssh 登錄前,可在路由器管理界面 DHCP 欄目中查看路由器爲 BPI 分配的 IP 地址;
由於 Ubuntu Core 只是一個 Core,沒有包含其他任何應用系統,如:APACHE、MYSQL、PHP、X11、OFFICE 等等,不過,可利用 Debian 系的 apt-get install xxx 很方便的安裝其餘所需要的軟件。。。
== C. 小結 ==
以上試驗步驟實現了在目標 SD 卡中從分區開始配置一個可啓動 Banana PI 的 Ubuntu Core 系統,操作步驟較多,爲了省事,也可以採用逆向操作,即直接在 SD 卡中燒寫一個現成的 IMG 系統,然後用目標 rootfs 替換掉原系統即可;網上有許多針對 arm 架構的 rootfs 可用,較小的解壓後只有30M左右,比如:linaro-image-minimal-initramfs-genericarmv7a;不過,爲了方便安裝應用軟件,還是選用 debian core, ubuntu core 這類要方便一些,儘管尺寸稍大些;
另外,基於以上操作步驟,稍作變通,即可根據需要製作自己的 .img 系統;過程大致相同,只需將 SD 卡換成一個 .img 文件,將 .img 文件掛載爲 loop 設備即可;具體操作此處不再贅述;