香橙派 Pi Zero 上的容器操作系统 BalenaOS

香橙派是深圳迅龙公司的产品。该公司旗下有不同种类的基于 AllWinner 芯片的不同的 Pi. Pi Zero 只是其中一个比较低端的产品,H2(ARM Cortex-A7 Quad-core) 的CPU,512M 内存,1x 100M 网口, Wi-Fi 模块, OTG 电源 + 1x USB 2.0 ,最大 32GB TF 卡。当然操作系统要灌在 TF 卡上。

去 balenaCloud 注册一个账号以后,添加设备,选择香橙派 Pi Zero,下载 img,烧写到 TF 卡上,插入到香橙派,上电,插网线,它会自动 DHCP 从网络里取到 IP 地址,然后,过了很长很长时间(1天,2天?)后,在 balena 的云端可以看到“Online”,之前一直 Inactive,不理解是网络那里有问题。

Balena 在他们家网站介绍就是一堆构建,部署,管理 Linux 设备的工具集。下面的这个图基本上能概括他们家的产品列表。这是一家初创公司,看上去充满了很多创新的元素。

部署的前面10个设备是免费的,20个以内每个月 99 美元!50个设备,每个月 299 美元,100 个设备的话要 1299 美元,企业级支持是每月 2999 美元!

先看下,我们已经上线的香橙派吧:

让我们通过命令行进入香橙派看看里面到底是什么东西。我们用 balena scan 看下局域网内的设备:

我们用 balena ssh IP地址,就可以进入香橙派了。 使用 lsof -Pi 命令,我们就可以查看设备侦听的所有网络口:

看下板子的信息:

不需要重建分区的SD 卡分区扩容方案

OpenWrt 等一些操作系统刷完 img 到 SD 卡后, 16G 的 SD 卡,只用了一点点,经常需要“扩容”。之前的做法比较傻,就是重建分区,每次还要敲很多命令,还要把删除分区的起始扇区记录下来。

现在有了这段简单的代码,三行核心的代码就把这个工作自动化了,无需关心 SD 卡容量是 8G 还是 16G 还是更多,反正既然烧了,就是整张卡都是用在操作系统上了。

代码里的 DISK 就是类似 /dev/sdb 这样的, PART 就是分区 /dev/sdb2 这样的。 这里默认是第二分区。分区文件系统格式默认是 ext2/3/4 而不是其他。

burn () {
        fdisk -l ${DISK}>> /dev/null 2>&1 || (echo "could not find device $DISK - please check the name" && exit 1)
        # 烧写
        dd if=$IMG of=${DISK} bs=4M
        [ $? != 0 ] && echo "烧写出错了!" && exit 10
        MAXSIZEMB=$(printf %s\\n 'unit MB print list' | parted | grep "Disk ${DISK}" | cut -d' ' -f3 | tr -d MB)
        echo "[ok] ${PART} Will change to ${MAXSIZEMB} MB "
        parted ${DISK} resizepart 2 ${MAXSIZEMB}
        [ $? != 0 ] && echo "扩展分区出错了!" && exit 2
        e2fsck -y ${PART}
        resize2fs ${PART}
        [ $? = 0 ] && echo "文件系统扩展成功"
}

刷机愉快!

斐讯 K2 的不死鸟刷机-科学上网和广告屏蔽

无线路由器刷机的核心需求是科学上网和广告屏蔽,同时一定是为局域网内,整个家庭或者小型办公室使用。我们用 SS-libev + polipo + wpad 的方案实现了客户端的无感“上网”

心急要吃热豆腐的,请直接拉到文章底部,看大总结

不死鸟指的是 Breed Boot-Loader 引导固件,和我们要刷机的操作系统固件不是同一个东西。本文假定你已经刷好了 Breed,就是下面的这个截屏。

假定你已经刷好了 Breed 不死鸟,然后你就可以无限制的刷各种操作系统,不喜欢老毛子就刷 OpenWrt/LEDE,也可以刷梅林。 系统启动不了,就换一个再刷。

