Ubuntu/Debian开发板系统初始化配置最佳实践

用途说明

目的

充分利用小型开发板的算力,实现个人服务器
配置包括Jekins、Git、Github WebHook、内网穿透

适用系统、硬件

debian10及更高版本(lsb_release -acat /etc/redhat-releaseuname -a
文章所使用硬件:Tinker Board 2s

操作速览

  1. 基础配置篇
    1. 开启SSH服务并设置开机自启动
    2. 修改密码
    3. (推荐)关闭图形化界面、禁用自动休眠
    4. 挂载硬盘最佳实践
    5. 自动上报局域网IP
    6. 系统重装与备份
  2. 持续集成篇
    1. 安装Docker与(可选)图形化管理界面Portainer
    2. Jekins最佳实践
    3. (可选)搭建自己的gitlab代码库
  3. NAS篇
    1. 内网穿透最佳实践
  4. 进阶篇
    1. 安装Kubernetes
    2. 安装k3s(开发板或单节点云服务器推荐)

1. 基础配置篇

1.1 开启SSH服务并设置开机自启动

Debian从8.0开始,默认关闭了SSH
1、修改sshd_config文件,命令为:nano /etc/ssh/sshd_config

2、将#PasswordAuthentication no的注释去掉,并且将NO修改为YES

3、将#PermitRootLogin yes的注释去掉,允许Root账号登录

4、启动SSH服务,命令为:/etc/init.d/ssh start 或者service ssh start

5、验证SSH服务状态,命令为:/etc/init.d/ssh status

  1. 添加开机自启动,推荐使用systemd,参考阮一峰的文章
    可能出现的问题:https://blog.csdn.net/Peter_JJH/article/details/108446380

1.2 修改密码

Tinker Board 2s默认的初始账号密码是账号:linaro 密码:linaro
修改root密码sudo passwd root
输入新密码
修改linaro密码sudo passwd linaro

1.3 (可选)关闭图形化界面、禁用自动休眠

目的:降低功耗,服务器无需图形化界面
关闭图形化界面systemctl set-default multi-user.target
切换回图形化界面 sudo systemctl set-default graphical.target
检查当前的target unit,确认已关闭 systemctl get-default
重启机器:sudo systemctl reboot

关闭自动休眠

systemctl status sleep.target systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemctl status sleep.target

1.4 挂载硬盘

挂载硬盘与永久挂载
目的:挂载硬盘后可将重要数据都放置到硬盘中,开发板需要系统升级时,硬盘数据不受影响。

1.4.1 错误示例/etc/fstab

挂载硬盘:
查看硬盘信息 fdisk -l
(可选)分区操作 fdisk /dev/sdb1
挂载硬盘到/mnt目录 mkfs -t ext4 /dev/sdb1
查看硬盘信息 mkfs -t ext4 /dev/sdb1

永久挂载代表机器重启后仍能自动挂载到系统
Debian 使用 UUID 来实现硬盘自动挂载。

  1. 通过 blkid 查找所有硬盘的 UUID:sudo blkid
    可以看到挂载的硬盘 /dev/sdb1 的 UUID 为:ad5f412a-0a0c-42af-afd3-eecec6fd96d2 ,TYPE 为:ext4 。
  2. 添加自动挂载点sudo vim /etc/fstab
    在最后一行添加:UUID=ad5f412a-0a0c-42af-afd3-eecec6fd96d2 /mnt ext4 defaults 0 0
  3. 执行挂载sudo mount -a
    查看挂载点:df -h
    这时,sudo reboot 重启后挂载点依然存在。

为什么它是一个错误示例

  1. 当你的硬盘出现问题时,或者硬盘uuid填写出错时,你的开发板在重启时无法挂载该硬盘,导致系统无法启动;

  2. 而开发板不像是家用计算机,有bootloader界面可以进入急救模式。

也就是说,一旦磁盘出现问题,开发板系统将无法进入,必须重装系统!重装系统!重装系统!

1.4.2 最佳实践

写入/etc/fstab的方式风险过高,有没有一种方式,哪怕挂载失败了,系统也能正常启动?当然我们不可能每次手动执行挂载命令。

我们可以写一个开机启动的服务,执行一个脚本即可

touch /usr/bin/initmount.sh

#!/bin/bash sleep 2s && mount /dev/sda2 /mnt/docker && \ mount /dev/sda3 /mnt/fs && \ mount /dev/sda1 /home

创建service,执行touch /etc/systemd/system/mountdisk.service , 编辑内容

[Unit] Description=Service mount disk Requires=local-fs.target [Service] Type=simple ExecStart=/usr/bin/initmount.sh [Install] WantedBy=multi-user.target

执行

systemctl enable mountdisk

更进一步,如果你的磁盘分区会用于存储docker的镜像,需执行vim /lib/systemd/system/docker.service,保证先执行磁盘挂载脚本再启动docker。添加后示意:

# 仅docker.Unit的部分内容 [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service containerd.service time-set.target mountdisk.service Wants=network-online.target containerd.service Requires=mountdisk.service docker.socket

1.5 自动上报局域网IP

推荐加入到/usr/bin/initmount.sh脚本中,随系统启动。

由于本人有购买云服务器,后续将利用该服务器实现frp内网穿透,因此在这里采用了scp ip信息到了云服务器,实现ip上报

apt-get install -y sshpass

#!/bin/bash ifconfig>/tmp/ip.tmp # root@公网IP地址 ip=116.205.71.2 # 机器密码 pass=mabaoguo sshpass -p $pass ssh -o StrictHostKeyChecking=no root@$ip 'rm -f /tmp/ip.tmp' sshpass -p $pass scp /tmp/ip.tmp root@$ip:/tmp mount /dev/sda1 /mnt/docker && mount /dev/sda2 /mnt/fs

1.6 系统重装与备份

重装后无论是ssh配置或挂载都消失了,最佳方式为记录一个脚本,每次重装后执行脚本将之前做过的操作都重来一遍

todo

2. 持续集成篇

2.1 安装Docker与(可选)图形化管理界面Portainer

安装docker

参考《菜鸟教程

curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh

不推荐安装图形化管理界面Portainer

安装docker就够了,安装图形化失去了docker容器可以一键执行的简便,只剩下可视化的用途了。笔者在使用Portainer后最终放弃了,如果有可视化docker运行状态的需求,可以安装Portainer试试,但不要拿它来启动容器,因为那么多的参数要填写,如果不懂参数的用途,Portainer里是不知道怎么配置的。

2.2 Jekins最佳实践

https://juejin.cn/post/6991303151051603999

docker run -u root --rm -d -p 8181:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/lib/jenkins/secrets:/var/lib/jenkins/secrets -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean:1.25.7-bcc31d32159f

查看初始密码cat /var/lib/jenkins/secrets/initialAdminPassword

3. NAS篇

3.1 内网穿透最佳实践

3.2 配置QBitTorrent

  • 开发板上使用docker安装QBitTorrent服务
  • 手机安装客户端

一键执行脚本

sed -i '0,/PasswordAuthentication/ s/PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config sed -i '0,/PasswordAuthentication/ s/PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config sed -i '0,/PermitRootLogin/ s/PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config systemctl enable ssh mkdir /mnt/docker && mkdir /mnt/fs cat << EOF > /usr/bin/initmount.sh #!/bin/bash sleep 2s && mount /dev/sda2 /mnt/docker && \ mount /dev/sda3 /mnt/fs && \ mount /dev/sda1 /home EOF chmod +x /usr/bin/initmount.sh cat<<EOF>/etc/systemd/system/mountdisk.service [Unit] Description=Service mount disk Requires=local-fs.target [Service] Type=simple ExecStart=/usr/bin/initmount.sh [Install] WantedBy=multi-user.target EOF systemctl enable mountdisk systemctl start mountdisk cp /etc/apt/sources.list /etc/apt/sources.listbak cat << EOF> /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free # deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free # # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free deb https://security.debian.org/debian-security bullseye-security main contrib non-free # deb-src https://security.debian.org/debian-security bullseye-security main contrib non-free EOF apt-get update -y systemctl status sleep.target systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemctl status sleep.target systemctl get-default systemctl set-default multi-user.target systemctl get-default echo "create docker" curl -fsSL https://get.docker.com -o get-docker.sh bash get-docker.sh cat << EOF > /etc/docker/daemon.json { "registry-mirrors":["https://reg-mirror.qiniu.com/"], "data-root": "/mnt/docker/data-root" } EOF systemctl daemon-reload systemctl restart docker # zerotier curl -s https://install.zerotier.com | sudo bash #sudo zerotier-cli join 8bd5124fd6b27e9e sudo zerotier-cli join 8bd5124fd6b27e9f sudo reboot

debian10

sudo timedatectl set-timezone Asia/Shanghai sed -i '0,/Port/ s/#Port.*/Port 8022/' /etc/ssh/sshd_config sed -i '0,/#PasswordAuthentication/ s/#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config sed -i '0,/PermitRootLogin/ s/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config systemctl enable ssh mkdir /mnt/docker && mkdir /mnt/fs cat << EOF > /usr/bin/initmount.sh #!/bin/bash if ! mountpoint -q /mnt/fs; then mount /dev/sda3 /mnt/fs else echo "/mnt/fs is already mounted." fi if ! mountpoint -q /mnt/docker; then mount /dev/sda2 /mnt/docker else echo "/mnt/docker is already mounted." fi if ! mountpoint -q /home; then mount /dev/sda1 /home else echo "/home is already mounted." fi EOF chmod +x /usr/bin/initmount.sh cat<<EOF>/etc/systemd/system/mountdisk.service [Unit] Description=Service mount disk Requires=local-fs.target [Service] Type=oneshot ExecStart=/usr/bin/initmount.sh [Install] WantedBy=multi-user.target EOF systemctl enable mountdisk systemctl start mountdisk cp /etc/apt/sources.list /etc/apt/sources.listbak cat << EOF> /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free deb-src http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free # deb http://security.debian.org/debian-security buster/updates main contrib non-free # deb-src http://security.debian.org/debian-security buster/updates main contrib non-free EOF apt-get update -y systemctl status sleep.target systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemctl status sleep.target systemctl get-default systemctl set-default multi-user.target systemctl get-default echo "create docker" apt install fuse-overlayfs -y curl -fsSL https://get.docker.com -o get-docker.sh bash get-docker.sh cat << EOF > /etc/docker/daemon.json { "registry-mirrors":["https://reg-mirror.qiniu.com/"], "data-root": "/mnt/docker/data-root" } EOF systemctl daemon-reload systemctl restart docker # zerotier curl -s https://install.zerotier.com | sudo bash sudo zerotier-cli join 8bd5124fd6b27e9e reboot

tinker-config可以编辑系统配置,包括远程VNC、SSH、账号密码


__EOF__

本文作者钟子期
本文链接https://www.cnblogs.com/nishiliu/p/17008043.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   钟子期  阅读(434)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示