0%

Manjaro ARM官方制作维护了许多开箱即用的镜像,不过同时提供了打包工具,可以用来自行制作镜像包或启动TF卡/U盘。

Manjaro提供了2个工具,manjaro-arm-tools和manjaro-arm-installer。manjaro-arm-tools可生成镜像包,目前仅支持Manjaro。manjaro-arm-installer用于直接制作启动盘,可运行在任意发行版。也可以通过创建loop设备方式,将镜像写入磁盘,方便分发使用。

本例中,在deepin上配置使用manjaro-arm-installer。

下载manjaro-arm-installer

manjaro-arm-installer就是一个bash脚本,下载地址: https://gitlab.manjaro.org/manjaro-arm/applications/manjaro-arm-installer/-/tags 选择最新的即可。

安装依赖

该脚本依赖:

"git" "parted" "systemd-nspawn" "wget" "dialog" "bsdtar" "openssl" "awk" "btrfs" "mkfs.vfat" "mkfs.btrfs" "cryptsetup"

大部分依赖系统已预装,或者直接按包名安装即可,注意在deepin中,systemd-nspawnsystemd-container提供。

另外qemu-user-static也要安装。装好后,进入/usr/lib/binfmt.d。这个目录下针对不同架构有许多文件,我们的盒子是aarch64架构,所以将qemu-aarch64-static.conf复制一份,改名为qemu-static.conf

执行脚本

按提示进行选择机型、版本、设置用户名密码、时区等操作即可。建议全程出国上网,直连下载rootfs很慢(约170.11M)。完成后,对应TF卡/U盘存在fat与ext4两分区,用过Armbian的应该很熟悉下步配置了。

硬件

R3300-M一台,TF卡一个(运行Manjaro ARM),拆机硬盘DIY的移动硬盘一个。电源用12V 2A的,1A的带硬盘不够。

安装

sudo pacman -Sy transmission-cli

配置文件

sudo vim /var/lib/transmission/.config/transmission-daemon/settings.json

以下为常用配置,设置下载队列大小,下载路径,缓存等。对于一个headless下载机而言能够远程访问很重要,所以建议把局域网地址添加到rpc-whitelist中。

"cache-size-mb": 50,
"download-dir": "/mnt/transmission",
"download-queue-size": 50,
"download-dir": "/mnt/transmission",
"rpc-whitelist": "192.168.1.*,127.0.0.1,::1",

启动服务

sudo systemctl enable transmission
sudo systemctl start transmission

transmission-cli贴心地提供了系统服务,启用即可。

运行smb服务

下篇讲解。

需要开机自动执行的脚本

#!/bin/bash
# rustdocs.sh
# 别忘记给它可执行权限
/home/marly/.cargo/bin/mdbook serve -n 0.0.0.0 -p 3000 /home/marly/Documents/rust/trpl-zh-cn&
/home/marly/.cargo/bin/mdbook serve -n 0.0.0.0 -p 4000 /home/marly/Documents/rust/rust-by-example-cn&

第一行如果末尾不加”&”,第二句命令就不会执行。

另外脚本启动发生在marly登录bash之前,所以类似.bash_profile中自定义的$PATH无效,需要使用绝对路径。

systemd服务

[Unit]
Description=Start rust doc service on boot
Requires=network-online.target
Documentation=man:rustc

[Service]
User=marly
Type=forking
ExecStart=/home/marly/.local/bin/rustdocs.sh

[Install]
WantedBy=multi-user.target

把它命名为 rustdoc-start.service 即可,必须以.service结尾。

启动服务

将上述service文件放置在/etc/systemd/system/usr/lib/systemd/system/中,然后执行sudo systemctl enable rustdoc-start.service。完毕后重启设备观察效果,如无意外mdbook服务会自动启动。

注意sudo systemctl enable rustdoc-start.service的细节。此步骤在/etc/systemd/system/multi-user.target.wants创建了指向rustdoc-start.service的同名符号链接。

