0%

需要开机自动执行的脚本

#!/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启动没戏了。

#!/bin/bash
# autohexo.sh
# 半自动推送更新
# -i:接受行内文本作为commit -m 参数
# -f:接受一个文本文件作为commit -m 参数
# -g:构建页面并推送,无参数
commitComment=""
echo
function commit2git {
    git add .
    git commit -m "$1"
    git push origin blogSource
}
while getopts :i:f:g opt
do
        case "$opt" in
                f)commitComment=$(cat "$OPTARG")
                  commit2git "$commitComment";;
                i)commitComment=$(echo "$OPTARG")
                  commit2git "$commitComment";;
                g)hexo g -d;;
                *);;
        esac
done

很简单的脚本,通过终端输入或者提供一个文本文件传递commit -m的参数,能够略微简化提交博客源码的流程。

用例:

./autohexo.sh -gi "更新日志"

Use ImageMagick® to create, edit, compose, or convert digital images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, WebP, HEIC, SVG, PDF, DPX, EXR and TIFF. ImageMagick can resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.

利用imagemagick可以对图片进行从简单到复杂的各种处理。

格式转换

场景:微信公众号封面不接受webp格式图片,需要进行转换:

convert 封面4.webp 封面4.jpg

再也不需要下载安装臃肿迟缓捆绑广告试用版还添加水印的软件了。

图片合并

一张图片一页:

convert 1.jpg 2.jpg 3.jpg total.tif

得到一个3页的图片文件,类似PDF。当然,也可以一步到位,直接转换为PDF:

convert 1.jpg 2.jpg 3.jpg total.pdf

有可能会提示类似错误:

convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.

ImageMagick的默认安全策略禁止这种转换,可以通过修改ImageMagick安全策略文件取消限制:

sudo vim /etc/ImageMagick-*/policy.xml

<!-- <policy domain="module" rights="none" pattern="{PS,PDF,XPS}" /> -->这一行取消注释并保存,即修改为

<policy domain="module" rights="none" pattern="{PS,PDF,XPS}" />

这样输出图片为PDF就没问题了。

备注:我在Deepin上测试,得到的“PDF”文件打不开,用file查看是图片格式:

output.pdf: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=14, height=3264, bps=0, description=smart, manufacturer=HUAWEI, model=CND-AN00, orientation=upper-left, xresolution=200, yresolution=208, resolutionunit=2, software=CND-AN00 10.1.1.166(C00E140R3P1), datetime=2021:08:14 08:02:45, width=2448], baseline, precision 8, 2448x3264, components 3

Deepin上convert版本:Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org Copyright: © 1999-2019 ImageMagick Studio LLC

在Manjaro ARM 21.08上测试没问题,得到了正常的PDF文件。Manjaro ARM 21.08上convert版本为Version: ImageMagick 7.1.0-6 Q16-HDRI aarch64 2021-09-04 https://imagemagick.org Copyright: (C) 1999-2021 ImageMagick Studio LLC。另外Manjaro上不需要修改policy文件,默认就正常运行。

按a4纸张规格输出

convert screenshot-2021-09-14-222216.png -page a4 1.pdf

其他功能还有很多,类似resize等等,具体可查阅man手册。