[toc]

ssh反代问题

问题一

问题一.我有A和B两台服务器,一台在学校ip是10.71.10.25,另外一台在印度ip是124.156.xx.xx,现在我想构建ssh反向代理,让我的服务器A能被外网ssh连接,防止我不在校园也能控制服务器A。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 服务器A设置
root@raspbian:/configuration/script# vim ssh_reverse_proxy.sh
#!/bin/bash
ssh -fN -R 8101:localhost:22 root@124.156.xx.xx

# 监控程序脚本
root@raspbian:/configuration/script# vim ssh_reverse_proxy_daemon.sh
#!/bin/bash
while true;do

Flag=`ps -ef | grep "8101" | grep -v "grep"`

if [ -z "$Flag" ]; then

echo "restart ssh server"
bash /configuration/script/ssh_reverse_proxy.sh
# ssh -fN -R 8101:localhost:22 root@124.156.xx.xx
fi

sleep 100

done


# 加入reboot开机自启计划
root@raspbian:/configuration/script# crontab -e
@reboot /configuration/script/ssh_reverse_proxy.sh
@reboot /configuration/script/ssh_reverse_proxy_daemon.sh


# 两台服务器相互交换公钥到对方的/.ssh/authorized_keys,并且把自己的公钥加入到自己的/.ssh/authorized_keys

服务器互联目前不需要密码
脚本程序一切正常,但是服务器A只有重启后的几分钟内能够用服务器B连接,时间长点的话,比如:30分钟后,会发现服务器B一直连接不上

附图(一下三种情况都是在A服务器发出脚本,并且正常运行的到的):