分析

上面的User,Type,ExecStart,WantedBy是重点。User=marly即以用户marly身份执行,ExecStart为所执行命令,本例中即刚才编写的脚本路径。WantedBy决定了服务启动时机,multi-user.target对应的系统状态大致为: (参考自 Why do most systemd examples contain WantedBy=multi-user.target?)

multi-user.target normally defines a system state where all network services are started up and the system will accept logins, but a local GUI is not started. This is the typical default system state for server systems, which might be rack-mounted headless systems in a remote server room.

所有网络服务已启动,系统已经做好接受登录的准备,但是GUI还未启动。对于无头服务器而言,这是默认的系统状态。

本例需要对外提供网络服务,所以WantedBy=multi-user.target是合适的。

最后是Type,有simple, exec, forking, oneshot, dbus, notify, idle几种类型。借用下金步国先生的翻译

如果设为 forking ,那么表示 ExecStart= 进程将会在启动过程中使用 fork() 系统调用。 也就是当所有通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为主服务进程继续运行。 这是传统UNIX守护进程的经典做法。 在这种情况下,systemd 会认为在父进程退出之后,该服务就已经启动完成。 如果使用了此种类型,那么建议同时设置 PIDFile= 选项,以帮助 systemd 准确可靠的定位该服务的主进程。 systemd 将会在父进程退出之后 立即开始启动后继单元。

个人理解,执行rustdocs.sh本身创建了一个进程,其中的两条mdbook命令又创建了2个子进程。只有2个子进程存续,我们的rust doc服务才能访问。所以oneshot,simple等都不行。

简单验证一下猜想:

$ ps x | grep rust
    403 ?        Sl     0:05 /home/marly/.cargo/bin/mdbook serve -n 0.0.0.0 -p 3000 /home/marly/Documents/rust/trpl-zh-cn
    404 ?        Sl     0:05 /home/marly/.cargo/bin/mdbook serve -n 0.0.0.0 -p 4000 /home/marly/Documents/rust/rust-by-example-cn
  63046 pts/0    S+     0:00 grep rust

验证成功。再顺便看看进程的owner:

$ stat -c '%U' /proc/403 /proc/404
marly
marly

符合预期。

Manjaro ARM软件仓库里可用内核有三个分支:mainline,aml,vim,都有对应的headers。

mainline

更新最快,理论上被投入的开发维护资源更多。如果用mainline kernel一切正常,就选它好了。

aml

可能对Amlogic SOC有加成?我没发现。

vim

可能对vim板子有加成?

用刷入ATV底包的R3300-M盒子测试,三者都能正常启动运行,但是只有vim内核poweroff与reboot正常,故切换到vim内核。

sudo pacman -Sy linux-vim linux-vim-headers

编译WIFI驱动小小修改一下:

git clone https://github.com/jwrdegoede/rtl8189ES_linux.git
cd ~/rtl8189ES_linux/
make -j4 ARCH=arm64 KSRC=/usr/lib/modules/$(uname -r)/build
sudo cp 8189es.ko /usr/lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/
sudo depmod -a
sudo modprobe 8189es

直接指定架构为arm64进行编译即可。

首先推荐两个教程:
*. Rust 程序设计语言(第二版 & 2018 edition) 简体中文版
*. 通过例子学 Rust

以上教程均可在线阅读,不过也可下载到本地阅读。以通过例子学 Rust为例:

$ git clone https://github.com/rust-lang-cn/rust-by-example-cn
$ cd rust-by-example-cn
$ cargo install mdbook
$ mdbook build
$ mdbook serve

在arm设备上远程操作,建议新建screen以免意外连接丢失重新来过。另外我需要从其他设备访问文档页面,默认的mdbook server只允许localhost访问,需要略微修改:

mdbook serve -n 0.0.0.0

这样局域网其他设备就可以在浏览器中通过3000端口阅读文档了。如果需要更换端口号,可以通过-p自行指定。

