树莓派安装 CentOS8

我在树莓派上跑 ubuntu + docker 同步文件有一段时间了, 期间报错无数, 停机无数, 偶有出现cpu占用到100%, 以为是被攻击, 然后发现是 snapd 的bug.
也许 ubuntu 就是不适合做家用服务器?
所以有了下面这一篇文章, 纪录一下我的快速配置.

下载 Centos8 stream arch64 for pi
Copy连接下载
下载树莓派官方刷机工具
点击官网下载

刷入机器, ssh 连结.

  • 默认帐户: root
  • 默认密码: centos

基础配置

# 扩展瓷盘
rootfs-expand

# 设置时间并开启自动同步
# 你可能想要自己配置 ntp 服务器
# vi /etc/chrony.conf
# server s1a.time.edu.cn iburst
# server ntp.aliyun.com iburst

systemctl enable chronyd.service
systemctl restart chronyd.service
timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp true
echo '@reboot timedatectl set-ntp true' >> /etc/crontab
timedatectl

# 安装扩展库
yum install epel-release -y
yum update -y

# 安装基础工具
yum install vim git make ufw -y

# 设置防火墙
ufw allow from 192.168.10.1/24 # ufw allow ssh
ufw default deny
ufw enable
ufw status # 将多余的配置删掉

# 设置网路
nmtui

那么, 基础设置已经完成了, ufw 已经配置只允许局域网访问的缘故, 怕烦不设自定义密码也是可以的.

 登陆配置

# 更改默认 root 密码
passwd root

# 配置 ssh 连结
cd ~/
mkdir .ssh
chmod 700 .ssh
vi /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys # 将你的公钥复制进去
vi /etc/ssh/sshd_config # 配置ssh登录

sshd_config 中分别修改下面几句

LoginGraceTime 10m                 #afk达10min自动登出
PermitRootLogin prohibit-password  #只允许root用ssh登录
MaxAuthTries 6                     #最多允许三次错误登录尝试
MaxSessions 10                      #最多允许三个client同时登录

PubkeyAuthentication yes           #开启公钥登录

AuthorizedKeysFile      .ssh/authorized_keys #开启公钥

PasswordAuthentication no          #不允许任何用户使用密码登录
PermitEmptyPasswords no            #不允许任何空密码用户登录
systemctl restart sshd.service
systemctl status sshd.service
# 确认 status 没问题
exit # 现在请重新登陆

我自己的设置 备忘

# 开机挂载网络硬盘
@reboot curlftpfs -o rw,allow_other ftp://username:[email protected]/ /media/ftpdrive

# 开机挂载硬盘
# 卸载一定要 umount, rm 挂载点会删掉你所有文件, 切记!
mkdir /media/backup
mount /dev/sda1 /media/backup
blkid # 复制显示的 uuid 和 瓷盘类型
echo 'UUID=cc01ef19-892e-4eaf-862a-4f7b9cab3c0f /media/backup ext4 defaults 1 2' >> /etc/fstab
mount -a # 非常重要! 有报错不解决 下次开不了机

# 安装宝塔
cd /tmp
curl -sSO http://download.bt.cn/install/install_panel.sh && bash install_panel.sh
y

Qt 添加 Mysql 驱动

需求

Qt 自带的 SQLITE 驱动, 只支持本地的数据库 . 而能支持在线数据库的 QMYSQL 需要自己编译.
本文的环境使用的是 MacOS Bigsur, Qt版本 5.14.2. ( Qt 不能为从 Brew 安装的版本! )

解决方案

前往 官网 下载 SQLServer, 安装到本地.
我们不需要他开机启动, 安装他只是为了获得他提供的 Lib, 所以进设置关掉开机启动.

乘著下载的时间, 我们设置一下 PATH

export QTDIR=/opt/Qt/5.14.2/clang_64
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=$QTDIR/bin:$PATH
export PATH="/usr/local/mysql/bin:$PATH"

可以试一试运行 mysql, 如果能跑起来, qt 就应该可以监测到.

下载、安装完成后, 定位到 Qt 安装的目录:

cd /opt/Qt/5.14.2/src/qtbase/src/plugins/sqldrivers

(我安装在/Opt目录里面, 你的可能在其他地方.)

然后运行如下指令:

$ qmake -- MYSQL_PREFIX=/usr/local/mysql

Info: creating stash file /opt/Qt/5.14.2/Src/qtbase/src/plugins/sqldrivers/.qmake.stash

Running configuration tests...
Checking for DB2 (IBM)... no
Checking for InterBase... no
Checking for MySQL... yes
Checking for OCI (Oracle)... no
Checking for ODBC... no
Checking for PostgreSQL... no
Checking for SQLite (version 2)... no
Checking for TDS (Sybase)... no
Done running configuration tests.

Configure summary:

Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. yes
  OCI (Oracle) ........................... no
  ODBC ................................... no
  PostgreSQL ............................. no
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... no

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into '/opt/Qt/5.14.2/clang_64'.

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

如果你像我一样看到 Mysql 对应的是yes, 那么就可以进入下一步了.

make sub-mysql

如果没有报错的话, 可以接著运行:

make install

现在 再次编译程序, 应该已经可以正常工作了.

如果需要打印当前 Qt 支持的驱动, 可以参考以下程序:

#include "mainwindow.h"
#include <QApplication>
#include <QtSql>

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	qDebug() << "Available drivers:";
	QStringList drivers = QSqlDatabase::drivers();
	foreach(QString driver, drivers)
		qDebug() << "\t" << driver;
	return a.exec();
}
安装完毕后以上程序输出

踩坑

  • 如果你需要在其他系统上正常运作程序, 你可能需要将 lib 文件拷贝过去, lib 文件位于 /opt/Qt/5.14.2/src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers
  • 如果你用 qt5 的话, 强烈建议使用最新版. 比较旧的如 5.9 编译时会报错.
  • 如果你在没有配置完成的情况下运行了一次 qmake , 然后后面怎样 make 都提示 no, 应该是没有把第一次 make 出来的东西清理干净, 首先

    make distclean #删除 make 制造出来的所有文件

    然后参考 Qt 的 repo 把目录里多出来的东西清理一下 (注意你的版本要保持一致).
  • 如果不小心误删了文件其实也是没有关系的, clone 一下 qt 的 repo 然后把对应版本的代码考到你的 qt 安装目录重新安装就可以了.

Qt IDE 从文件夹导入源代码

需求

– 现有一个下载好的 Qt 项目
– 项目里有很多子文件夹, 没有 Pro 文件
– 想要导入这个项目, 生成 Pro 文件

解决方案

在源代码根目录下运行以下指令,生成 .pro 文件

qmake -project

打开 Qt Creator,点击导入项目,这个时候应该会出现 Configure Project 的界面 (如果没有,自己点击左侧的 Project 按钮配置)

点击 “Import build from…”, 选择包含源代码根目录的文件夹(包含.pro文件的文件夹的上级目录),点击 Import

点击 “Configure Project”, 等待…

项目导入完成.

文件夹开放权限给用户组

当访问一个文件夹遇到 AccessDenied的时候:

chmod777 解决一切问题

但是内心总有一丝丝的不安:这好吗?

这不好。

chmod + 数字的具体解释

从上图可以看到,chmod777其实给予了所有用户对这个文件夹的完全权限,如果是PC还好,是Server的话,给/www来个chmod777,后果简直不堪设想。

解决方案

我的临时解决方案是,对于所有管理员账户(就是可以用sudo的)开放权限:

chgrp sudo folder
chmod 770 folder

权限命令

和权限有关的常用命令:

  • chmod [参数] [文件/目录]: 修改某一个文件/目录的权限
  • chgrp [组名] [文件/目录]: 修改某一个文件/目录的所有组
  • chown [用户] [文件/目录]: 修改某一个文件/目录的所有者
  • ll: 类似于ls,但是列出了详细信息,包括权限

Aptitude 命令

OS: Debian based systems

Wiki: aptitude-debianWiki

使用场景

这个玩意是一个 ncurses based 图形界面包管理器(同时也可以命令行交互)

  • 可以使用鼠标和键盘操作(很方便)
  • 无论是gui还是tui都提供完整中文支持
  • 支持类正则方式匹配软件包
  • 将软件包分类,比如「自动安装和手动安装」,支持修改状态为自动安装或手动安装
  • 提供离线和在线的手册(不要这么友好啊啊啊),支持多语种
  • 这个软件包还内置扫雷 (悄悄说)