刷操作系统的办法很简单,把 PC 电脑的网线直接连接 K2 的 LAN 口, K2 的 WAN 口连接到能上网的路由器的 LAN 口(也可以不连),PC 电脑的 Wi-Fi 连接能上网的 SID,如果 DHCP 有冲突的话(一般肯定会冲突,PC 的有线会拿到 192.168.1.2,无线会拿到 192.168.1.3),可以设置 Wi-Fi 为能上网的 VLAN 里的静态 IP,设置好网关和 DNS ,保证刷机中的电脑能同时上网。当然也要保证能上网的无线环境里使用的不是 192.168.1.x 的网段。

斐讯 K2 是 MT7620A 的 CPU,主频是 580MHz,内存是 64M,Flash (可以理解为是电子硬盘)只有 8M。也就是说,我们要把操作系统放到只有 8M 的 Flash 里。

现在是选择合适的操作系统,刷机了,点 “固件更新”,选择“固件”,从 PC 上选择固件的文件。


我们选择老毛子的固件: RT-AC54U-GPIO-1-PSG1218-64M_3.4.3.9-099.trx

刷新完成后,去 Windows 的网络,查看有线网卡拿到的 IP 地址,如果没有拿到,可以重新插拔网线或者重启 K2,如果还是没有拿到 IP 地址,那就重新刷(不用怕)。你总是可以拿到 192.168.1.2 的 IP 地址的。

譬如刷的时候选择了错误的 Flash 布局(应该选公版),刷完后,PC 报告网线没有连接,说明 K2 根本就没有启动,不用怕, 重新插入电源线的同时按住 reset 10秒左右放手,192.168.1.2 又回来了。

我们换一个官方的 OpenWrt Snapshot 版本刷一下,固件文件是 openwrt-ramips-mt7620-phicomm_psg1218a-squashfs-sysupgrade.bin

刷完后,因为我们刷的是 snapshot 版本,所以不带 web 界面,我们只能 ssh root@192.168.1.1 (没有密码),就可以进入 OpenWrt 的 console 了。 用 opkg 命令就可以安装 web 界面

OpenWrt Snapshot 版本 比较适合有一定 Linux 基础和网络基础的大咖玩,基本都是需要自己琢磨,自己定制,而且最坑的是 8M 的 Flash 实在太小,老毛子从内存里挖了空间给操作系统使用,把配置保存到NVRAM(掉电能保留),然后下次重启又从网上下载 /opt 下的内容,恢复配置,基本原理就是这样,都是为了解决只有 8M 的痛苦。

在详细阐述老毛子 Padavan 之前,我们刷一个梅林,其实是华硕的一个自定义版本,看下界面。 固件文件名:RT-ACK1_K2_3.0.0.4_380_8228-g3af35f9.trx,大小 6.18M

刷完梅林,PC 拿到的地址是 192.168.1.112,网关还是 192.168.1.1,我们在浏览器输入 http://192.168.1.1/ 就看到梅林的界面了:

如果这个时候 WAN 口连接了能上网的路由器的 LAN 口, K2 就能自动上网了, 连接在 K2 LAN口的 PC 自然也能通过有线上网了, 配置好密码和无线后,会自动检测到有新的固件,然后选择自动升级固件。也就是说 K2 是和华硕的 AC54U 是完全兼容的。

梅林的这个固件连 telnet 设置允许也报错,界面也没有 ssh 登录的设置,其实和普通的路由器没啥区别,不建议刷。

回头再说老毛子,刷完老毛子后,有线网卡拿到的是 192.168.123.x 的地址,网关是 192.168.123.1 ,在浏览器输入 192.168.123.1 ,弹出窗口输入用户名和密码都是 admin

真心讲,里面设置 SS 的界面太复杂。

由于我们的境外服务器开启了 kcptun,所以尝试把里面的 kcptun 打开,然后 SS 走 kcptun,发现小小的 64M 内存根本就不够用,就连 nslookup 也返回一些莫名其妙的地址。

可以说, 整体的老毛子固件在 K2 这台小机器上捉襟见肘,根本就无法有效的开启里面的诸多功能,特别是核心的 SS 功能(带 KCPTUN)。

在开启 Adguard Home 做广告屏蔽的时候,如果是 nslookup 一个屏蔽的域名, DNS 查询极其缓慢。 我们回头在 x86_64 的 Ubuntu 虚拟机平台上来评估 Adguard Home。 现在让我们把 K2 切换到一个旧的OpenWrt 固件,也就是刷机自带 Web 界面的固件。