安装

sudo pacman -Sy rust

换国内源

参考自解决Rust – update crates.io过慢的问题

vim ~/.cargo/config

添加以下内容:

# 放到 `$HOME/.cargo/config` 文件中
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"

# 替换成你偏好的镜像源
replace-with = 'sjtu'
#replace-with = 'ustc'

# 清华大学
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

# 中国科学技术大学
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

# 上海交通大学
[source.sjtu]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"

# rustcc社区
[source.rustcc]
registry = "git://crates.rustcc.cn/crates.io-index"

查看文档

使用cargo doc生成的文档为网页形式,可以用python建立服务器然后在浏览器中查看。

# 首先进入doc目录
python -m http.server 8000

然后在浏览器中访问即可。python服务器默认端口为8000,无特别要求可省略。

Manjaro Sway默认的bash提示符看起来类似oh-my-zsh比较美观,简单分析后发现使用了silver

图示

A cross-shell customizable powerline-like prompt heavily inspired by Agnoster. The faster rust port of bronze.

silver是一个跨平台、方便配置的类powerline提示符,从bronze移植而来。bronze是用go开发的,目前已经停止维护了,其git页面上显示用rust写的silver比它快50%,其配置文件通用所以老用户迁移很容易。bronze大量参考了Agnoster这个zsh主题。

目前silver支持 Powershell, Bash, Zsh, fish, Ion 和Elvish。

silver的图标由nerd字体提供。这个字体囊括了常用图标库,比如Font Awesome就包含其中。
diagram

Manjaro Sway中,silver.toml位于~/.config/silver,可根据自身喜好修改。

[[left]]
name = "status"
color.background = "black"
color.foreground = "white"

[[left]]
name = "user"
color.background = "yellow"
color.foreground = "black"

[[left]]
name = "dir"
color.background = "blue"
color.foreground = "black"

[[left]]
name = "git"
color.background = "green"
color.foreground = "black"

[[left]]
name = "cmdtime"
color.background = "magenta"
color.foreground = "black"

需要指出,在bash中,cmdtime不可用,故不会显示。

以下为在Manjaro ARM下通过命令行创建用户“marly”全过程,各步骤已做分解。

  1. 查看useradd默认模板
sudo useradd -D

GROUP=984
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
  1. 创建用户
sudo useradd marly
  1. 创建密码
    sudo passwd marly
    
  2. 创建home目录
    useradd默认情况下不会创建home目录(尽管会根据模板写入passwd文件),所以需要自行创建。
    mkhomedir_helper用法:
    mkhomedir_helper {user} [umask [ path-to-skel ]]
    
    第一个参数用户名必选,umask与skel路径可选。默认umask为0022,默认skel路径为/etc/skel(模板里可以看到)。skel里面的内容会被复制一份到marly的家目录中。
    sudo mkhomedir_helper marly
    
  3. 添加用户备注
    勤于写备注是好习惯:
    sudo usermod -c "guess who is marly" marly
    
  4. 查看用户组
    查看当前用户group:
    groups
    
    等价于
    查看当前用户group:
    groups $USER
    
    查看其他用户group:
    ```bash
    $ groups git

git

不需要特殊权限即可查看。
7. 添加用户到group:
```bash
sudo usermod -aG existgroup newuser

-aG为追加用户到现有组。

新创建的用户默认会自动创建并加入与用户名同名的组,为了实现各种功能,需要将其添加到更多的组。例如,需要赋予marly管理员权限,就需要将其加入wheel组:

sudo usermod -aG wheel marly

这样marly就有权使用sudo命令了。在debian中sudo组替代了wheel。

  1. 一步创建:
    useradd -c "this shows how to create user in single line" -G git,wheel -m  fredman
    

不推荐用-p直接分配密码。删除用户用userdel:

userdel -r fredman

硬件平台

NEC的mini型工作站,N8000-30044S13 GSC-S13F,型号GSC001。官方资料很少,猜测是企业定制版。主要特性如下:

