手动修改树莓派配置(仅适用systemd)
我为什么这样做?
针对下载最新版的raspbian buster镜像,遇上问题如下:
- ssh服务默认没有开启,无法通过网络远程登录。
- hdmi没有输出。
- 串口接收端损坏,发送端好的,无法接受串口发送的调试命令,但是可以读取log。
以上理由....都特喵扯淡,反正:
我就只是想改一下,就这。
具体步骤
1.在fat32分区中,内核启动命令行参数记录在cmdline.txt
中,此处修改指定systemd作为init,并且取消quiet参数,让开机log正常打印,可以用串口读取到,这个可以直接读取tf卡盘修改。
最终的cmdline.txt
内容如下:
root=PARTUUID=ea7d04d6-02 rootfstype=ext4 init=/bin/systemd elevator=deadline fsck.repair=yes rootwait plymouth.ignore-serial-consoles
2.挂载tf卡树莓派的根分区,此处内存卡块设备为/dev/sdc
,则/dev/sdc1
为fat32分区,/dev/sdc2
为树莓派的ext4根分区
切换root用户(#),挂载点创建到/media/pi
#mkdir /media/pi
挂载文件系统
文件系统挂载点
/media/pi
不是一定要这个路径,根据实际情况,如果挂载点有变,下面命令涉及/media/pi
路径替换一下即可
#mount -t ext4 -o rw /dev/sdc2 /media/pi
3.确认ssh服务配置文件存在系统中。
ls查看ssh.service配置文件所在的目录。
#ls /media/pi/lib/systemd/system/ssh*
/media/pi/lib/systemd/system/ssh.service /media/pi/lib/systemd/system/ssh@.service /media/pi/lib/systemd/system/ssh.socket /media/pi/lib/systemd/system/sshswitch.service
看以上输出结果,存在/media/pi/lib/systemd/system/ssh.service
,确认系统已经安装了ssh服务。
4.systemd的target依赖关系
查阅systemd手册可知,启动的目标依赖关系大致如下
sysinit.target -> basic.target -> multi-user.target -> graphical.target
需要把ssh.service
添加到启动流程中去。
5.添加ssh软链接到到wants
文件夹
上步所示,graphical.target
启动前先启动multi-user.target
,ssh依赖是multi-user.target
。软连接添加到multi-user.target.wants
文件夹里,即可添加到启动流程中去。
#ln -s /lib/systemd/system/ssh.service /media/pi/etc/systemd/system/multi-user.target.wants/ssh.service
查看文件详细信息,确认软连接成功添加
#ls -l /media/pi/etc/systemd/system/multi-user.target.wants/ssh.service
lrwxrwxrwx 1 root root 31 8月 15 12:07 /media/pi/etc/systemd/system/multi-user.target.wants/ssh.service -> /lib/systemd/system/ssh.service
如上所示,软连接创建成功,/media/pi/etc/systemd/system/multi-user.target.wants/ssh.service
指向 /lib/systemd/system/ssh.service
6.ssh服务添加开机自启成功,连上网线,插入tf卡,开机,找到树莓派的ip尝试链接即可。
网络服务默认是使用
networking.service
来管理,默认添加到multi-user.target.wants
里去,参与开机自启。
关闭了cmdline.txt
中quiet
的参数,开机时会打印详细流程,可以通过读取串口输出来确定系统启动的情况,可以通过串口大致判断是否开机成功。(虽然pi的rxd可能因为接触不良或者坏了导致树莓派无法接收上位机的信息,如果整个串口坏掉了那就没办法了,摸着来吧)
重启后,观察硬盘读写灯(绿灯),启动时偶尔闪烁。
自动链接wifi篇
手上的树莓派2B无板载wifi,需要额外购买usb wifi模块,同时要网卡型号在树莓派中存在驱动,一般某宝备注免驱,详情需要询问。
挂载root分区到/media/pi
后,修改/media/pi/etc/wpa_supplicant/wpa_supplicant.conf
#vim /media/pi/etc/wpa_supplicant/wpa_supplicant.conf
添加network
结构,ssid
是自己开的wifi名称,psk
是wifi密码,priority
是连接的优先级,越大优先级越高
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="mywifi"
psk="12345678"
priority=5
}
如果对vi
使用不熟悉,可以参考这里,
一份简单的快捷键帮助:
移动光标:
alt+h 左移动 alt+l 右移动
alt+j 下移动 alt+k 上移动
alt+xxx的快捷键都会退出编辑模式,重新按i进入即可,下同。
删除字符:
alt+x
删除当前行:
alt+d d(第二次d松开alt)
插入编辑模式:
i
保存退出
alt+: wq(松开alt+:)
取消保存并退出
alt+: q!(松开alt+:)
因为看不到log,很难判断连接失败的原因,所以直接配置wifi连接但又不成功排查起来很困难,建议先用有线连接。
由于wifi使用了dhcp自动分配ip,树莓派的ip可能无法确定(除非有些机型显示已连接的设备的ip,或者扫描),或使用其他手段扫描wifi网段的ip。
以下bash脚本,扫描当前无线局域网内存活的主机,小米手机的wifi网段为192.168.43.x
,每个ip发送一个ping包,不丢包则认为主机存活。
i=1
net="192.168.42"
while [ $i -lt 254 ];
do
echo -en "\r$net.$((++i)) "
ping -c 1 $net.$i > /dev/null && echo "->主机在线"
done
确定wifi网段的方法
手机终端模拟器键入ifconfig
命令,看到wlan网卡的ip,我的是192.168.43.1
最终扫描到的ip是192.168.43.227
,使用juicessh
登录树莓派即可.
wifi管理的服务由wpa_supplicant.service
管理,经查看,默认已经添加到/media/pi/etc/systemd/system/multi-user.target.wants
,说明服务自启是包含了wifi管理的。
手机开同名同密码的ap尝试被连接,注意是2.4G 频段,此处购买的usb wifi模块不支持5G频段。
知识储备
1.raspbian是基于debian的树莓派定制系统,系统管理上可以套用debian的方法。
2.debian10,版本代号buster,使用的init不是传统sysV init,而使用了systemd。
3.树莓派的tf卡有2个分区,一个fat32格式的boot分区,放置bios启动相关的配置(config.txt),以及内核启动参数(cmdline.txt),一个ext4格式的根分区。
4.systemd和传统的sysV init开机启动的配置有很大的差异。sysV init会读取init.d相关daemon启动脚本,但是systemd则用了它自己要求的配置文件,systemd兼容了大部分sysV的脚本。具体差异如下
- systemd服务的配置文件位与/lib/systemd/system,/etc/systemd/system等几处位置
- sysV init的服务启动脚本位与/etc/init.d /etc/rcX.d (X=0-6)
5.运行级别。
linux分成6个运行级别随便在博客找的说明
编号 | 描述 | systemd对应的target |
---|---|---|
0 | 关机模式,系统默认运行级别不能设置为0,否则不能正常启动,一开机就自动关机 | shutdown.target |
1 | 单用户模式,root权限,用于系统维护,禁止远程登录,就像Windows下的安全模式 | emergency.target |
2 | 多用户模式,没有 NFS 网络支持 | rescure.target |
3 | 完整的多用户文本模式,有 NFS,登录后进入控制台命令模式 | multi-user.target |
4 | 系统未使用,保留一般不用 | 无 |
5 | 图形化模式,登陆后进入图形 GUI 模式 | graphical.target |
6 | 重启模式,默认运行级别不能设为6,否则不能设为6,否则不能正常启动,就会一直开机重启 | 无 |
- systemd通过软链接的方法,把选中运行级别的.target配置文件软链接到/etc/systemd/system/default.target
- sysV init 则把启动脚本放在/etc/init.d,不同运行级别需要启动的服务,则软链接到/etc/rcX.d(例如rc3.d)