我们去 OpenWrt 的硬件下载列表,搜索 PHICOMM ,K2 PSG1218 就是我们要找的,写稿时的最新版本是 18.06.5 。刷完以后,浏览器访问 192.168.1.1 ,用户名 root ,密码为空, 也可以命令行直接 ssh root@192.168.1.1 登录 OpenWrt 。

Web 界面是这样子的:

和老毛子不同,这里有另外一个坑就是根文件系统只有 3.8M 空余了,几乎不能安装什么大的软件包了。 如果要安装广告屏蔽,要安装 VPN ,要安装科学上网,几乎是不可能的事情。

但是,中文界面总是需要安装的,运行:# opkg update; opkg install luci-i18n-base-zh-cn,刷新 Web 界面,我们就看到中文了。如果还没有的话,去顶上 System 菜单,下拉,选择 System,选择 Languange ,看看是否有中文。

搞完了以上的事情, 只是一个基本的无线路由器的设置,和上面提到的梅林以及其他任何不能刷机的路由器买来的功能是差不多的。只不过多了能直接 ssh 进入操作系统修改。

最核心的就是要科学上网,本身就要好多种不同的技术,从最原始的 SS 版本, 到国人后来开发的 SSR (加了混淆),到一个 SS-libev(适合嵌入式,例如路由器)的版本,到后来 KCPTUN 底层 UDP 协议加速,到其他各种加速方案,到后来V2RAY 用 vmess 协议。但是盒子太小,各种进阶方案对内存的要求太大。

让我们先从相对比较小占用资源的 libev-local 开始,运行
# opkg install shadowsocks-libev-ss-local luci-app-shadowsocks-libev

安装完以上两个软件包后,我们还有 2.9M 的磁盘空间,刷新Web 页面,可以看到多出一个服务菜单,下拉以后可以看到 SS-libev 的配置。我们只安装了 ss-local,因此,我们就去配置 ss-local 这部分,先去 Remote Servers 添加墙外的服务器信息(墙外怎么搭 SS-libev 服务器就不展开了),千万不要忘记把那个“禁用”的勾去掉。保存并应用后去修改 “Local Instances”,其实啥也不用做,因为直接选默认就可以,也就是侦听在所有网口上的 1080 socks5 标准端口。启用这个 ‘local instance’。进入 Firefox 浏览器,选择 socks5 代理,配置 192.168.1.1 1080 端口,如果能访问 Google , 那就是科学上网成功了。 这个无线路由器后面的任意设备,只要设置好 socks5 代理服务就可以上网了。


以上介绍的是 SS-libev。 我们尝试一下 V2ray 。Github 上把这个 12M 的“大家伙” 下载到 PC 端,然后从 OpenWrt 上把文件 scp 到 /tmp 下, 尝试用 opkg install v2ray-core_4.21.3-1_mipsel_24kc.ipk , 显然由于根文件系统只剩余 2M,根本就是徒增烦恼!

接下来我们尝试安装 kcptun 的客户端,去 github 下载 mipsel_24kc 版本,2.39M,看上去还能放到我们的 Flash 里,但是安装到一半还是说磁盘空间不够啊!

接下来,我们尝试用ram-root 的一个工具,利用 NFS 服务器来扩充根文件系统
# opkg install kmod-fs-nfs kmod-fs-nfs-v4
配置好 /etc/ram-root/ram-root.cfg 里面的 NFS Server 信息

可以看到根文件系统有 10M 了, 我们就可以安装 kcptun 了。安装结束我们发现根文件系统使用了 6.8M,很明显这么大的一个东东是不可能全部放到 8M 的 Flash 里的。 因为在家庭环境里, 我们不可能去挂接一个 NFS 哪怕 CIFS 上一个 Windows Share 都不太可能,这就是为什么老毛子采用了 optware,从内存里挖出空间给 root,然后每次启动都要从网上重新下载一堆软件。

为了简化客户端需要设置 socks5 的步骤,我们安装一下 polipo 这个 socks5 转 http 的代理软件:
# opkg install polipo luci-app-polipo luci-i18n-polipo-zh-cn
刷新 K2 的 Web 界面,我们可以在服务下看到 polipo 的配置,配置上游服务器为 127.0.0.1:1080 保存并应用,我们去 Firefox 设置 http 代理为 192.168.1.1 8123 去掉原先设置的 SOCKS 代理配置