可以分析软件包的依赖关系,找出没有卸载彻底的软件,没有任何依赖关系的软件,离线安装的软件(无source)等等。

安装方式

可以使用apt 安装

sudo apt update -y
sudo apt install aptitude -y

常用方法

清理废弃包

常常是source不存在的包

# 查看 (以下2个等价)
aptitude search "~o"
aptitude search ?obsolete
# 清除
sudo aptitude purge "~o"

警告,一般来说这种包很少,有的如单个deb安装的包(如wps),不要乱删。

清理rc包

卸载不彻底,还残留这配置文件的包

一般来说rc包的特征是卸载的时候会提示要卸载 0B,(就是只移除配置文件)

# 查看
aptitude search "~c"
# 清除
sudo aptitude purge "~c"

Apt-file 命令

OS: Debian based systems
Wiki: apt-file-debianWiki

使用场景

当遇到“某某某命令是在那个包里的”,或者“我要找某某命令应当下载那个软件包”的时候可以用到这个命令。

比如说,我想要启动qt配套的 qt-designer 和 qt-assistant,然后命令行给我报错,提示:

➜ assistant 
assistant: could not exec '/usr/lib/qt5/bin/assistant': No such file or directory
➜ designer
designer: could not exec '/usr/lib/qt5/bin/designer': No such file or directory

碰到这种情况,我可以使用 apt-file 命令来查找这个二进制文件在哪个包里面出现,比方说:

➜  apt-file search bin/assistant
qt5-assistant: /usr/lib/qt5/bin/assistant 
qt5-assistant: /usr/lib/x86_64-linux-gnu/qt5/bin/assistant
qtchooser: /usr/bin/assistant

(qtchooser只是一个wrapper,用于启动sdk中的帮助,而剩下的是真正的二进制程序)

(其实sdk里面已经包括了designer和assistant, 有qt creator的同学不用费劲去下载这两个了)

安装方式

可以使用apt 安装

sudo apt update -y
sudo apt install apt-file -y

安装完毕之后还需要通过apt-file更新一下数据库,让apt-file有对apt数据库的访问权限。(建议每次使用前都更新一下)

sudo apt-file update

其他用法

根据 wiki , apt-file还存在一个被动模式,可以被dpkg调用(好像是), 使用 dpkg -S 加上 文件名 来查询。

➜  dpkg -S libmp3lame.so.0
libmp3lame0:amd64: /usr/lib/x86_64-linux-gnu/libmp3lame.so.0

官网提示:dpkg -S 的方案只能查询本地 package , 而 apt-file 可以联网查询所有安装和未安装的 package.

使用 SSH 命令代理上网

没有SSH伺服器?你可以试着在某些公开SSH平台上永久获得一台。
猛击右侧链接永久获得SSH伺服器: 点击前往SDF.org

SSR突然用不起来?你的路由器挂掉了?唯一的解决办法不在墙内?
你需要一个方便而快速的方式直接使用你的伺服器作为代理,而不通过一些复杂的诸如SSR/V2RAY的上网协议。
请敲入如下命令以使用 SSH 代理:

ssh -qTfnN -D 1080 [email protected]

这个命令会为你在 后台 开放 1080 端口, 使用加密的 ssh 连接到 服务器,将其用作代理。
你接下来可以配合 swichyOmega 等浏览器插件 或者 直接在系统配置代理端口为 1080/socks5 愉快的上网了!

Edit: 不用尝试 ssh [email protected], 这个域名只映射了 web 服务.

Sudo 命令免输入密码

在网上搜了一下 sudo 免除密码,发现几个没讲清楚的地方。

于是我把这些误区汇总一下,方便以后查看。

正确的 sudo 姿势 ✔

为了避免留下错误的第一印象,先提出来正确的sudo姿势。

首先,在你的终端敲入如下指令:

sudo visudo # 用vi编辑 /etc/sudoers

在弹出的窗口中按 G 定位到 最后一行 ,按 o 另起一行,输入:(复制然后 shift+insert 粘贴)

# Extra users can run sudo without password
# 请将 username 替换为你的用户名
username  ALL=(ALL:ALL) NOPASSWD: ALL

Esc , 输入 :wq 保存退出。

注销再登录,sudo su 发现问题解决了!