电源:额定150W。负载为20%,50%,100%情况下效率可达87%,90%,90%。100%时功率因数0.96。

功耗:整机最大功耗95W,空载功耗,35W,关机功耗0.8W,噪音44db。文档没说明测试条件不过大概率是用E3-1225测的。

主板:SATA接口3个,Intel千兆网卡1个,USB2.0 4个,COM口1个,VGA1个,4pin风扇接口3个,内存插槽2个。还有1个DP接口,不过识别不到。主板预留了USB3.0位置和对应开孔但没有加焊。

硬盘位

硬盘笼可安装2块3.5寸机械硬盘。主板上有一些控制硬件功能的跳帽,如果将RAID的跳帽插上(短接),主板SATA就只有RAID选项可用。拔掉后SATA模式可选IDE,AHCI或禁用。其他几个跳帽功能不明。RAID配置使用LSI Software RAID Configuration Utility。

外设

DVD光驱一个,喇叭一个。

以上平台 + G645处理器+2条8G ECC内存 + 2张3T机械硬盘 + 1个32G的U盘就得到了完整的TrueNAS硬件平台。

安装

TrueNAS建议安装在16G以上的NVME等设备中,不推荐U盘,不过家用问题不大。

配置

添加磁盘,新建存储池等等,与老款FreeNAS基本一致。

运行效果

由于噪音感人所以扔地下室储藏间,跑满局域网千兆轻轻松松。不进行硬盘操作情况下,在网页页面中看到CPU使用率只有1%,最高温度26.9度长期运行毫无压力。如果更换静音风扇作为普通PC机使用应该也能胜任,几个风扇都是普通4pin接口不需要自行魔改。

三个风扇参数如下,可以根据规格自行替换:

  1. CPU风扇:AFC0712DD,12V 0.45A,鲁大师读数在1500RPM上下。

  2. 电源风扇:AFC0812DD,12V 0.75A,鲁大师中没看到读数。

  3. 机箱风扇:FFB0412SHN,12V 0.60A,鲁大师读数在5300RPM左右。

BIOS中可以设置忽略错误,即便不插风扇也可以正常开机启动。

恩山上看到有人在R3300-L上刷入Android 6.0后,成功将openwrt刷入emmc并启动成功。或许R3300-M也可以?

R3300-M使用meson-gxbb-p201.dtb,搜索外网固件基本上锁定MXQ P201关键词,于是搜到了这个帖子:

Ugoos Android 6.0.1 port MXQ S905 P201

有网友在MXQ P201上测试,WIFI正常,有线网卡不工作。不过我们现在只关心BootLoader,Amlogic设备的分区表都在BootLoader里,如果这个BootLoader比较新,可以小小期待下从emmc启动。

从上面帖子追踪到原贴,某位俄国人基于UGOS做的改版固件: https://4pda.to/forum/index.php?showtopic=760441&st=1320

固件下载地址: https://drive.google.com/drive/folders/1ECX6Peu5tELNMbLKo5_dBJN76DlvuX6L

其中:(谷歌渣翻译加猜测,原文俄文看不懂)

  1. ugos7 wifi.img : 只有 WIFI 工作
  2. ugos9 wifi s pdu.img : Wifi 工作和远程控制
  3. ugos10 wifi s pdu ckear.img :Wifi 工作正常,删除了一些 ugos预装应用和启动器(作者说这个最精简,最快)

ugos10应该最适合,如果这个固件内核版本高于3.14,那么从emmc启动openwrt(5.4内核)就很有希望。Manjaro主线内核已经滚到了5.14.2,不抱希望。(如果没记错,恩山Flippy在某帖子中提到5.10内核后Amlogic都无法从emmc启动linux)有空时候测试下。

更新:去Coreelec又看了下关于内核的讨论,GXBB S905只有3.14内核,无缘4.9,所以emmc启动没戏了。