Polipo 的 Web 界面设置实际上是有问题的,我们需要手工做几步动作,上游服务器的配置是 socksParentProxy 和 socksProxyType,这个需要用 uci 命令或者直接编辑 /etc/config/polipo 配置文件解决。底下大总结里详细介绍。

然后打开 http 代理, 不能解决 DNS 解析被墙的服务器的问题,因此我们需要安装 DNS 加密服务:
# opkg install libustream-openssl dnscrypt-proxy luci-app-dnscrypt-proxy
安装完毕后,会自动配置 dnsmasq , 转发到 5353 端口。
这一步很关键,如果这一步搞错了, 会导致 K2 无法连接网络,因为 DNS 解析出错了, 其实你也可以手工修改 /etc/resolv.conf 文件, 把 nameserver 从 127.0.0.1 修改为譬如 114.114.114.114 即可恢复网络,后面重启路由, nameserver 会自动更新成 127.0.0.1 的。

我们去”系统”=》“启动项”把 dnsmasq 重启一下。

接下来我们添加一个 wpad ,就是 Web Proxy Auto Discovery,我们需要添加一条wpad 的主机名记录,指向 路由器的 LAN 地址,就是 192.168.1.1 ,然后把外部生成的一个 wpad.dat 文件拷贝到 /www 目录下,然后去 Firefox 或者 IE ,或者手机端 Wi-Fi 连接后,把代理修改成自动发现即可。

IE/Chrome 的配置:由于 uhttpd 不支持 mime type 的问题,这里的“自动检测设置”截屏是错的,在 K2 上无法使用。要使用下面的这个正确的截屏。

左侧为错误的截屏,正确的设置是下图

iPhone Wi-Fi 的配置:点击连接上的 Wi-Fi 的右边 i 那个标记,进入详情,拉到最底下,点击进入配置代理,把“关闭”,设置成“自动”,然后返回就可以。截图里的 IP 不是本演示的 IP ,请忽略。同样的因为 K2 上 uhttpd 原因,iOS 上配置自动代理,还需要输入 wpad.dat 文件的 URL.

那么这个 wpad.dat 文件怎么生成呢? 网络上有一个 Python 写的 genpac 的脚本,会自动下载 gfwlist ,然后生成符合要求的 proxy 代理 js 脚本。语法如下:
# genpac –pac-proxy ‘PROXY 192.168.1.1:8123; HTTPS 192.168.1.1:8123; SOCKS5 192.168.1.1:1080’ -o wpad.dat

其实 DNSCrypt-proxy 还有黑名单功能,能过滤广告和恶意网站。上面列出的一个专门为中国用户的项目比较好。运行其中的 .sh 脚本就能自动生成配置文件。

通过以上步骤,我们就把一台只有 8M Flash 的斐讯 K2 刷机成为具有科学上网,广告过滤核心功能的强大路由设备。

大总结

K2 甚至包括所有市面上 1000 元以下的无线路由器,基本只能涵盖50人以下的使用,K2 的能力不会超过 20人同时使用。所以基本上我们介绍的解决方案仅仅用于家庭和小企业的上网使用。对于几十人甚至上百人的企业的上网需求,我们可以采用高可靠的免费集群解决方案,把路由和代理等功能,可以通过 OpenWrt 或者 Ubuntu 或者其他 Linux/BSD 兼容的操作系统,为企业员工提供强大的,安全的,可靠的,带有广告稿屏蔽功能的网络连接,让企业员工专心工作,不为广告所打扰。

以上的步骤其实有点繁琐,还介绍了其他和 OpenWrt 不相关的一些内容。我们写了一个简单的部署脚本放到了github,希望能帮助到您。

上面提到的 polipo 的上游 socks5 服务器的配置,需要用 uci 命令来完成,我们都已经写在脚本里了。脚本本身都有比较详细的注释,刷机愉快!

