恩兔N2是一個家庭存儲的系列產品, NS-1 是其中最小的一個版本, 基於海思ARM64 CPU Hi3798MV200. 和其他設備相比, 特點是內置2.5寸SATA盤位, 並且帶千兆網口. 這個設備比較小眾, 存量很小, 不如斐訊N1, 玩客雲那樣有廣泛的認知度, 甚至在百度和Google上搜索... ...
目錄
- Hi3798MV200 恩兔N2 NS-1 (一): 設備介紹和刷機說明
- Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海納思使用和修改
- Hi3798MV200 恩兔N2 NS-1 (三): 製作 Ubuntu rootfs
- Hi3798MV200 恩兔N2 NS-1 (四): 製作 Debian rootfs
介紹
恩兔N2是一個家庭存儲的系列產品, NS-1 是其中體積最小的一個型號, 基於海思ARM64 CPU Hi3798MV200. 和其他設備相比, 特點是內置2.5寸SATA盤位, 並且帶千兆網口. 這個設備比較小眾, 存量很小, 不如斐訊N1, 玩客雲那樣有廣泛的認知度, 甚至在百度和Google上搜索都沒什麼結果. 生產商恩兔科技這個公司已經停止經營, 其網站 n2yun.com 也已經無法訪問. 因為有海思 Hi3798 系列內核的SDK和刷機工具, 使得這個盒子可以註入新的靈魂, 發揮餘熱, 物盡其用.
本文的內容, 大量參考自以下鏈接
- 帶圖說明 https://www.wdmomo.fun:81/doc/index.html?file=003_各類礦渣/013_恩兔NS-1
- 刷機說明 https://github.com/xiayang0521/n2ns-1/
- HiNAS https://www.ecoo.top/hitool.html
實物圖
包裝
正面
正面是一個帶指示燈的按鈕, 和三個指示燈. 這四個指示燈都是紅綠雙色, 可以用紅綠橙三色顯示狀態
背面
背麵包含一個用於供電的 USB Type-C 口, 一個 HDMI 口, 一個千兆網口, 一個USB口和一個SD Card卡槽.
內部
螺絲在包裝的塑料袋裡, 盒子預設沒上螺絲, 用指甲沿兩邊可以輕鬆撬開. 內部可以看到一個標準的2.5寸SATA盤位. 這個高度可以放7mm和9mm厚度的硬碟, 不確定是否能放更厚的15mm厚盤.
PCB特寫
正面和背面
TTL 介面
硬體配置
Part | Specs | Notes |
---|---|---|
CPU | Hi3798MV200 | 四核A53, T450 GPU, 詳細型號為 Hi3798MRBCV2010D000 詳細信息 |
RAM | DDR4 1GB | K4A4G165WE-BCRC * 2, 單顆256M 16b, 最高支持ddr2400 |
Flash | eMMC 4GB | 東芝THGBMDG5D1LBAIT |
Ethernet | 10/100/1000M * 1 | Realtek RTL8211 |
USB 2.0 | USB 2.0 * 1 | |
HDMI | HDMI 2.0 * 1 | |
HDD | SATA 3.0 * 1 | 2.5 Inch |
Power Supply | DC 5V 2A | USB-TypeC |
Other Interfaces | SD Card Reader * 1 |
刷機前的準備工作
硬體部分
- 一臺正常工作的, 運行Win10的電腦
- 網線, 用於連接 N2NS1 到交換機或路由器
- 用於USB轉串口, USB2TTL的串口模塊, 常見的 CH340 模塊即可
軟體部分
軟體部分主要是刷機工具和固件
刷機工具
刷機工具是基於 Eclipse 框架開發的, Windows版下載地址列表
- https://oss.histb.com/HiTool-windows.7z
- http://xz.w10a.com/small/HiTool.7z
- https://dl.ecoo.top/HiTool-soft/HiTool-windows.7z
- https://www.xitongzhijia.net/soft/211748.html
- http://www.hihope.org/en/download/download.aspx?mtt=36 需要註冊
Linux的版本比較舊, 未嘗試使用
固件
常見固件的下載
- HiNAS https://dl.ecoo.top/
這是一個功能比較完整的集成系統, 內核4.4.35, 選擇恩兔N2 NS1定製的 TTL-hi3798mv200-202307-64-n2ns1.zip - Debian https://pan.baidu.com/s/1Dx58Zc43P3b3cx3tnhLlmw?pwd=9qte
這是我基於4.4.35內核做的Debian10系統, 比較乾凈的版本, 未安裝各種服務軟體 - 合集 https://github.com/xiayang0521/n2ns-1/releases
這裡包含了稍息版的 Debian 10, 以及 Centos7 等系統的固件
備份和刷機
海思燒錄的基本原理(摘抄自幫助手冊)
HiBurn工具在開始燒寫後,
- 首先與bootrom進行交互, 工具將 DDR 參數傳送到傳到bootrom, 即為uboot下載階段5%處, 然後初始化DDR
- 把uboot傳輸到DDR中, uboot下載階段100%處表示傳輸完畢
- 從DDR啟動uboot
- uboot啟動完成後, 工具開始與uboot進行交互, 發送燒寫命令, 將DDR中的uboot燒寫到Flash對應地址中
uboot部分是通過TTL傳輸, 其他鏡像分區燒寫, 如kernel, rootfs等分區, 工具預設採用網口傳輸的方式, 客戶可選擇裸燒和非裸燒兩種方式進行燒寫
- 裸燒即為在按分區燒寫或按Emmc燒寫中勾選uboot進行燒寫,此時uboot會被燒寫到Flash中
- 非裸燒即為不勾選uboot, 僅勾選其他分區進行燒寫, 此時需要保證當前單板上已經存在uboot, 燒寫時工具會啟動uboot, 與其交互, 通過向uboot發送TFTP命令與Write命令, 完成燒寫.
準備工作
準備 TTL2USB, 排針和網線, 主板上的四孔介面為 TTL, 介面定義參考前面的圖.
方孔為VCC不連接, 工作時測得電壓為3.3V, 因此切勿用5V的電壓連接, 平時最好不連接. USB轉串口模塊連接電腦和盒子, USB轉串口模塊的 RX 接盒子的 TX, TX 接盒子的 RX.
本機(上位機)打開 HiTool, 晶元選擇 Hi3798MV200, 點擊運行 HiBurn, 點擊刷新, 本機會自動識別IP和存在的串口, 將串口修改為USB2TTL所在的串口, 盒子(下位機)的IP和本機IP要在同一網段, 例如本機為 192.168.9.123, 板子的IP就可以設為 192.168.9.100, 不要和網段中其它機器衝突即可. 傳輸方式選擇網口.
MAC 地址可以自行設置, 軟體將根據設置在刷機過程中使用該 MAC 地址作為板端 MAC
備份
準備分區表
盒子先上電啟動一次, 通過串口 TTL 軟體看啟動日誌, 或者在命令行中查看dmesg, 可以得到當前的分區信息, 其格式為
blkdevparts=mmcblk0:2M(fastboot),1M(bootargs),4M(deviceinfo),6M(stbinfo),8M(baseparam),20M(logo),8M(pqparam),40M(private),10M(privatebak),80M(factory),40M(trustedcore_linux),80M(kernel0),80M(kernel1),150M(root0),150M(root1),300M(roothome),-(userdata)
根據上述信息在分區部分逐個添加分區, 最後選擇保存分區表.
除了大小, 分區類型在首次備份可以全部選擇 none, 也就是以 raw 方式備份, 備份完成後用 binwalk 等工具測試分區到底是 raw 還是 ext4, squash. 除了 roothome 和 userdata, 其它全是raw, 也就是none. 都使用raw類型對備份無影響.
執行備份
分區表選擇剛纔設置保存的路徑, 然後逐個選擇文件路徑(備份的目標文件名, 主機上目前沒有)
programmer 文件為刷機模式使用的臨時 fastboot, 可以從別的固件提取, 也可以通過 TFTP 手動備份, 如果留空則使用 eMMC 內置的, 這種情況要求 eMMC 中有 UBOOT, 否則備份失敗.
選擇上傳, 按照提示給盒子上電, 備份需要大約20分鐘.
刷機
準備分區表和刷機文件
- 解壓需要刷機的固件
- 運行 HiTool, 在啟動對話框選擇正確的晶元型號, 選擇預設的按分區燒錄
- 在 partition file 那一行點擊瀏覽, 選擇對應的分區表文件. 此時 HiTool 會顯示定義好的分區列表, 對應的大小和文件
- 在列表中, 勾選的部分是會被執行操作的, 要備份/擦寫/寫入哪個部分, 就勾上哪個部分
這裡以 Debian 固件下載鏈接 為例進行說明, 其分區表文件為 partition_debian.xml, 對應的六個分區分別是
- fastboot(UBOOT)
- bootargs(啟動參數)
- stock_kernel(recovery內核, 小內核)
- stock_squash(recovery系統, 小系統)
- kernel(64位目標內核)
- rootfs(64位目標系統)
通過 HiTool 寫入
點擊燒寫/Burn按鈕後, 根據日誌視窗提示斷電然後上電, 工具會檢測到盒子狀態, 自動開始燒錄
日誌視窗會顯示進度, 等待燒寫完畢後會自動reset, 時間大概需要五六分鐘
Debian系統的使用
- 通過TTL終端軟體在串口可以直接登錄, 也可以在路由器中查到盒子的IP後, 通過SSH登錄.
- 預設用戶為 root / root
- 剛刷完的根目錄所在分區, 可用空間為0, 登錄後執行 local-resize.sh 對分區進行擴容.
通過 Recovery 模式恢復或刷機
在固件的6個分區中, stock_kernel 和 stock_squash 組成了一套可以獨立運行的 recovery 系統, 如果要讓盒子啟動進入 recovery 系統, 只需要修改 bootargs 分區.
在 HiTool 中僅勾選 bootargs, 將對應的文件改為 bootargs_stock 進行燒錄, 重啟後就會通過 stock_kernel / stock_squash 啟動, 進入 recovery 命令行
進入 recovery 命令行, 登錄用戶 root, 密碼為空
- 選項一: 機器連接串口, 通過串口操作
- 選項二: 機器連接網線, 在路由器找到設備IP, telnet連接
以稍息版的 Debian 刷機包為例說明如何寫入系統.
-
將 stretch.tar.bz2 和 bootargs2 文件放入U盤根目錄, 插上盒子的USB口.
-
執行以下命令 開啟U盤供電
echo 33 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio33/direction
echo 1 > /sys/class/gpio/gpio33/value
命令行會輸出識別到的 usb storage 設備
# usb-storage 1-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 1-1:1.0
scsi 1:0:0:0: Direct-Access Generic Flash Disk 8.07 PQ: 0 ANSI: 4
sd 1:0:0:0: [sda] 15974400 512-byte logical blocks: (8.18 GB/7.62 GiB)
sd 1:0:0:0: [sda] Write Protect is off
sd 1:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA sda:
sd 1:0:0:0: [sda] Attached SCSI removable disk
udisk1110 -> /dev/sda
-
用 blkid 能看到U盤對應的分區, 根據U盤分區方式的不同可能是 /dev/sda 也可能是 /dev/sda1
-
掛載U盤到 /mnt/usb1
mount /dev/sda /mnt/usb1
# 或者
mount /dev/sda1 /mnt/usb1
這時候ls /mnt/usb1
要能看到 stretch.tar.bz2 和 bootargs2 這兩個文件
- /dev/mmcblk0p6 是用於放置新系統的目標分區, 先格式化
mkfs.ext4 /dev/mmcblk0p6
然後掛載到 /tmp/mmc, 如果提示couldn't mount as ext3 due to feature incompatibilities
, 可以忽略
mkdir /tmp/mmc
mount /dev/mmcblk0p6 /tmp/mmc
- 解壓 Debian 到 /tmp/mmc, 如果要看詳細輸出, 加上 v 參數
tar xjpf /mnt/usb1/stretch.tar.bz2 -C /tmp/mmc
註意結束時的輸出, 如果最後提示一個 magic 寫入錯誤, 可以忽略, 如果是顯示其它類型的錯誤, 要檢查一下, 是否U盤文件損壞
- 用 bootargs2 覆蓋當前的 bootargs
dd if=/mnt/usb1/bootargs2 of=/dev/mmcblk0p2
這一步用於改變啟動參數, 重啟後將從 /dev/mmcblk0p5 (64bit kernel) 啟動.
附錄
GPIO 操作
通過GPIO操作LED
# 打開
echo 255 > /sys/class/leds/green:fn/brightness
# 關閉
echo 0 > /sys/class/leds/green:fn/brightness
觸發, 如閃爍、管理mmc讀寫等. 通過cat命令可以看到 LED 支持的觸發方式, 通過echo回寫相應的字元串可以實現 LED 的自動觸發, 如heartbeat代表閃爍, mmc0 代表 mmc0 的讀寫觸發 LED 等等
env 記錄
正常啟動的 bootargs 參數
root@n2ns1:~# fw_printenv
bootdelay=1
baudrate=115200
bootfile="uImage"
ethaddr=C6:04:53:66:0E:36
filesize=3702000
fileaddr=1000000
netmask=255.255.255.0
ipaddr=192.168.1.10
serverip=192.168.1.254
bootargs_stock=mem=1G mmz=ddr,0,0,60M vmalloc=500M console=ttyAMA0,115200 initrd=0x11000000,0x4600000 root=/dev/ram blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(stock_kernel),60M(stock_squash),32M(kernel),-(rootfs)
bootargs_debian=mem=1G mmz=ddr,0,0,120M console=ttyAMA0,115200 root=/dev/mmcblk0p6 rw blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(stock_kernel),60M(stock_squash),32M(kernel),-(rootfs)
bootargs_512M=mem=512M mmz=ddr,0,0,256M
bootargs_1G=mem=1G mmz=ddr,0,0,380M
bootargs_2G=mem=2G mmz=ddr,0,0,600M
ethact=up
bootcmd_debian=mmc read 0 0x10000000 0x24000 0x10000;setenv bootargs ${bootargs_debian};bootm 0x10000000
bootcmd_stock=mmc read 0 0x10000000 0x1000 0x5000;mmc read 0 0x11000000 0x6000 0x1e000;setenv bootargs ${bootargs_stock};bootm 10000000
stdin=serial
stdout=serial
stderr=serial
ver=Fastboot 3.3.0 (htpc@htpc4105) (Dec 17 2021 - 11:19:34)
bootcmd=mmc read 0 0x10000000 0x24000 0x10000;setenv bootargs ${bootargs_debian};bootm 0x10000000
recovery 環境的 env 帶引導的命令和內核參數
# printenv
USER=root
LD_LIBRARY_PATH=/lib:/usr/local/lib:/usr/lib:/usr/share/bluetooth/lib:/hybroad/lib
SHLVL=1
TERMINFO=/usr/share/terminfo
HOME=/root
LOGNAME=root
TERM=vt100
PATH=/hybroad/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
SHELL=/bin/sh
PWD=/root