错误的 SUDO 害死人 ✗

错误死法一:命令糊涂

糊里糊涂就别写“ps”啦!

真的如他所说四行任意一条都可以吗?

首先先不说前两条属于离题万里 是添加到sudo 组而不是免密运行,第三行我实测过就是不行的。

因为如果你没有写在 文件尾部 而是像文章所述写在 root 下面的话你的用户设置会被 %admin 组设置给覆盖掉!最终什么都不会发生!

糊涂写法正确率 1/4, 25%。

错误死法二:修改 sudoers 权限

你知道怎么切换到 root, 好棒棒喔

我且不说这个缝合怪明明已经是 root 了为什么还要添加写权限,这个例子还算是安全的。网上有些教程直接让你把 sudoers 的权限给予当前用户,真是吓得我一跳。系统文件的权限你也是可以随便交付的,一旦交付这个账户就成为单点故障,一个泄漏全盘泄漏。而且这种认为 bug 被添加上去之后还不好查,毕竟没人天天注意各个文件的权限。

错误死法三:使用自动应答

C某DN 上的一种普遍方法

这个… 何止是有隐患, 把它用在生产环境简直就是报复社会。很明显可以看到这个命令将 /tmp/pass 作为缓冲区明文保存密码, 用完连删都懒得删…

/tmp 目录作为一个权限开放的目录,别人完全可以监控这个目录的文件变化。所以就算是 pass 文件删掉也是不安全的啦!

而且就算就算他直接将 echo 的内容定向到 sudo 里面,也是不安全的。任何明文储存的密码都存在隐患(何况是存在环境变量里!) sudo 之所以要密码当然不是为了来防管理员,如果有人有与你的电脑 “亲密接触” 的机会 , 他可以在很短的时间里面将你的 管理员密码 都搞到. ( 不过不要给别人这个机会就是了! )

Ubuntu 美化 – 安装主题与插件

在执行以下步骤之前,请确认你可以访问以下这两个网站:

  • https://extensions.gnome.org/
  • https://www.gnome-look.org/

安装依赖

在命令行执行以下命令。

sudo apt install gnome-shell-extensions # 安装插件管理器
sudo apt install gnome-tweak-tool # 安装主题管理器

访问 Chrome 在线商店下载 浏览器配套插件。(使用其他浏览器就去网上搜插件)

点击前往Chrome在线商店

然后访问 extensions.gnome.org, 安装 User Themes 和 Extensions。

配置完成之后访问 Installed Extensions 应该看到如下画面。

然后点进以下网址安装 ocs-url 。这个软件使你无需手动下载安装主题,可以一键安装。

OCS-URL: https://www.opendesktop.org/p/1136805/

定制外观

安装鼠标指针

我中意的鼠标指针是 Oreo Cursors,链接在下方

Oreo Cursors: https://www.gnome-look.org/p/1360254/

安装完后请到 优化(Tweaks) 中设置。

安装图标包

我中意的图标包是 这款 8.9 分高分的 Material 风格图标包。

Tela Circle icons: https://www.gnome-look.org/s/Gnome/p/1359276/

这个还有一个姊妹包 叫 Tela icons, 辨识度比这个略高。不过我嫌那个风格不如这个统一,就选择略这个。

安装主题

请自行点击下列链接安装 Materia.

Materia: https://github.com/nana-4/materia-theme

注意! 你在装完主题之后还可以进行一些配套设置!

Materia配套设置: https://github.com/nana-4/materia-theme#recommendations

安装 额外的Shell

如果你喜欢一个看起来更加紧凑,更加 responsible 的工作环境,你可以选择下面一款插件。

Material Shell: https://github.com/material-shell/material-shell

这一款插件算是 Material 在 Linux 上的集大成之作,将 你的 Linux 直接改造成一个类似安卓的界面。充分利用的屏幕空间使得工作区最大化,直接将工作区选项摆在屏幕左边,而且如果你拥有一个类似 surface 的支持触屏的设备,这个插件就是你的最佳选择。
这个插件推荐的主题是 Plata, 但是也和 Materia 主题无缝结合。

定制 Grub

推荐下载这个主题,

Tela Grub theme: https://www.gnome-look.org/p/1307852/

然后解压后直接

sudo bash ./install.sh

配置完成!

至此所有的配置都已经完成了!