后记:一些技术性的 Troubleshooting 的技巧。盒子上的工具都比较弱,不像 X86 的机器上,可以安装很强大的工具,但是一些基本的命令,我们还是需要了解的。

  • nslookup 是一个改装版,只有 nslookup 主机名 这个语法,用来检查盒子是否能解析域名
  • ps 最应该需要知道的查看进程的东东,不需要加任何参数就可以,其实 Web 端也可以看所有进程列表。dropbear 就是 sshd , odhcpd 就是搞 DHCP 的, uhttpd 就是 Web 界面, udhcpc 是盒子本身作为 DHCP 客户端,例如 PPPOE 拨号从ISP 处取地址, ntpd 是时间服务,就是对时间的, polipo 就是 http 代理, dnscrypt-proxy 就是 DNS加密的, dnsmasq 是最核心的做 DNS 解析的服务,并对 LAN 提供 DHCP 服务, ss-local 就是科学上网的进程,对 LAN 提供 SOCKS5 服务。
  • netstat -nlp 这个就是查看端口侦听情况的, 53 端口就是 dnsmasq , 5353 端口就是 dnscrypt-proxy 启动的, 8123 端口就是 polipo , 1080 端口就是科学上网

浏览器调试一定要使用 Firefox,可以先从 socks5 手工代理,看看 192.168.1.1 1080 时是否可以 Google,如果可以,说明科学上网已经成功,再配置自动代理,设置 URL, http://192.168.1.1/wpad.dat 看是否可以,如果可以,那就是成功了!

其他可能的错误就是 IPv6 的问题, 把客户端和网关上的 IPv6 都关闭看看。

OpenWrt 树莓派 根文件系统大小的调整

在一台 Linux 机器上,当我们用 dd 命令把 OpenWrt 的操作系统 img 映像文件写入到 Micro SD 卡的时候,根文件系统默认只有 104M。

在系统还没有进一步更新之前(SD 卡还插在 Linux 机器上),我们实际上应该先扩充根文件系统,否则后面也要走这一步的。 设SD 卡盘号为【/dev/sdb】

删除第二个分区,重新建一个第二分区,设置起始扇区为原先的扇区号,结束为默认。

新建完以后:

然后运行 resize2fs /dev/sdb2 就可以。
挂接后确认文件系统已经是 15GB:
# mount /dev/sdb2 /mnt
# df -h /mnt

把 SD 卡插回树莓派,启动验证。

树莓派 4B + OpenWrt

先看 OpenWrt 官方关于树莓派的文档。 知道 4B 是 BCM2711的 family,去对应的下载目录就能找到对应的镜像。 下载 gz 文件到 Linux 上, gunzip, 用 fdisk -l 找到插入的要烧写的 SD卡 的盘号。然后

# dd if=openwrt-brcm2708-bcm2711-rpi-4-ext4-sysupgrade.img of=/dev/sdb bs=2M conv=fsync
记录了88+0 的读入
记录了88+0 的写出
184549376 bytes (185 MB, 176 MiB) copied, 8.47041 s, 21.8 MB/s

把 SD卡插入树莓派上启动, 插入网线,看到网口绿灯闪烁,就是有线已经连接上了。

烧写完毕的 OpenWrt 默认的 IP 地址是 192.168.1.1,有两种更改 IP 的办法。
一种就是前面的步骤中,烧写完毕后, mount /dev/sdb2 /mnt
然后修改 /etc/config/network 文件, 把里面的 IP 地址修改掉就可以。
(在系统没有第一次启动之前是没有这个 network 文件的)
另外一种,就是等默认系统启动后,把自己的 PC 设置一个静态的 192.168.1.x 的地址,直接 ssh root@192.168.1.1,然后 uci show network 看下。
然后 uci set network.lan.ipaddr=’192.168.x.y’; uci commit 就可以了。
然后把 PC 修改回 DHCP 方式,用修改好的 IP 重新 ssh 就可以进入 4B 了。

这个时候操作系统上啥也没有,只有命令行界面。 我们先 route add default gw 192.168.x.1 把网关加上, 修改 /etc/resolv.conf 把 dns 服务指定好。 这样 nslookup baidu.com 看看是否能解析, 如果可以,恭喜!我们接下来就可以 opkg update ,开始安装软件了!

# opkg install lsof curl coreutils proxychains-ng vim bash uhttpd luci procps-ng-ps procps-ng-w bind-tools bind-host fdisk block-mount haveged libustream-openssl file unzip netcat

为了一些简单的开发工具下载,我们需要:
# opkg install git make