情况一:(连得上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
服务器A
root@raspbian:/configuration/script# ps -ef | grep 8101 | grep -v "grep"
root 21390 1 0 11:27 ? 00:00:00 ssh -fN -R 8101:localhost:22 root@124.156.xx.xx

服务器B
[root@VM-0-17-centos ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:46:11:0d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.17/20 brd 10.0.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe46:110d/64 scope link
valid_lft forever preferred_lft forever
[root@VM-0-17-centos ~]# ssh localhost -p 8101
Linux raspbian 5.10.78-Release-OPENFANS+20211111-v8 #1 SMP PREEMPT Thu Nov 11 15:43:52 CST 2021 aarch64

This system Debian Pi Aarch64 for Raspberry Pi 3B/3B+/3A+/4B,
Created by OPENFANS.ORG & PIFAN.ORG .

Your can visit our official site:
http://www.openfans.org & http://www.pifan.org

Project address:
https://github.com/openfans-community-offical/Debian-Pi-Aarch64

It is strictly prohibited for any commercial use
without permission!

Especially some disgusting Taobao merchants,
congratulations to being warned!

Activate the web console with: systemctl enable --now cockpit.socket

You have new mail.
Last login: Tue May 31 11:10:02 2022 from 10.71.5.50

.~~. .~~. ___ __ ___ _
'. \ ' ' / .' / _ \___ ___ ___ / / ___ ___ ___ _ __ / _ \(_)
.~ .~~~..~. / , _/ _ `(_-</ _ \/ _ \/ -_) __/ __/ // / / ___/ /
: .~.'~'.~. : /_/|_|\_,_/___/ .__/_.__/\__/_/ /_/ \_, / /_/ /_/
~ ( ) ( ) ~ /_/ /___/
( : '~'.~.'~' : )
~ .~ ( ) ~. ~ Copyright (c) 2017-2022, OPENFANS.ORG & PIFAN.ORG
( : '~' : ) Linux Version 5.10.78-Release-OPENFANS+2021111
'~ .~~~. ~' Compiled #1 SMP PREEMPT Thu Nov 11 15:43:52 CST 2021
'~' Four ARM Processors, 7.9GB RAM
432.00 Bogomips Total
root@raspbian:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether e4:5f:01:3d:b7:4f brd ff:ff:ff:ff:ff:ff
inet 10.71.10.159/24 brd 10.71.10.255 scope global dynamic noprefixroute eth0
valid_lft 133302sec preferred_lft 133302sec
inet6 fe80::c2b7:8023:6697:581f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq state DOWN group default qlen 1000
link/ether e4:5f:01:3d:b7:50 brd ff:ff:ff:ff:ff:ff
4: macvlan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 1a:55:9c:25:a7:5b brd ff:ff:ff:ff:ff:ff
inet 10.71.10.25/24 brd 10.71.10.255 scope global macvlan
valid_lft forever preferred_lft forever
inet6 fe80::1855:9cff:fe25:a75b/64 scope link
valid_lft forever preferred_lft forever
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:5b:34:04:4f brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:5bff:fe34:44f/64 scope link
valid_lft forever preferred_lft forever
6: br-6f69248df895: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:f3:c1:54:d1 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-6f69248df895
valid_lft forever preferred_lft forever
9: vetha11c56c@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 42:0f:dc:8a:33:57 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::400f:dcff:fe8a:3357/64 scope link
valid_lft forever preferred_lft forever
# 已经连上

情况二:(连不上,但是一直尝试连接,没有报错)

1
2
3
4
5
6
7
8
9
[root@VM-0-17-centos ~]# ssh localhost -p 8101






^C

image-20220531113156680

情况三:(直接连接不上,服务器B发出连接不了报错)

1
2
3
4
# 服务器B
[root@VM-0-17-centos ~]# ssh localhost -p 8101
ssh_exchange_identification: read: Connection reset by peer

image-20220531113218786

现在状态

截至时间2022-6-17中午12:52分,服务器A重启后,服务器B也没办法连接上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
服务器A的crontab日志信息如下
root@raspbian:~# cat /var/log/cron.log
Jun 17 00:05:01 raspbian CRON[15444]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 00:15:01 raspbian CRON[16476]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 00:17:01 raspbian CRON[16674]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 00:20:01 raspbian CRON[16978]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 00:25:01 raspbian CRON[17516]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 00:35:01 raspbian CRON[18539]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 00:40:01 raspbian CRON[19040]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 00:45:01 raspbian CRON[19582]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 00:55:01 raspbian CRON[20582]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 01:00:01 raspbian CRON[21079]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 01:05:01 raspbian CRON[21620]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 01:15:01 raspbian CRON[22651]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 01:17:01 raspbian CRON[22848]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 01:20:01 raspbian CRON[23155]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 01:25:01 raspbian CRON[23693]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 01:35:01 raspbian CRON[24713]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 01:40:01 raspbian CRON[25215]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 01:45:01 raspbian CRON[25754]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 01:55:01 raspbian CRON[26772]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 02:00:01 raspbian CRON[27260]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 02:05:01 raspbian CRON[27812]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 02:15:01 raspbian CRON[28827]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 02:17:01 raspbian CRON[29025]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 02:20:01 raspbian CRON[29336]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 02:25:01 raspbian CRON[29877]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 02:35:01 raspbian CRON[30899]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 02:40:01 raspbian CRON[31405]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 02:45:01 raspbian CRON[31941]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 02:55:01 raspbian CRON[533]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 03:00:01 raspbian CRON[1085]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 03:05:01 raspbian CRON[1675]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 03:15:01 raspbian CRON[2693]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 03:17:01 raspbian CRON[2906]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 03:20:01 raspbian CRON[3229]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 03:25:01 raspbian CRON[3784]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 03:35:01 raspbian CRON[4811]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 03:40:01 raspbian CRON[5313]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 03:45:01 raspbian CRON[5858]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 03:55:01 raspbian CRON[6922]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 04:00:01 raspbian CRON[7425]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 04:05:01 raspbian CRON[7974]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 04:15:01 raspbian CRON[8973]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 04:17:01 raspbian CRON[9173]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 04:20:01 raspbian CRON[9480]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 04:25:01 raspbian CRON[10021]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 04:35:01 raspbian CRON[11045]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 04:40:02 raspbian CRON[11545]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 04:45:01 raspbian CRON[12093]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 04:55:01 raspbian CRON[13117]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 05:00:01 raspbian CRON[13619]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 05:05:01 raspbian CRON[14155]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 05:15:01 raspbian CRON[15165]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 05:17:01 raspbian CRON[15366]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 05:20:01 raspbian CRON[15672]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 05:25:01 raspbian CRON[16215]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 05:35:01 raspbian CRON[17250]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 05:40:01 raspbian CRON[17746]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 05:45:01 raspbian CRON[18285]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 05:55:01 raspbian CRON[19301]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:00:01 raspbian CRON[19800]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 06:05:01 raspbian CRON[22560]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:15:01 raspbian CRON[23560]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:17:01 raspbian CRON[23760]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 06:20:01 raspbian CRON[24067]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 06:25:01 raspbian CRON[24615]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Jun 17 06:25:01 raspbian CRON[24616]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:25:02 raspbian cracklib: no dictionary update necessary.
Jun 17 06:35:01 raspbian CRON[25732]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:40:01 raspbian CRON[26237]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 06:45:01 raspbian CRON[26777]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:55:01 raspbian CRON[27789]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 07:00:01 raspbian CRON[28292]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 07:05:01 raspbian CRON[28833]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 06:17:02 raspbian cron[412]: (CRON) INFO (pidfile fd = 3)
Jun 17 06:17:02 raspbian cron[412]: (CRON) INFO (Running @reboot jobs)
Jun 17 06:17:03 raspbian CRON[569]: (root) CMD (mount --bind /configuration /www/wwwroot/orange/mount_disk/)
Jun 17 06:17:03 raspbian CRON[570]: (root) CMD (/configuration/script/ssh_reverse_proxy_daemon.sh)
Jun 17 06:17:03 raspbian CRON[572]: (root) CMD (/configuration/script/ssh_reverse_proxy.sh )
Jun 17 07:56:17 raspbian CRON[5396]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Jun 17 07:56:17 raspbian cracklib: no dictionary update necessary.
Jun 17 08:00:01 raspbian CRON[7985]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 08:05:01 raspbian CRON[8241]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 08:15:01 raspbian CRON[8717]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 08:17:01 raspbian CRON[8839]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 08:20:01 raspbian CRON[8995]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 08:25:01 raspbian CRON[9252]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 08:35:01 raspbian CRON[9750]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 08:40:01 raspbian CRON[10002]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 08:45:01 raspbian CRON[10263]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 08:55:01 raspbian CRON[10760]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 09:00:01 raspbian CRON[11020]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 09:05:01 raspbian CRON[11280]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 09:15:01 raspbian CRON[11749]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 09:17:01 raspbian CRON[11863]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 09:20:01 raspbian CRON[12055]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 09:25:01 raspbian CRON[12401]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 09:35:01 raspbian CRON[12917]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 09:40:01 raspbian CRON[13202]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 09:45:01 raspbian CRON[13470]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 09:47:36 raspbian cron[409]: (CRON) INFO (pidfile fd = 3)
Jun 17 09:47:36 raspbian cron[409]: (CRON) INFO (Running @reboot jobs)
Jun 17 09:47:37 raspbian CRON[571]: (root) CMD (/configuration/script/ssh_reverse_proxy_daemon.sh)
Jun 17 09:47:37 raspbian CRON[574]: (root) CMD (mount --bind /configuration /www/wwwroot/orange/mount_disk/)
Jun 17 09:47:37 raspbian CRON[575]: (root) CMD (/configuration/script/ssh_reverse_proxy.sh )
Jun 17 09:55:01 raspbian CRON[7749]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 10:00:01 raspbian CRON[8058]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 10:05:01 raspbian CRON[8425]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 10:15:01 raspbian CRON[8920]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 10:17:01 raspbian CRON[9018]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 10:20:01 raspbian CRON[9186]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 10:25:01 raspbian CRON[9438]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 10:35:01 raspbian CRON[9927]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 10:40:01 raspbian CRON[10189]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 10:45:01 raspbian CRON[10449]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 10:55:01 raspbian CRON[10928]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 11:00:01 raspbian CRON[11180]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 11:05:01 raspbian CRON[11439]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 11:15:01 raspbian CRON[12987]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 11:17:01 raspbian CRON[13086]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 11:20:01 raspbian CRON[13246]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 11:25:01 raspbian CRON[13507]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 11:35:01 raspbian CRON[13994]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 11:40:01 raspbian CRON[14264]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 11:45:01 raspbian CRON[14596]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 11:55:01 raspbian CRON[15063]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 12:00:01 raspbian CRON[15319]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 12:05:01 raspbian CRON[15572]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 12:15:01 raspbian CRON[16062]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 12:17:01 raspbian CRON[16156]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 17 12:20:01 raspbian CRON[16328]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 12:25:01 raspbian CRON[16584]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 12:35:01 raspbian CRON[17183]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jun 17 12:40:01 raspbian CRON[17629]: (smmsp) CMD (test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/lib/sm.bin/sendmail && /usr/share/sendmail/sendmail cron-msp)
Jun 17 12:43:45 raspbian cron[379]: (CRON) INFO (pidfile fd = 3)
Jun 17 12:43:45 raspbian cron[379]: (CRON) INFO (Running @reboot jobs)
Jun 17 12:43:45 raspbian CRON[518]: (root) CMD (/configuration/script/ssh_reverse_proxy.sh )
Jun 17 12:43:45 raspbian CRON[519]: (root) CMD (/configuration/script/ssh_reverse_proxy_daemon.sh)
Jun 17 12:43:45 raspbian CRON[520]: (root) CMD (mount --bind /configuration /www/wwwroot/orange/mount_disk/) #这是我的一个挂载命令,不构成影响。
Jun 17 12:45:03 raspbian CRON[7329]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

检查服务器B防火墙

image-20220617125728813

A服务器

image-20220617130523176

B服务器

image-20220617130544082

猜想

1.我的朋友说可能是网络问题,毕竟是国外的服务器,连接过去可能出现丢包。

我的解释是ssh反代基于tcp/ip连接,还是比较可靠的,如果是丢包的话它也会继续发送重连,而且服务器B没有被GFW封杀,我也可以ssh到B服务器上面,理论上我应该是可以反代成功的。

2.我曾经换过内核,令服务器B能够开启bbr极限压缩带宽的使用,我不清楚这个是否构成失败原因。

[toc]

单片机吹水

1.学习哪种单片机

51、AVR、MSP430、STM8、STM32、DSP、linux、FPGA

2.学习单片机的最佳办法

  • 鹦鹉学舌
  • 照葫芦画瓢
  • 他山之石,可以攻玉
  • 理论和实践相结合,温故而知新

3.学习单片机的准备工作

  • 要有信心、恒心和耐心
  • 完善的配套流程
  • 计算机一台
  • 51开发板一块

芯片学习

51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型号就是ATMEL公司的AT89系列。

安装单片机开发环境

安装keil

KEIL C51 软件获取

要在电脑上成功安装 KEIL C51,首先必须要有安装包,我们可以通过万能的百度,搜索关键字“KEIL C51 下载”,上面会有很多下载渠道,也可以在KEIL的官网上下载: https://www.keil.com/download/product/,打开界面如下图所示。

image-20220728220612959

不过我们资料内已经给大家提供了下载好的软件,在资料“\5–开发工具\1-KEILC51 软件”内,直接使用即可,省去了查找下载的时间。我们使用KEIL C51 是 9.01 版本, 如果后面出了更高的版本选择性升级即可,不过也没有必要使用最新的,用习惯了一个软件就行。 使用我们提供下载好的软件包,其内部含有如下图所示文件。

image-20220728220739858

C51V901.exe:是 KEIL C51 软件的安装文件。

keygen_new2032.zip:KEIL C51 破解软件,在 KEIL C51 不破解的情况下只能编译 2K 大小文件,如果工程超过 2K,编译即会报错,因此需要破解。有的电脑系统会误认为该文件是病毒文件,所以这里把它压缩存放。

KEIL C51 软件安装

软件包下载完成之后,我们双击 C51V901.exe 这个应用程序,弹出如下所示对话框。

image-20220728223545240

点击 Next 按钮。 弹出如下对话框。

image-20220728223846155

在红框 2 中勾选上,点击 Next 按钮。弹出如下对话框。

image-20220728224107252

**点击红框 4 选择软件安装的路径,我们这里在 磁盘盘内新建一个文件夹,命名为 KEILC51,将其安装到该文件夹内,方便软件的管理。特别要注意: **

**(1)软件安装保存路径不能出现中文或者特殊字符,否则会出现很多奇怪的错误,到时候很难找问题。 **

(2)不要将 KEIL5 软件和 KEIL4 或者 51 的 KEIL 安装在一个文件夹内。然后点击 Next。弹出如下对话框。

image-20220728225157414

在红色框 6 和 7 中我们随便输入一些东西, 我们这里输入数字11,当然也可以输入空格, 但是一定要输入, 否则红色框 8 就一直是灰色状态,输入完成后点击 Next, 弹出如下对话框。

image-20220728225336184

说明 KEIL C51 软件正在安装,只要等一段时间即可,安装完成以后会出现如下界面。

image-20220728225539980

点击 Finish 按钮完成 KEIL C51 软件的安装过程。KEIL C51 安装完成后在电脑桌面上一般会有一个快捷方式,如下所示:

image-20220728225655136

KEIL C51 软件破解

上一节我们已经安装好了 KEIL C51 编程软件,可以使用它来编译51 单片机一些代码量小于 2K 的工程。但是有时候我们开发的项目可能比较大,程序代码超过了 2K,编译后会报错,因此就需要破解 KEIL C51。下面就来介绍下如何破解。

(1)首先打开 KEIL C51 软件,点击 File/License Management,复制红色框 3 中的 CID。 操作步骤如下:

image-20220728231058888

image-20220728235716845

然后我们打开之前下载的 KEIL C51 软件包,里面还有一个keygen 压缩文件,该压缩文件内含有 keygen_new2032.exe 文件,此文件用于破解。因此需要解压,解压后电脑会误认为该文件为病毒文件,会隔离掉,因此我们需要在弹出病毒隔离窗口时点击找回文件即可。

以管理员模式打开此破解软件 keygen_new2032.exe,将刚才从KEIL C51中复制的 CID 码粘贴到下面红色框 4 中,并且在红色框 5 选择C51,然后点击红色框 6,生成破解码,将此破解码即红色框 7 内容复制到KEIL C51 软件内LIC框中,点击 Add LIC 即可破解,如果破解成功则会显示。操作步骤如下:

image-20220729002023233

image-20220729003425413

如 果 破 解 失 败 , 请 确 认 是 否 使 用 管 理 员 模 式打开KEIL C51 软件和keygen_new2032.exe 破解工具。管理员模式打开方式:选择右键:RunAsAdministrator ,中文系统应该是“以管理员权限运行”,然后就可以正常加licence 了。建议所有用户,都以管理员身份运行,以避免重复破解。至此,我们就将 KEIL C51 软件安装和破解成功。后面就可以使用该软件来编写我们的 51 单片机程序。

实验课程_创建模板

创建文件夹

创建一个名为单片机工程模板的文件夹

image-20230828204727638

创建项目

打开keil,创建项目

image-20230828205007098

然后,选择创建的文件夹,写好文件名

image-20230828205235145

选择Vendor

选择Atmel里面的AT89C52基础数据

image-20230828205501446

image-20230828205701135

然后,掉下面选项

image-20230828205848976

创建main.c代码文本文件

image-20230828210954625

点完后,按ctrl + s,设置文本文件名字为main.c即可

image-20230828211035648

image-20230828211155706

添加main.c到工程文件

image-20230828211557693

image-20230828211659633

image-20230828211714598

其他添加main.c方法

image-20230828212344216

实验课程_设置魔术棒

image-20230828212924815

image-20230828213144515

image-20230828213419473

编译工具栏

image-20230828220302930

  • 第一个是编译当前文件,而且不生成hex
  • 第二个是编译改动的文件,生成hex
  • 第三个是全部文件编译,生产hex

更改字体大小

image-20230828220657738

image-20230828220753881

reg52.h头文件

1
2
#include <reg52.h>   # 直接查C:\Keil\C51\INC里有没有REG52.H
#include "reg52.h" # 先查工程文件夹有没有REG52.H,没有再查C:\Keil\C51\INC

如果在C:\Keil\C51\INC里面没有REG52.H就会报错

image-20230828221740821

实验课程_使用PZ-ISP烧录器

如果我们使用的是STC89C516RD+的处理器,选择带RC的芯片类型,也就是说带RD的就选择带RC的芯片类型,如果不带RD的处理器选择不带RC的芯片类型

image-20230419163408643

实验课程_点亮LED灯

点亮一个LED_D1

LED灯的端口有四组,分别是P0,P1,P2,P3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**************************************************************************************
实验名称:点亮第一个LED
接线说明:
实验现象:下载程序后“LED模块”的D1指示灯点亮
注意事项:
***************************************************************************************/
#include "reg52.h"

sbit LED1=P2^0; //将P2.0管脚定义为LED1

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
LED1=0; //LED1端口设置为低电平
while(1)
{

}

}

点亮一个LED_D1_闪烁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <reg52.h>

typedef unsigned int u16; //使用typedef来为用户自定义的数据类型取一个新的名字
sbit LED1 = P2^1;

void delay_10us(u16 ten_us) //当传2入ten_us=1时,大约延时10us
{
while(ten_us--);
}
void main()
{

while(1)
{
LED1 = 0; //点亮
delay_10us(50000);//大约450ms
LED1 = 1; //熄灭
delay_10us(50000);
}
}

点亮一个LED_D1_流水灯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**************************************************************************************
实验名称:LED流水灯实验
接线说明:
实验现象:下载程序后“LED模块”的D1-D8指示左右点亮
注意事项:
***************************************************************************************/
#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define LED_PORT P2 //使用宏定义P2端口

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i=0;

LED_PORT=~0x01;
delay_10us(50000);
while(1)
{
//方法1:使用移位+循环实现流水灯
// for(i=0;i<8;i++)
// {
// LED_PORT=~(0x01<<i); //将1右移i位,然后取反将结果赋值到LED_PORT
// delay_10us(50000);
// }

//方法2:使用循环+_crol_或_cror_函数实现流水灯
for(i=0;i<7;i++) //将led左移一位
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++) //将led右移一位
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}

点亮一个LED_D1库函数实现_流水灯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**************************************************************************************
实验名称:LED流水灯实验
接线说明:
实验现象:下载程序后“LED模块”的D1-D8指示左右点亮
注意事项:
***************************************************************************************/
#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define LED_PORT P2 //使用宏定义P2端口

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i=0;

LED_PORT=~0x01;
delay_10us(50000);
while(1)
{
//方法1:使用移位+循环实现流水灯
// for(i=0;i<8;i++)
// {
// LED_PORT=~(0x01<<i); //将1右移i位,然后取反将结果赋值到LED_PORT
// delay_10us(50000);
// }

//方法2:使用循环+_crol_或_cror_函数实现流水灯
for(i=0;i<7;i++) //将led左移一位
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++) //将led右移一位
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}

实验课程_蜂鸣器之无源蜂鸣器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**************************************************************************************
实验名称:蜂鸣器实验
接线说明:
实验现象:下载程序后蜂鸣器发出声音,一段时间后关闭
注意事项:
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

sbit BEEP=P2^5; //将P2.5管脚定义为BEEP

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u16 i=2000;

while(1)
{
while(i--)//循环2000次
{
BEEP=!BEEP;//产生一定频率的脉冲信号
delay_10us(100);
}
i=0;//清零
BEEP=0;//关闭蜂鸣器
}
}

实验课程_静态数码管

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**************************************************************************************
实验名称:静态数码管实验
接线说明:
实验现象:下载程序后“静态数码管模块”显示数字0
注意事项:
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
SMG_A_DP_PORT=~gsmg_code[0];//将数组第1个数据赋值给数码管段选口
while(1)
{

}
}

[toc]

Arch Linux 基础安装

本节从安装最基础的无图形化 ArchLinux 系统开始。官方安装指南

1.禁用 reflector

2020 年新版 archliveiso 加入了 reflector 服务,它会自己更新 mirrorlist。在特定情况下,它会误删某些有用的源信息。这里启动后的第一件事就是将其禁用。也许它是一个好用的工具,但是很明显,它并不适合在安装的时候面向新手启用,尤其在中国。

1
systemctl stop reflector.service

2.再次确保是否为 UEFI 模式

在一系列的信息刷屏后,可以看到已经以 root 登陆安装系统了,此时可以执行的命令:

1
ls /sys/firmware/efi/efivars

若输出了一堆东西,即 efi 变量,则说明已在 UEFI 模式。否则请确认你的启动方式是否为 UEFI。

3.连接网络

无线连接:

无线连接使用 iwctl 进行:

1
2
3
4
5
6
iwctl                           #进入交互式命令行
device list #列出设备名,比如无线网卡看到叫 wlan0
station wlan0 scan #扫描网络
station wlan0 get-networks #列出网络 比如想连接CMCC-5AQ7这个无线
station wlan0 connect CMCC-5AQ7 #进行连接 输入密码即可
exit #成功后exit退出

有线连接

正常来说,只要插上一个已经联网的路由器分出的网线(DHCP),直接就能联网。

可以等待几秒等网络建立链接后再进行下步测试网络的操作。

4.测试网络

1
ping www.gnu.org

稍等片刻,若能看到数据返回,即说明已经联网,ctrl+c 终止退出当前命令。如果还是无法连接,使用 ip link set xxx up 命令确认你已经激活了对应的网卡,再重新继续网络链接与测试。若看到类似Operation not possible due to RF-kill的报错,继续尝试rfkill unblock wifi来解锁无线网卡。[1]

5.更新系统时钟

1
2
timedatectl set-ntp true    #将系统时间与网络时间进行同步
timedatectl status #检查服务状态

6.更换国内镜像源加快下载速度

1
vim /etc/pacman.d/mirrorlist    #不会vim的同学,此处注意视频中的vim操作步骤

放在最上面的是会使用的更新源,把中科大 ustc 的或者清华的放在最上面。

7.分区

这里总共设置三个分区,可以满足绝大多数人的需求。此步骤会清除磁盘中全部内容,请事先确认。

  • EFI 分区: /efi 800M
  • 根目录: / 100G
  • 用户主目录: /home 剩余全部 越大越好

这里根目录的大小仅为参考,一般来说个人日常使用的 linux 分配 100G 已经够用了。根目录最小建议不小于 50G,根目录过小会造成无法更新系统软件包等问题。

首先将磁盘转换为 gpt 类型

1
2
3
4
5
lsblk                       #显示分区情况
parted /dev/sdx #执行parted,进行磁盘类型变更
(parted)mktable #输入mktable
New disk label type? gpt #输入gpt 将磁盘类型转换为gpt 如磁盘有数据会警告,输入yes即可
quit #最后quit退出parted命令行交互

接下来使用 cfdisk 命令对磁盘分区

1
2
cfdisk /dev/sdx #来执行分区操作,分配各个分区大小,类型
fdisk -l #复查磁盘情况

cfdisk 分区的详细操作见视频中的操作。一般建议将 EFI 分区设置为磁盘的第一个分区,据说有些主板如果不将 EFI 设置为第一个分区,可能有不兼容的问题。

8.格式化

这里的 sdax 只是例子,具体根据你的实际情况来,请注意视频中的操作。

1
2
3
#磁盘若有数据会问 'proceed any way?' y回车 即可
mkfs.ext4 /dev/sdax #格式化根目录和home目录的两个分区
mkfs.vfat /dev/sdax #格式化efi分区

9.挂载

在挂载时,挂载是有顺序的,需要从根目录开始挂载
这里的 sdax 只是例子,具体根据你的实际情况来,请注意视频中的操作。

1
2
3
4
5
mount /dev/sdax  /mnt
mkdir /mnt/home
mount /dev/sdax /mnt/home
mkdir /mnt/efi
mount /dev/sdax /mnt/efi

10.安装系统基础包

1
pacstrap /mnt base base-devel linux linux-firmware  #base-devel在AUR包的安装是必须的

功能性软件

1
pacstrap /mnt dhcpcd iwd vim sudo bash-completion   #一个有线所需 一个无线所需 一个编辑器  一个提权工具 一个补全工具 iwd也需要dhcpcd

11.生成 fstab 文件

fstab 用来定义磁盘分区

1
genfstab -U /mnt >> /mnt/etc/fstab

复查一下 /mnt/etc/fstab 确保没有错误

1
cat /mnt/etc/fstab

12.change root

把环境切换到新系统的/mnt 下

1
arch-chroot /mnt

13.设置主机名与时区

首先在/etc/hostname设置主机名

1
vim /etc/hostname

加入你想为主机取的主机名,这里比如叫 myarch。

接下来在/etc/hosts设置与其匹配的条目。

1
vim /etc/hosts

加入如下内容

1
2
3
127.0.0.1   localhost
::1 localhost
127.0.1.1 myarch.localdomain myarch

某些情况下如不设置主机名,在 KDE 下可能会存在网络情况变更时无法启动 GUI 应用的问题,在终端中出现形如No protocol specified qt.qpa.xcb: could not connect to display的错误,这种情况较为少见。相关参考链接:[1],[2]


随后设置时区,在/etc/localtime 下用/usr 中合适的时区创建符号连接。

1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

14.硬件时间设置

将系统时间同步到硬件时间

1
hwclock --systohc

15.设置 Locale

Locale 决定了软件使用的语言、书写习惯和字符集。

编辑 /etc/locale.gen,去掉 en_US.UTF-8 行以及 zh_CN.UTF-8 的注释符号(#)。

然后使用如下命令生成 locale。

1
locale-gen

向 /etc/locale.conf 输入内容

1
echo 'LANG=en_US.UTF-8'  > /etc/locale.conf

16.为 root 用户设置密码

1
passwd root

17.安装微码

1
2
pacman -S intel-ucode   #Intel
pacman -S amd-ucode #AMD

18.安装引导程序

1
2
pacman -S grub efibootmgr   #grub是启动引导器,efibootmgr被 grub 脚本用来将启动项写入 NVRAM。
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB #取名为GRUB 并将grubx64.efi安装到之前的指定位置

接下来编辑/etc/default/grub 文件,去掉GRUB_CMDLINE_LINUX_DEFAULT一行中最后的 quiet 参数,同时把 log level 的数值从 3 改成 5。这样是为了后续如果出现系统错误,方便排错。同时加入 nowatchdog 参数,这可以显著提高开关机速度。不会 vim 的同学注意视频中的操作。

1
vim /etc/default/grub

最后生成 GRUB 所需的配置文件

1
grub-mkconfig -o /boot/grub/grub.cfg

在某些主板安装完成后,你会发现没有启动条目。这是因为某些主板的 UEFI 固件在显示 UEFI NVRAM 引导条目之前,需要在特定的位置存放可引导文件,不支持自定义存放 efi 文件(如微星 Z170-A Gaming PRO)。解决方案是在默认启动路径下安装 GRUB。重新插入安装优盘,挂载目录,chroot 到/mnt,然后你可以直接把已经生成好的 efi 文件移动到默认目录下,如下代码所示。只有安装完成后你的主板不出现启动条目才需要尝试如下命令,正常安装无需执行。官方参考文档

1
2
mkdir -p /efi/EFI/BOOT
mv /efi/EFI/GRUB/grubx64.efi /efi/EFI/BOOT/BOOTX64.EFI

19.完成安装

1
2
3
exit                # 退回安装环境#
umount -R /mnt # 卸载新分区
reboot # 重启

注意,重启前要先拔掉优盘,否则你重启后还是进安装程序而不是安装好的系统。重启后,开启 dhcp 服务,即可连接网络

1
2
systemctl start dhcpcd  #立即启动dhcp
ping www.gnu.org #测试网络连接

若为无线链接,则还需要启动 iwd 才可以使用 iwctl 连接网络

1
2
systemctl start iwd #立即启动iwd
iwctl #和之前的方式一样,连接无线网络

到此为止,一个基础的,无 UI 界面的 Arch Linux 已经安装完成了。紧接着下一节,我们来安装图形界面。

archlinux 在 2021 年 4 月在安装镜像中内置了一个安装脚本,其就是类似一个一键安装脚本,提供一些选项,即可快速安装。其和所有一键安装脚本类似,提供自动化,且不灵活的安装过程。缺陷为:只提供有限的文件系统格式、只可限定在一个磁盘、不能指定源、只提供有限的桌面选择、自动分区不可手动干预、输入错误直接崩溃退出、仅支持 UEFI 等。不建议使用这种安装脚本,除了以上各种原因,初学者也无法在这种安装过程中学到任何东西。如果你因为任何原因需要快速启动一个基础的 archlinux 环境,那么可以尝试此脚本。

桌面环境与常用应用

官方文档: 安装后的工作
本节只介绍最基本的,能使系统真正意义上可用所需的组件
相关视频链接: 安装 KDE 与常用软件 视频文字结合效果更好
注: 文档中带有 AUR 角标的软件代表是用户自行打包的第三方软件AUR,不在 Arch 官方支持范围内,可能会出现更新不及时、无法安装、使用出错等各种问题。如果不是实在没有官方支持的同类软件,则不建议使用。

1.确保系统为最新

如果你在做完上一节的内容后,重启并放置过一段时间,那需要先按照上节末尾处的方式重新连接网络,然后更新系统。

1
pacman -Syyu    #升级系统中全部包

2.准备非 root 用户

添加用户,比如新增加的用户叫 testuser

1
useradd -m -G wheel -s /bin/bash testuser  #wheel附加组可sudo进行提权 -m同时创建用户家目录

设置新用户 testuser 的密码

1
passwd testuser

编辑 sudo 文件

1
EDITOR=vim visudo

找到这样的一行,把前面的注释符号#去掉,:wq保存并退出即可。

1
#%wheel ALL=(ALL) ALL

这里稍微解释一下 %wheel 代表是 wheel 组,百分号是前缀
ALL= 代表在所有主机上都生效(如果把同样的sudoers文件下发到了多个主机上)
(ALL) 代表可以成为任意目标用户
ALL 代表可以执行任意命令
一个更详细的例子:

1
2
%mailadmin   snow,rain=(root) /usr/sbin/postfix, /usr/sbin/postsuper, /usr/bin/doveadm
nobody ALL=(root) NOPASSWD: /usr/sbin/rndc reload

组 mailadmin 可以作为 root 用户,执行一些邮件服务器控制命令。可以在 “snow” 和 “rain”这两台主机上执行
用户 nobody 可以以 root 用户执行rndc reload命令。可以在所有主机上执行。同时可以不输入密码。(正常来说 sudo 都是要求输入调用方的密码的)

3.安装 KDE Plasma 桌面环境

1
pacman -S plasma-meta konsole dolphin  #安装plasma-meta元软件包以及终端和文件管理器

4.配置 greeter sddm

1
systemctl enable sddm

5.设置交换文件 swap

在桌面环境中,交换分区或文件用来实现休眠(hibernate)的功能,即将当前环境保存在磁盘的交换文件或分区部分。除此之外,某些特定软件需要 swap 才可以正确运行。交换文件与分区性能相同,且交换文件更为灵活,可随时变更大小,增加与删除。[1]

1
2
3
4
dd if=/dev/zero of=/swapfile bs=1M count=16384 status=progress #创建16G的交换空间 大小根据需要自定
chmod 600 /swapfile #设置正确的权限
mkswap /swapfile #格式化swap文件
swapon /swapfile #启用swap文件

最后,向/etc/fstab 中追加如下内容:

1
/swapfile none swap defaults 0 0

KDE 自身提供开箱即用的睡眠功能(suspend),即将系统挂起到内存,消耗少量的电量。休眠(hibernate)会将系统挂起到交换分区或文件,几乎不消耗电量。sleep 睡眠功能已可满足绝大多数人的需求,如果你一定需要休眠功能,可以参考官方文档设置休眠相关步骤。

6.开启 32 位支持库与 ArchLinuxCN 支持库

1
vim /etc/pacman.conf

去掉[multilib]一节中两行的注释,来开启 32 位库支持。
在文档结尾处加入下面的文字,来开启 ArchLinuxCN 源。

1
2
[archlinuxcn]
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch

上面服务器的地址是中科大的,也可用下面清华的。

1
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

此处为 archlinuxcn 全部仓库地址 可以根据自己实际情况另行选择。

最后:wq 保存退出,刷新 pacman 数据库

1
pacman -Syyu

重启电脑,即可看到欢迎界面,输入新用户的密码即可登录桌面

7.安装基础功能包

进入桌面后,搜索 konsole。它是 KDE 桌面环境默认的命令行终端。

首先先进行桌面环境中的网络设置:

1
2
3
sudo systemctl disable iwd                                                  #确保iwd开机处于关闭状态,其无线连接会与NetworkManager冲突
sudo systemctl stop iwd #同上,立即关闭iwd
sudo systemctl enable --now NetworkManager #确保先启动NetworkManager,并进行网络连接 若iwd已经与NetworkManager冲突 则执行完上一步重启一下电脑即可。

接下来安装一些基础功能包。

1
2
3
4
5
6
7
8
sudo pacman -S ntfs-3g                                                      #识别NTFS格式的硬盘
sudo pacman -S adobe-source-han-serif-cn-fonts wqy-zenhei #安装几个开源中文字体 一般装上文泉驿就能解决大多wine应用中文方块的问题
sudo pacman -S noto-fonts-cjk noto-fonts-emoji noto-fonts-extra #安装谷歌开源字体及表情
sudo pacman -S firefox chromium #安装常用的火狐、谷歌浏览器
sudo pacman -S ark #与dolphin同用右键解压 注意可同时安装可选解压支持项
sudo pacman -S packagekit-qt5 packagekit appstream-qt appstream #确保Discover(软件中心)可用 需重启
sudo pacman -S gwenview #图片查看器
sudo pacman -S steam #稍后看完显卡驱动再使用 专有软件

最后要安装 archlinuxcn 源的相关步骤。

1
2
sudo pacman -S archlinuxcn-keyring                                          #cn源中的签名(archlinuxcn-keyring在archLinuxCn)
sudo pacman -S yay #yay命令可以让用户安装AUR中的软件(yay在archLinuxCn)

若安装 archlinuxcn-keyring 时报错,是由于密钥环的问题,可先按照此链接执行其中的命令,再安装 archlinuxcn-keyring

8.设置系统为中文

打开 System Settings > Regional Settings > Language -> Add languages 中选择中文加入,再拖拽到第一位,Apply。

再将System Settings > Regional Settings > Formats 中的值设为中文-简体中文(zh_CN)

最后重新登陆即可。

很多人会错误的更改 System Settings > Regional Settings > Formats 中的值为中文蒙古(mn_CN),默认,或者其他值,这会导致系统中一半英文一般中文。这里的值要保持默认的 en_US 或 zh_CN,或者改为你在 locale.gen 中添加的任意一种语言。

9.安装输入法

Fcitx5 官方文档
中文及日文输入法均体验良好。

1
2
3
4
5
sudo pacman -S fcitx5-im #基础包组
sudo pacman -S fcitx5-chinese-addons #官方中文输入引擎
sudo pacman -S fcitx5-anthy #日文输入引擎
sudo pacman -S fcitx5-pinyin-moegirl #萌娘百科词库 二刺猿必备(ArchLinuxCn)
sudo pacman -S fcitx5-material-color #主题

设置环境变量 编辑文件 sudo vim /etc/environment 加入以下内容。konsole 以及 dophin 都需要这些环境变量,倒是 chrome 和 firefox 都不需要就可以输入中文

1
2
3
4
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx

打开 系统设置 > 区域设置 > _输入法_,先点击运行Fcitx即可,拼音为默认添加项。如你还需要更多输入法如五笔,则再点击添加输入法,找到简体中文下的五笔 ,点击添加即可加入五笔输入法。

接下来点击 拼音 右侧的配置按钮,点选云拼音在程序中显示预编辑文本 最后应用。

回到输入法设置,点击配置附加组件,找到 经典用户界面 在主题里选择一个你喜欢的颜色 最后应用。

注销,重新登陆,就可以发现已经可以在各个软件中输入中文了

10.配置系统默认编辑器

默认情况下,Arch Linux 在一些终端编辑场景使用 vi 编辑器,但是我们使用 vim。如果不做一个额外配置,在 git 等场景下,在终端调用编辑器会出错。编辑~/.bashrc 文件,加入如下内容,将 vim 设置为默认 EDITOR

1
export EDITOR='vim'

11.启动蓝牙(若有)

如果你有蓝牙设备,需要启用蓝牙服务。随后在系统设置中进行添加设备与连接即可。

1
sudo systemctl enable --now bluetooth