安装教程 —— 把魔百和 M301H 变成「下载机 + NAS」

OpenHW Lab · 智能硬件开放实验室 · 面向普通用户 / 开发者。约 40–60 分钟。
适用机型:魔百和 M301H(创维 CW 版,型号 M301H_CW0_AH,主控海思 Hi3798MV300 / armv7 / Android 4.4.2)。
本项目在该机型上实测通过。

0. 你需要

总思路:盒子里 chroot 一个 Ubuntu 20.04(armhf) 子系统(/data/linux),里面装
aria2(下载)+ Samba(网盘)+ minidlna(DLNA)+ 网页面板 nasd(:8080);
盒子屏幕装一个「下载机·NAS」全屏网页壳;开机自动拉起全部服务。

1. 认清你的盒子

getprop ro.product.model              # M301H_CW0_AH
getprop ro.product.cpu.abi            # armeabi-v7a (armv7)
getprop ro.build.version.release; getprop ro.build.version.sdk   # 4.4.2 / 19
df -k
本盒子是 海思 Hi3798MV300(armv7),要装 armhf 的 Ubuntu。

2. 打开控制通道(TTL 串口 / ADB)

```sh

setprop service.adb.tcp.port 5555

start adbd

```

电脑 adb connect <盒子IP>:5555。

> ⚠️ start 是 /system/bin/start;脚本里用绝对路径。开机早期 start adbd 可能失败 → 我们脚本里重试 8 次。


3. 搭 Linux 子系统(CUPS 跑在里面 → 本机是下载服务)

在盒子 root 里,把 Ubuntu 20.04 armhf 根文件系统放到 /data/linux:

# 电脑上下好 ubuntu-base-20.04.5-base-armhf.tar.gz 推到盒子:
adb push ubuntu-base-20.04.5-base-armhf.tar.gz /data/local/tmp/ubuntu20.tar.gz
# 盒子上解包:
mkdir -p /data/linux
busybox tar -xzf /data/local/tmp/ubuntu20.tar.gz -C /data/linux
# 补挂内核文件系统:
busybox mount -t proc  proc  /data/linux/proc
busybox mount -t sysfs sysfs /data/linux/sys
busybox mount -o bind /dev   /data/linux/dev
busybox mount -t devpts devpts /data/linux/dev/pts
✅ 本机 (Hi3798MV300) 的 chroot 里 apt 可用 → 依赖直接联网装。

配 DNS + 源(/data/linux/etc/resolv.conf + sources.list 用 tuna focal)+ policy-rc.d(阻止 postinst 起服务)。

⚠️ 安卓自带 shell 没有 printf/timeout;busybox 无 cp -n。

进 chroot 跑命令的 helper(/data/local/tmp/cr.sh):

#!/system/bin/sh
exec /system/bin/busybox chroot /data/linux /usr/bin/env -i \
  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOME=/root LANG=C.UTF-8 \
  /bin/bash -lc "$*"

4. 装依赖

sh /data/local/tmp/cr.sh "apt-get update"
sh /data/local/tmp/cr.sh "apt-get install -y --no-install-recommends \
  aria2 samba samba-common-bin minidlna qrencode python3 \
  ntfs-3g exfat-fuse exfat-utils dosfstools ca-certificates"

5. 部署服务

adb push install/下载服务.py   /data/linux/root/nasd.py
adb push install/aria2.conf   /data/linux/root/aria2.conf
adb push install/smb.conf     /data/linux/root/smb.conf
adb push install/diskwatch.sh /data/linux/root/diskwatch.sh
adb push install/3-开机自启.sh /data/linux/root/nasstart.sh
adb shell 'chmod 755 /data/linux/root/nasstart.sh /data/linux/root/diskwatch.sh'

起服务:

sh /data/local/tmp/cr.sh "bash /root/nasstart.sh"    # aria2 + smbd + nmbd + nasd + diskwatch
⭐ 存储自动切换:diskwatch.sh 每 10 秒巡检——插了外接盘就把下载/网盘切到 <盘>/nas(bind 到 /root/nas),拔盘自动回内部存储。面板会显示「当前存储:内部存储 / 外接盘 <路径>」。

6. 开机自启(M301H 专属做法 + 大坑)

本 ROM 的 init.bigfish.rc 有 service bigfish-setup /system/etc/init.bigfish.sh(on boot)。

所以钩子必须插在脚本"最前面"(busybox date 之后),放末尾永远执行不到!

adb push install/4-开机兜底.sh /data/nasstart.sh
adb shell 'chmod 755 /data/nasstart.sh'
adb shell 'mount -o remount,rw /system'
adb shell 'busybox cp /system/etc/init.bigfish.sh /system/etc/init.bigfish.sh.bak-orig'
# 把钩子插到文件头部(第 2 行后)
printf '#!/system/bin/sh\nbusybox date -s 201501010000.00\n' > /data/ib.new
cat /data/local/tmp/开机钩子.txt >> /data/ib.new
busybox tail -n +3 /system/etc/init.bigfish.sh >> /data/ib.new
cat /data/ib.new > /system/etc/init.bigfish.sh
钩子内容(install/开机钩子.txt):
```sh
### OpenHW Lab downloader+NAS (M301H) ###
if [ -f /data/nasstart.sh ]; then
/system/bin/busybox setsid /system/bin/sh /data/nasstart.sh >/data/nas-boot.log 2>&1 &
fi
```

/data/nasstart.sh:起 adbd(重试)→ 挂 proc/sys/dev → chroot /root/nasstart.sh → 延时起面板桌面。


7. 装面板桌面(开机显示)

adb push install/桌面.apk /data/local/tmp/nas.apk
adb shell 'pm install -r /data/local/tmp/nas.apk'
adb shell 'am start -n com.openhardwarelab.desktop/.MainActivity'   # 先启动一次(清 stopped 标志)
⚠️⭐ 不能设为默认 HOME:该 ROM 有 ellison. block home apk(硬编码只允许内置 IPTV 桌面当 HOME,连 /system/app 系统应用也拦)。
→ 由开机脚本 am start 把面板拉到前台(效果一样,按 Home 会回 IPTV 桌面)。

完成!日常怎么用


常见问题


—— OpenHW Lab · 智能硬件开放实验室 · hi@openhwlab.com