安装好以上基本包后,浏览器应该就可以登录了。 超级强大的 树莓派, 不能浪费啊!安装其他东东:(因为会自动安装相关的依赖包,我们就只写一个)

# opkg install luci-i18n-base-zh-cn luci-i18n-samba4-zh-cn

# opkg install luci-i18n-wireguard-zh-cn luci-i18n-cifsd-zh-cn luci-i18n-dnscrypt-proxy-zh-cn

树莓派的另外一种管理无线网络的办法

如果一个设备只能通过无线网络连接,真是蛮郁闷的,如果需要连接到不同的无线网络里去, 每次都要修改 SD 卡上的配置文件 /etc/wpa_supplicant/wpa_supplicant.conf
那不是郁闷死? 一种办法就是写一个自己手机的共享热点的 名称和密码, 记录下来。 下次万一需要设置树莓派, 把自己的手机名称和共享热点的密码修改一下,然后 PC 端也可以连接到手机的共享热点,这样,PC 端就能登录树莓派了。

话说 Mac 上如果要修改 SD 卡上的 Linux 分区还是真是不好办, 要安装一个什么 osxfuse 和 ext4fuse 的东东,Homebrew 又极其缓慢,最后还是用 VirtualBox 挂接的一个没有硬盘的只有的 CentOS7-Minimal ISO 启动到 Rescue 模式,挂接 U盘后解决的。 还有另外一个 USB OTG(On The Go) 的办法, 要去修改 /boot/cmdline.txt 如下:核心的就是在 rootwait 之后,添加了:
modules-load=dwc2,g_ether
还要确认 /boot/config.txt 包含:
dtoverlay=dwc2

重新启动后,可以看到树莓派上多出一块 usb0 的“网卡”,会提供 DHCP 给连接到上面的设备。我们的 Macbook 上网络设备会多出一个 RNDIS/Ethernet Gadget 的网卡,地址是 192.168.11.54,我们可以用 arp 或者 nmap 发现树莓派,这样就无需无线网络就可以登录树莓派了。

总结一下连接办法:一种是通过 Linux 虚拟机挂接 SD 卡修改无线配置文件,另外一种就是通过 USB 连接 data 端口,让 PC 设备成为 DHCP 客户端,还有一种就是把无线热点的配置固定写死到树莓派里。

老毛子 Padavan 固件 optware 以及固件的备份恢复等

关于无线路由器的刷机,看了很多文章, 万变不离其宗。从嵌入式系统的视角来零零碎碎的写一些东西,初学者不一定看得懂。

  1. U 盘挂载,是格式化一个 ext4 文件系统,然后建立一个 /opt 目录,老毛子会自动挂载 /opt ; mdev -s 查看
  2. 有了 /opt 以后, 运行 opkg.sh ; opkg.update , 系统就有巨大的容量了
    手工挂载: mount -o bind /media/AiDisk_a1/opt /opt
    从内存挂载: mount -t tmpfs -o size=10M tmpfs /opt/

固件的备份和恢复,这个适合 OpenWrt 不一定适合 老毛子

备份:
cat /proc/mtd
dd if=/dev/mtd0 of=/tmp/all.bin
cd /www
touch all.bin
mount --bind /tmp/all.bin /www/all.bin

wget http://192.168.2.1/all.bin

恢复 
cat /proc/mtd
mtd write /tmp/all.bin ALL
mtd write /tmp/eeprom.bin Factory
mtd write /tmp/fs.bin firmware

OpenWrt 的 extroot,扩容:
# opkg install block-mount fdisk
挂接好外部存储后:
# mount –bind / /tmp/cproot
# tar -C /tmp/cproot -cvf – . | tar -C /mnt/sda1 -xf –
# umount /tmp/cproot

修改自动挂接配置: /etc/config/fstab,把整个的根放到外部存储

config mount
        option target        /
        option device        /dev/sda1
        option fstype        ext3
        option options       rw,sync
        option enabled       1
        option enabled_fsck  0

关于透明代理,有人已经写了现成的脚本:
# opkg remove dnsmasq; opkg install dnsmasq-full; opkg install coreutils-base64 curl ca-certificates ca-bundle

