买了一个友善的nanopiM4玩,smb服务和bt下载和内网穿透搭起来之后,日思夜想终于又买了一个nas的扩展板…现在有些软件希望它开机就自动启动。
图中小机器的bt远程下载
开机启动:挂载硬盘
准备一个sh脚本文件
这个硬盘需要设置它自动休眠,否则硬盘会一直转,非常发热,控制硬盘使用的是hdparm这个软件。首先在~/tools/dx-pi-boot.sh路径创建一个脚本,挂载硬盘之后就设置硬盘的自动休眠时间。
#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export PATH
# 用于pi的开机启动脚本
# 挂载硬盘吧
umount /dev/sda1
mount /dev/sda1 /home/pi/share/Disk4T
hdparm -S 60 /dev/sda #60x5秒即5分钟之后硬盘进入睡眠状态
创建一个service文件
进入/etc/systemd/system/,这文件夹下有许多service文件,都link自/lib/systemd/system/,那为什么是这样的弄法呢,google之后貌似说是自己加到lib文件夹下,然后再由管理员加到etc文件夹下。
总之先按照别人写的直接加到etc文件里试试,英语好可以输入 man systemd unit 命令看看手册。
创建一个dx-pi-boot.service文件,准备以后把一些简单的开机命令都写在里面,内容如下:
[Unit]
Description=dx's boot server
[Service]
Type=simple
ExecStart=/home/pi/tools/dx-pi-boot.sh
[Install]
WantedBy=multi-user.target
按照查的百度小白的步骤,service文件创建好了之后。
sudo systemctl daemon-reload service文件改动后要重新载入一下
sudo systemctl enable dx-pi-boot.service
然后现在试试启动服务吧
sudo systemctl dx-pi-boot.service
嗯,然后它就顺利启动了。。如果想看一下当前的所有服务,那么可以列出所有服务,可以显示刚才文件里写的Install到的各种.target和服务的运行状态,绿色是正在运行,灰色是已经运行结束的,红色是运行失败:
sudo systemctl list-dependencies multi-user.target
现在打开一个已经内置的服务的sshd.service文件看看高手是怎么写的..
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service
里面有写到一个Restart动作,嗯,这个可能是我想要的。。
开机启动:启动内网穿透的frpc程序
用上内网穿透,就能在外面访问这个机器,十分的好用,实际体验速度很快,效果拔群。frpc软件我直接放在了soft文件夹,启动一下就行了。这里发现了一个坑,一开机就启动服务去联网可能还连不上网,因此启动程序会失败,所以在sh脚本里加了个20秒的延迟,20秒之后才去启动frpc软件。因为它关系到外网连接ssh远程控制这个机子,十分重要,所以我决定给它一个面子,加上Restart的设置先,出错返回的状态看看是多少。
[Unit]
Description=dx's frpc server
[Service]
Type=simple
ExecStart=/home/pi/soft/frp_0.28.2_linux_arm64/client.sh
Restart=on-failure
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
然后还是使用上面的步骤配置服务,然后启动。返回输出创建了一个link到multi-user.target.wants文件夹:
#使能服务
$ sudo systemctl enable dx-frpc.service
Created symlink /etc/systemd/system/multi-user.target.wants/dx-frpc.service → /etc/systemd/system/dx-frpc.service.
另外,dx-frpc.service服务启动时候连接失败的日志如下,后面再观察一下前面写的Restart有没有作用吧:
根据这个返回值所以瞎写了前面RestartPreventExitStatus的值为1。
开机启动:启动qbittorrent
在使用qbittorrent的时候,首先我编译成功了arm64的带qt界面的qbittorrent程序并且可以运行,但是不带qt界面的并不能编译成功。懒得折腾了,于是就将就着使用带qt界面的qbittorrent程序,现在同样希望开机就启动它。
首先在机器不接显示器的情况下,启动带qt界面的qbittorrent程序会直接报错的。于是网上查到一个方法,加入一个export DISPLAY=’:0.0’的方法。于是得出一个脚本如下,它在使用screen来运行时能够运行的:
#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export PATH
# bt下载需要的一个显示器
export DISPLAY=':0.0'
# 好像启动失败了,看看到底执行了这个脚本没
echo `date +"%Y-%m-%d %H:%M:%S"` 执行一次dx-pi-bt.sh >> /home/pi/tools/dx-pi-bt.log
#启动 qbittorrent
qbittorrent >> /home/pi/tools/dx-pi-bt.log
然而,使用服务启动它看到log文件生成了,然而bt程序没启动。。
查看服务状态sudo systemctl list-dependencies multi-user.target,看到服务亮着一个小红灯,看来是挂了:
试了一下输出到dx-pi-bt.log文件里,结果里什么也没有记录,时间倒是记录了一条,说明脚本文件确实是执行了,黔驴技穷。想一下官方的服务管理组件总得有个地方记录日志最后一查查到服务的日志:
sudo journalctl -u dx-pi-bt.service
日志里面说无法连接到display0:0。推测可能服务执行这种界面程序可能会有问题。
算了,不折腾了这里还是就用个screen算了。