# opkg install coreutils-base64 curl ca-certificates ca-bundle
# cd /tmp && opkg update && opkg install curl ca-bundle && curl -s -L https://github.com/ysy/ss/raw/master/openwrt_tproxy.tgz -ot.tgz && tar x -z -f t.tgz && cd openwrt_tproxy && ./setup.sh

optware 的 Pkg Source: http://pkg.entware.net/binaries/mipsel/
老毛的固件网站: https://opt.cn2qq.com/ 刷机后,默认会从这个网站下载很多应用和文件。
斐讯 K2 PSG1218 Rev. A 的 OpenWrt 官方固件: https://openwrt.org/toh/hwdata/phicomm/phicomm_k2_psg1218

AM335x Uboot 命令解析

有段时间没有动这个小盒子了, 为了避免忘记的尴尬,还是记录一下。

用 USB 转 串口的转换线, 把小盒子上 9pin 的引出线连接到 USB 上, putty 认为是 COM4,直接连接到 COM4,就可以看到 console 了。

按任意键可以进入 U-Boot 界面。 输入 env print 就可以看到所有的环境变量了。

首先要看的是 bootcmd 变量:
bootcmd=dcache on;icache on;run netboot

所以,我们知道, boot 执行的是netboot 这个变量指定的内容
然后我们来看 netboot 的值:
netboot=echo Booting from network …; tftp ${loadaddr} ${bootfile}; run netargs; bootm ${loadaddr}

所以,里面用了loadaddr , bootfile 这两个变量, 另外调用了 netargs 这个环境里的值。
loadaddr=0x80200000
bootfile=V6/uImage

我们再看下 netargs 的内容:
netargs=setenv bootargs console=${console} dispmode=${dispmode} root=/dev/nfs nfsroot=${serverip}:${rootpath},nolock,nfsvers=3 ip=dhcp


console=ttyO0,115200n8
dispmode=7inch_LCD
serverip=192.168.7.230
rootpath=/opt/NFSroot/rootfs

这样一看就一目了然,说明内核映像通过 tftp 得到,只要在局域网内设置一个 tftp 服务器(Boot Server),盒子会自动寻找 /tftp 下的 V6 目录下的 uImage 文件,加载内核映像。然后通过 NFS 查找 操作系统的根文件系统

下面介绍下 U-Boot 从 MMC (TF 卡)启动的命令:

前面讲的是 netboot 引导盒子,我们如果要从 TF 卡引导,只要把 bootcmd 里的 run netboot 修改为 run mmcboot 即可。
mmcboot=echo Booting from mmc …; run mmcargs; bootm ${kloadaddr}
不过,我们使用修改过的 yjboot:

yjboot=echo Young-Jack IoT Gateway booting …; run mmcargs; nand read ${loadaddr} ${nandsrcaddr} ${nandimgsize}; bootm ${loadaddr}

mmcargs=setenv bootargs console=${console} dispmode=${dispmode} root=${mmcroot} rootfstype=${mmcrootfstype} ip=none

mmcroot=/dev/mmcblk0p1 rw
mmcrootfstype=ext3 rootwait

我们也可以从 NAND 启动

nandboot=echo Booting from nand …; run nandargs; nand read ${loadaddr} ${nandsrcaddr} ${nandimgsize}; bootm ${loadaddr}

nandsrcaddr=0x280000
nandimgsize=0x500000

nandargs=setenv bootargs console=${console} dispmode=${dispmode} root=${nandroot} rootfstype=${nandrootfstype}

nandroot=ubi0:rootfs rw ubi.mtd=7,2048
nandrootfstype=ubifs rootwait=1

走 tftp 的时候会默认查看 serverip 这个变量, 我们设定新的
U-Boot# env set serverip 192.168.7.6
U-Boot# saveenv

然后U-Boot# 下敲入 tftp,就会自动向 tftp 服务器发送请求,读取 ${bootfile}

中间有个搞笑的环节是,一直和 tftp 服务器通信失败,后来发现是盒子有两个网口,插错地方了。 🙁
Ubuntu 1904 上安装 tftp server,非常方便, 就直接 apt install tftpd-hpa xinetd 既可以。 然后 systemctl enable/start tftpd-hpa/xinetd , 然后修改 /etc/default/tftpd-hpa 文件,修改自己需要的 tftp server 的路径,重启 tftpd-hpa 服务。

在树莓派 4B 上安装 LNMP Stack

上一篇文章我们讲述了通过 Ubuntu Linux dd 命令烧写 树莓派 官方的 “Raspbian GNU/Linux 10 (buster)” Lite 版本,然后配置 ssh 后,启动登录的过程。本文我们简要讲解安装 LNMP 的过程 (Nginx + Mysql + PHP)

  1. MySQL: # apt -y install mariadb-server ; systemctl status mariadb
  2. Nginx: # apt -y install nginx; systemctl status nginx
  3. PHP 7.3 # apt -y install php7.3-fpm; systemctl status php7.3-fpm
  4. 修改 PHP 配置 # vim $(php –ini|awk ‘/^Loaded/ {print $NF}’)
    设置好 error_log 以及 timezone = Asia/Shanghai,重启 php7.3-fpm
  5. # vim /etc/nginx/sites-available/default 把 php 的几行注释掉,检查 php7.3 是 socket 还是 TCP , 用 lsof 进程号就可以看到,重启 Nginx
  6. # cat >/var/www/html/4yi.php <<EOF
    <?php
    phpinfo();
    EOF
  7. 以上还没有安装 PHP 的 mysql 模块, 需要添加: # apt -y install php7.3-mysqlnd ,如果需要其他模块 (用 php -m 检查),可以如法炮制,然后重启 php7.3-fpm 服务
  8. 假定树莓派新的主机名为 dolphin,在 Windows 上浏览器输入 dolphin.local/4yi.php 就可以看到 PHP 的配置信息了。

下一篇,我们会讲述我们自己用 Go 语言编写的一个物联网数据采集程序,怎么和 LNMP 整合。

树莓派 4B headless 安装启动

万能的 TB 上花了 330 元买了一个 4B 所谓官方套件,其实就是多了个 3A 的 USB 加 三个小块的 散热器(我也不知道怎么安到板子上),加了一个带按钮的 Type C 的电源线。我以为原先 Pi Zero 上的 HDMI 线能用, 没想到,两个小口是 Micro HDMI,懒得去买转换线了。 上手!


1. 官网下载 Raspbian Buster Lite 在 Ubuntu 上我喜欢用 axel 下载,很快。下载完的 zip 文件用 sha256sum 命令检验一下校验和和网站上的对比一下,没错的话,说明下载的 zip 没有问题,然后 unzip 解压,得到一个 2GB 左右的 img 文件, 插入 16GB 的 SD 卡到 Ubuntu 系统的 PC上, umount 系统的自动挂接。然后用 dd 命令:
dd if=2019-07-10-raspbian-buster-lite.zip of=/dev/sdb bs=1M
然后挂接 /boot, mount /dev/sdb1 /mnt; touch /mnt/ssh ; umount /dev/sdb1
把 SD 卡拔出后插入到树莓派上,插上网线,上电。

2. Ubuntu 上 nmap -sP 192.168.7.1/24 扫描本地上线的新 IP 地址,可以看到一台 raspberrypi 的设备,类似:
Nmap scan report for raspberrypi (192.168.7.102)
然后 nmap 192.168.7.102 ,可以看到 ssh 已经上线
然后 ssh pi@192.168.7.102 输入默认密码: raspberry 就可以进入树莓派了。

3. 其他设置: raspi-config 或者

  • 时区: rm /etc/localtime; ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • Locale: vi /etc/locale.gen 去掉 en_US, zh_CN 相关的行, 运行 locale-gen
  • 修改源为清华大学镜像 /etc/apt/sources.list
    deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
    deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
    然后 apt update; apt upgrade
  • 修改为静态地址,修改 /etc/dhcpcd.conf 修改 static_ip 相关的行
  • 修改主机名, 修改 pi 账号的默认密码

接下来, 新建一个账号, ssh-genkey 生成 RSA Key, 账号加到 sudo , 安装 vim, 从 Ubuntu 运行 ssh-copy-id ,就可以从 Ubuntu 无须密码登录 raspberry2.local 这样了。

多加一点料: 设置桌面系统

  1. 添加中文字体:# apt install fonts-wqy-microhei fonts-wqy-zenhei
  2. # apt install lightdm
  3. # apt install realvnc-vnc-server; vncpasswd -service;

接下来一篇, 我们在 树莓派上安装 LNMP Stack