坑边闲话:Linux 的系统初始化教程对新手非常有帮助,本文提供一个合适的流程化操作,方便用户使用相关服务。从第一步开始就进入了 ssh 模式。

本文略过 Debian 12 的安装过程,但是假设用户在选择服务器角色的时候勾选了 SSH-Server 选项。如果没有勾选,接下来需要在 KVM 界面手动安装 openssh-server.

1. 配置常规用户·

首先进入路由器(这里以 OpenWrt 为例)后台,查看 dhcp 地址分配数据,找到新系统被分配的 IP 地址,随后使用 ssh 客户端连接到 debian 12 系统。

关于先配置网络,还是先配置 sudo 用户,我个人认为无论哪个先行,都必须输入一次“繁琐的” root 密码,因此最好是先配置用户,这样以后都用 sudo 来配置,简单省力。

1
2
3
4
5
6
7
8
9
# 1. 切换到 root 用户
su
# > [输入 root 密钥]

# 2. 赋予 ${USERNAME} 用户 sudo 权限
/usr/sbin/usermod -aG sudo ${USERNAME}

# 断开 ssh 连接并重新登录
ssh ${USERNAME}@<ip>

如果用户不存在,则要用命令创建合适的用户:

1
2
3
4
sudo useradd -u <USER_ID> -m -s /usr/bin/zsh ${USERNAME}

# 将用户从组里移除
gpasswd -d ${USERNAME} <GroupName>

特别注意:<USER_ID> 需要小心设置,一般这是一个大于 1000 的整数,如果要使用 NAS 上的 NFS 共享,则最好让 NAS 用户与本机用户的 UID 相同。

2. 设置 ssh-server 配置·

一般来说,通过 ssh 公钥验证的方式登录最为安全,因此我们连接到新系统的第一步就是配置登录方式。

2.1 设置常规用户的授权公钥·

使用 ssh-keygen 生成一套密钥。

1
2
mkdir -p ~/.ssh
touch ~/.ssh/id_ecdsa ~/.ssh/id_ecdsa.pub && chmod 600 ~/.ssh/id_ecdsa

将通用 ecdsa 公钥添加到授权列表里:

1
echo 'ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAGwcEs0xLUh45IbCnMZhAA55oTXKq+3Ez3m6ylsgYofzfTlLt2mW0FMevUWuTQfem3mostbRYU3iARZaxT2jAtP5QGjt2aMevUfpUhi6604M8LB7DKk7N3T2LX5Qs/epCwZdF89o/FtFA2Zjul7XKkuuFAEwFh1yYxzlczz/SeIXBoGXA== newton@pubkey-v2' >> ~/.ssh/authorized_keys

注意:请将上方代码里的 ecdsa 公钥换成你自己的公钥。

随后,编辑 /etc/ssh/sshd_config 文件以修改 sshd 的配置

1
sudo nano /etc/ssh/sshd_config

修改相关字段为如下内容

1
2
3
PasswordAuthentication no
PubkeyAuthentication yes
Port <SSH_PORT>

,这将起到以下作用:

  • 关闭密码登录
  • 只开启 ssh 公钥认证
  • 更改 ssh 服务的端口为<SSH_PORT>

提示:也可以通过以下 sed 命令修改 /etc/ssh/sshd_config

1
2
3
sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^PubkeyAuthentication .*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^Port .*/Port <SSH_PORT>/' /etc/ssh/sshd_config

最后,执行下列命令重启 sshd 服务:

1
sudo systemctl restart sshd.service

以后即可使用 ssh 公钥直接登录。

2.2 配置常规用户的公私钥·

在用户的家目录下,有 .ssh 文件夹,里面存放了用户的公钥、私钥等文件。建议先通过 ssh-keygen 生成,随后再使用编辑器修改,保证两个文件的权限正确性。直接创建可能导致文件权限不符合要求,无法生效。先前的创建式操作已经生成了 id_ecdsa 私钥,并设置权限为 600,因此可以继续。

ecdsa 私钥:

1
敏感信息:PASS

ecdsa 公钥:

1
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAGwcEs0xLUh45IbCnMZhAA55oTXKq+3Ez3m6ylsgYofzfTlLt2mW0FMevUWuTQfem3mostbRYU3iARZaxT2jAtP5QGjt2aMevUfpUhi6604M8LB7DKk7N3T2LX5Qs/epCwZdF89o/FtFA2Zjul7XKkuuFAEwFh1yYxzlczz/SeIXBoGXA== newton@pubkey-v2

2.3 配置 root 用户的公私钥·

重复上述两个步骤即可,此处不再赘述。

3. 配置 apt 源并安装常用软件·

在国内使用 dpkg 进行软件拉取非常不方便,因为 GFW 的存在使得国际访问体验很差,加上中国大陆的国际出口带宽很低,体验更是糟糕。通过使用国内的 apt 源,可以极大地缓解该问题。

3.1 编辑 /etc/apt/sources.list·

1
2
# 1. 换源 (不能用 `vim`,因为还没安装)
sudo nano /etc/apt/sources.list

nano 有如下快捷键:

  • Ctrl + K — 删除行
  • Ctrl + O — 保存
  • Ctrl + X — 退出

随后将文件全文替换为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware

# deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware

deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

无需重启任何服务,即可使用新的源。如果要正确配置源优先级,可编辑 /etc/apt/preferences.d/stable 文件:

1
sudo nano /etc/apt/preferences.d/stable

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Package: *
Pin: release a=stable
Pin-Priority: 900

Package: *
Pin: origin "deb.nodesource.com"
Pin-Priority: 700

Package: *
Pin: origin "download.docker.com"
Pin-Priority: 700

Package: *
Pin: origin "pkgs.tailscale.com"
Pin-Priority: 700

其中,Pin-Priority 的数值越高,代表优先级越高。

为了让每次 apt 操作都显示版本号,可以编辑 apt 配置项目:

1
sudo nano /etc/apt/apt.conf.d/99show-versions

文件内容如下:

1
APT::Get::Show-Versions "true";

如此一来,每次使用 apt 操作软件均会提示包版本号。

3.2 安装常用软件·

常用以下软件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 更新 apt
sudo apt update

# 2. 删除 libreoffice 这个从来都不用的软件,然后 autoremove 一些绝对不用的软件
sudo apt remove --purge "libreoffice*" ; sudo apt autoremove

# 3. 升级现有软件 (应该不多,否则就是你没选择合适的 DVD 镜像)
sudo apt update && sudo sudo apt upgrade && sudo apt dist-upgrade

# 4. 安装常用软件
sudo apt install cockpit cockpit-pcp
sudo apt install bat curl exiftool mediainfo pandoc ripgrep rsync tmux tree wget zsh
sudo apt install bridge-utils iperf iperf3 net-tools systemd-resolved systemd-timesyncd

# ==> 编辑 /etc/systemd/resolved.conf

sudo apt install btop duf gdu htop iotop neofetch open-vm-tools prometheus-node-exporter s-tui sysstat
sudo apt install cifs-utils fio nfs-common open-iscsi
sudo apt install bison clang cmake flex g++ gcc gdb git luarocks make openjdk-17-jdk repo ruby rust-all vim
sudo apt install libssl-dev

# 5. 后面会单独配置 docker-ce,因此不要安装 docker.io

注意

安装了 systemd-resolved 之后有可能无法上网,毕竟该服务会重新配置系统 DNS. 无妨,直接修改配置文件:

1
sudo nano /etc/systemd/resolved.conf

将配置文件中的 DNS 改成内网 DNS 即可!

3.3 配置 Python·

3.3.1 安装 miniconda·

1
2
mkdir ~/bin && cd ~/bin
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh >> /tmp/Miniconda3-latest-Linux-x86_64.sh && bash /tmp/Miniconda3-latest-Linux-x86_64.sh

期间要输入目录,笔者建议输入以下内容:

1
/home/${USERNAME}/bin/miniconda3

随后断开 ssh,并重新登录。

3.3.2 安装常见的 Python 包·

1
2
3
conda install python
conda upgrade --all
conda install jupyter ipython

3.4 获取 golang·

Go 是很重要的一个基础语言,目前很多 NeoVim 的插件也依赖 Go 环境。然而,Debian 的上游中 Go 版本较低。为此我们选择手动安装。

转到 Go 官网下载页面

执行以下脚本:

1
2
3
4
cd /tmp
wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf /tmp/go1.23.1.linux-amd64.tar.gz

3.5. 获取 neovim·

目前 NeoVim 最新版 v0.10 尚未集成到 apt 库,所以需要手动安装。这里笔者选择 appimage 格式。可通过 NeoVim GitHub 仓库 Release 界面查看最新版本。

执行下列命令:

1
2
3
4
cd ~
curl -LO https://github.com/neovim/neovim/releases/download/v0.10.1/nvim.appimage
chmod u+x ~/nvim.appimage
sudo mv ~/nvim.appimage /usr/local/bin/nvim.appimage

配置系统级别名:

1
2
3
4
5
6
7
8
CUSTOM_NVIM_PATH=/usr/local/bin/nvim.appimage

sudo update-alternatives --install /usr/bin/ex ex "${CUSTOM_NVIM_PATH}" 110
sudo update-alternatives --install /usr/bin/vi vi "${CUSTOM_NVIM_PATH}" 110
sudo update-alternatives --install /usr/bin/view view "${CUSTOM_NVIM_PATH}" 110
sudo update-alternatives --install /usr/bin/vim vim "${CUSTOM_NVIM_PATH}" 110
sudo update-alternatives --install /usr/bin/nvim nvim "${CUSTOM_NVIM_PATH}" 110
sudo update-alternatives --install /usr/bin/vimdiff vimdiff "${CUSTOM_NVIM_PATH}" 110

下载配置文件:

1
git clone https://github.com/LittleNewton/nvim-config.git ~/.config/nvim

安装 Python 依赖:

1
2
pip3 install -U neovim
pip3 install -U pynvim

安装 LTS 版的 node.jsnpm

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. Download and import the Nodesource GPG key
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

# 2. Create deb repository
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

# 3. Run Update and Install
sudo apt-get update
sudo apt-get install nodejs -y

至此,在命令行输入 vim 即可自动安装配置 Vim 及其插件。

4. 配置 zsh 环境·

4.1 配置 zsh·

Zsh 的配置非常简单,已经实现了全部自动化。直接执行以下命令即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
echo '# XDG 规范的路径
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_CACHE_HOME="$HOME/.cache"

# Zsh related config file.
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
export HISTFILE="$ZDOTDIR/.zhistory" # History filepath
export HISTSIZE=10000 # Maximum events for internal history
export SAVEHIST=10000 # Maximum events in history file

# Zim related config file.
export ZIM_HOME="$XDG_DATA_HOME/zim"' > ~/.zshenv && source ~/.zshenv

随后下载配置文件。

1
git clone [email protected]:LittleNewton/zsh-config.git ~/.config/zsh
1
2
# 对于非我本人的其他用户,请使用 https 克隆仓库
git clone https://github.com/LittleNewton/zsh-config.git ~/.config/zsh

最后编辑 /etc/passwd,将用户的默认 shell 改成 /usr/bin/zsh

4.2 配置 tmux 及其插件·

Tmux 是一个强大的终端持久化、多路复用软件。

1
git clone https://github.com/LittleNewton/tmux-config.git ~/.config/tmux

笔者的 Tmux 依赖许多插件,其中 Tmux-Powerline 插件的配置较为复杂,因此独立成一个仓库,用户需要手动拉取:

1
git clone https://github.com/LittleNewton/tmux-powerline-config.git ~/.config/tmux-powerline

4.3 配置 lazygit·

1
git clone [email protected]:LittleNewton/lazygit-config.git ~/.config/lazygit
1
2
# 对于非我本人的其他用户,请使用 https 克隆仓库
git clone https://github.com/LittleNewton/lazygit-config.git ~/.config/lazygit

4.4 配置 joshuto·

1
git clone [email protected]:LittleNewton/joshuto-config.git ~/.config/joshuto
1
2
# 对于非我本人的其他用户,请使用 https 克隆仓库
git clone https://github.com/LittleNewton/joshuto-config.git ~/.config/joshuto

5. 配置存储·

fstab 的配置因人而异,自行参考。)

5.1 在 /mnt 目录创建挂载点·

为后续所有类型存储挂载创建挂载点。这一步比较重要,因为挂载点的位置影响后续的安排,所以为了简单起见,笔者特意模仿了 TrueNAS 上的存储目录设置 NFS、CIFS 挂载点,方便后续写统一的配置文件。

1
2
3
4
5
sudo mkdir -p /mnt/DapuStor_R5100_RAID-Z1/app_data
sudo mkdir -p /mnt/DapuStor_R5100_RAID-Z1/Documents
sudo mkdir -p /mnt/DapuStor_R5100_RAID-Z1/Software
sudo mkdir -p /mnt/Toshiba_MG06S_RAID-Z1/Downloads
sudo mkdir -p /mnt/WD_HC550_RAID-Z1/Media

5.2 创建 fstab 相关 entry·

5.2.1 配置 CIFS 密钥相关文件·

首先配置 smb.cred 密码文件:

1
sudo vim /etc/smb.cred

输入以下内容:

1
2
username=xxx
password=xxx

随后设置权限:

1
2
sudo chown root:root /etc/smb.cred
sudo chmod 0700 /etc/smb.cred

5.2.2 修改 iSCSI 相关·

5.2.2.1 修改 iSCSI 配置文件与 initiator 名字·

对于 4950-debian,修改 /etc/iscsi/iscsid.conf 文件:

1
sudo nvim /etc/iscsi/iscsid.conf

将相关配置行更改如下:

1
2
3
4
5
6
7
# /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = iqn.2019-08.cn.littlenewton:4950-debian
node.session.auth.password = xxx
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = iqn.2019-08.cn.littlenewton:4950-debian
discovery.sendtargets.auth.password = xxx

随后修改 /etc/iscsi/initiatorname.iscsi 文件

1
sudo nvim /etc/iscsi/initiatorname.iscsi

将其中的唯一有效行改为:

1
2
# /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2019-08.cn.littlenewton:4950-debian

5.2.2.2 运行发现程序并配置登录·

首先运行发现程序,找到可以连接的 node:

1
2
3
sudo iscsiadm -m discovery --op=new --op=del --type sendtargets --portal 10.2.1.33
# ↑ ↑
# 不是很懂这两个参数的意义

随后登录:

1
sudo iscsiadm -m node -T iqn.2019-08.cn.littlenewton:h12-truenas:teststore --login

现在已经有 session 了:

1
2
3
4
sudo iscsiadm -m session -o show

# [output:]
# tcp: [4] 10.2.1.33:3260,1 iqn.2019-08.cn.littlenewton:h12-truenas:teststore (non-flash)

查看 node 状态,可以发现自动登录被配置为 manual 手动:

1
2
3
4
5
6
7
sudo iscsiadm -m node -o show

[output]
# BEGIN RECORD 2.1.3
node.name = iqn.2019-08.cn.littlenewton:h12-truenas:teststore
node.tpgt = 1
node.startup = manual

必要的话可以配置为自动登录

1
sudo iscsiadm -m node -o update -T iqn.2019-08.cn.littlenewton:h12-truenas:teststore -n node.startup -v automatic

再查看:

1
2
3
4
5
6
7
sudo iscsiadm -m node -o show

[output]
# BEGIN RECORD 2.1.3
node.name = iqn.2019-08.cn.littlenewton:h12-truenas:teststore
node.tpgt = 1
node.startup = automatic

此后重启将默认登录。

5.2.2.3 临时退出登录·

当我们不想连接 node 之后,先 umount 所有文件系统,然后 logout 该 node:

1
sudo iscsiadm -m node -T iqn.2019-08.cn.littlenewton:h12-truenas:teststore --logout

随后可重新登录。

5.2.2.4 删除 node·

如果想彻底移除 target,可通过 delete 操作:

1
2
3
4
5
# 先断开会话:-u, --logout, only for `session` and `node`.
sudo iscsiadm -m session iqn.2019-08.cn.littlenewton:h12-truenas:teststore --logout

# 再删除 node
sudo iscsiadm -m node -T iqn.2019-08.cn.littlenewton:h12-truenas:teststore -o delete

此时若重新连接,必须再次执行 discovery 程序。

5.2.3 修改 /etc/fstab 文件·

1
2
# Shell
sudo vim /etc/fstab

追加如下内容:

1
2
3
4
5
6
7
# NFS 共享挂载
# 自动 mount TrueNAS NFS. 确保 TrueNAS SCALE 地址、共享配置正确
10.2.1.33:/mnt/DapuStor_R5100_RAID-Z1/app_data /mnt/DapuStor_R5100_RAID-Z1/app_data nfs defaults 0 0
10.2.1.33:/mnt/DapuStor_R5100_RAID-Z1/Documents /mnt/DapuStor_R5100_RAID-Z1/Documents nfs defaults 0 0
10.2.1.33:/mnt/DapuStor_R5100_RAID-Z1/Software /mnt/DapuStor_R5100_RAID-Z1/Software nfs defaults 0 0
10.2.1.33:/mnt/Toshiba_MG06S_RAID-Z1/Downloads /mnt/Toshiba_MG06S_RAID-Z1/Downloads nfs defaults 0 0
10.2.1.33:/mnt/WD_HC550_RAID-Z1/Media /mnt/WD_HC550_RAID-Z1/Media nfs defaults 0 0
1
2
3
4
5
6
7
8
9
10
11
12
# NFS 共享挂载
# 自动 mount TrueNAS NFS. 确保 TrueNAS SCALE 地址、共享配置正确
10.2.1.33:/mnt/DapuStor_R5100_RAID-Z1/app_data /mnt/DapuStor_R5100_RAID-Z1/app_data nfs defaults 0 0
10.2.1.33:/mnt/DapuStor_R5100_RAID-Z1/Documents /mnt/DapuStor_R5100_RAID-Z1/Documents nfs defaults 0 0
10.2.1.33:/mnt/DapuStor_R5100_RAID-Z1/Software /mnt/DapuStor_R5100_RAID-Z1/Software nfs defaults 0 0
10.2.1.33:/mnt/Toshiba_MG06S_RAID-Z1/Downloads /mnt/Toshiba_MG06S_RAID-Z1/Downloads nfs defaults 0 0
10.2.1.33:/mnt/WD_HC550_RAID-Z1/Media /mnt/WD_HC550_RAID-Z1/Media nfs defaults 0 0
# SMB 共享挂载
//10.2.1.1/OneDrive /mnt/DapuStor_R5100_RAID-Z1/onedrive cifs vers=3.0,credentials=/etc/smb.cred,gid=1000,uid=1000,file_mode=0755,dir_mode=0755 0 0

# iSCSI LUN 挂载
/dev/sda /mnt/DapuStor_R5100_RAID-Z1/openwrt-compile ext4 _netdev 0 0

刷新 fstabentry,启用挂载的所有存储

1
sudo mount -av

6. 配置网络·

使用 NetworkManager 配置 Debian 的网络。如果是最小化安装则要安装该软件:sudo apt install network-manager

温馨提示

不要使用 iproute2 直接配置,否则在图形化上看不到管理入口。

NetworkManager 会覆盖已有的所有网络配置,包括 DNS 在内,因此所有配置要使用 NetworkManager 配套工具进行。

6.1 使用 nmtui 命令·

直接输入命令,像使用 Plasma KDE 桌面一样配置。

如果 DNS 变了或者路由表默认走到了校园网端口,则需要按照顺序重启网卡。

1
sudo nmcli connection down <PROFILE> ; sudo nmcli connection up <PROFILE>

需要先用ip addr看一下网卡名字。如果要输入网卡信息,则 ip addr 看一下,输入格式如下:

1
00:0c:29:3f:3b:aa (ens192)

可通过以下命令输出全部相关网卡:

1
2
3
4
/usr/bin/ip -o link show | awk -F': ' '{print $2}' | grep -Ev '^(lo|docker0|tailscale0|veth)' | while read iface; do
mac=$(cat /sys/class/net/$iface/address)
echo "$mac ($iface)"
done

重启网络

1
2
sudo systemctl reload <PROFILE>
# sudo systemctl restart network-manager

6.2 使用 nmcli 命令行·

建议使用 nmtui

1
2
sudo nmcli n on
sudo nmcli n off

7. 配置时区和时钟同步·

出于诸多原因,精确的时间对于网络至关重要,比如:

  • 网络管理:从不同网络设备采集来的日志信息进行分析时,需要以时间作为参照依据。如果不同设备上的系统时间不一致,会因先后顺序等问题给故障定位带来障碍。
  • 计费系统:计费业务对于时间尤其敏感,要求所有设备的时间保持一致,否则会引起计费不准确,导致用户质疑、投诉等。
  • 协同处理:多个系统协同处理同一个复杂事件,为保证正确的执行顺序,多个系统必须参考同一时钟。
  • 系统时间:某些应用或服务需要准确的时间来标记用户登录、交易等操作信息,确保可追溯记录。

因此有一个统一的标准时间对于网络而言意义重大。NTP 就是用来使网络中的各个主机时钟同步的一种协议,他把主机的时钟同步到协调世界时 UTC,其精度在 LAN 网络内可达 1 毫秒内,在 WAN 网络上可以达到几十毫秒内。NTP 是由美国 Delaware 大学 David L .Mills 教授设计的,是最早用于网络中时钟同步的标准之一。NTP 是从时间协议和 ICMP 时间戳报文演变而来。

此外,许多全球性 App,比如 Google Calendar 等,均会使用时区进行事件提醒,如果时区设置不正确,日历将无法工作。

7.1 调整时区·

此配置基于 Systemd,不包含此功能的 Debian 12 将无法使用下面的命令。若用户根据本文逐步配置,则不存在此问题。相关命令如下:

1
2
3
4
5
# 检查时区
timedatectl

# 设置中国时区
sudo timedatectl set-timezone Asia/Shanghai

7.2 调整时钟同步·

时钟同步使用 NTP 协议,该协议非常复杂,但是我们只需要知道配置 NTP 服务器即可。NTP 服务器是至关重要的基础组件,因此很多大型互联网企业都有自己的 NTP 服务,它们的 NTP 服务会通过高质量链路与全球权威授时中心进行时钟同步。

查看 systemd-timesyncd 服务状态:

1
sudo systemctl status systemd-timesyncd.service

如果发现大量 timeout 超时记录或其他异常,则需要修改配置文件:

1
sudo vim /etc/systemd/timesyncd.conf

随后将 NTP 修改为:

1
time.windows.com ntp.aliyun.com cn.pool.ntp.org

随后重启服务并查看内容:

1
sudo systemctl restart systemd-timesyncd.service

至此,便完成了对时区、时钟同步的配置。

8. 设置 docker-cePortainer·

8.1 配置 docker 环境·

容器运行时是现在通用 Linux 环境里不可缺少的一部分,通过容器技术,可快速部署服务。

8.1.1 安装 docker-ce·

容器技术自流行以来,有多个符合标准的运行时,即多个公司、组织研发了合乎标准的“容器”概念实现。此处选择 Docker 公司维护的社区版 Docker-CE 作为示范。

以下脚本来自官方安装教程

先配置 APT 上游:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

随后下载 docker-ce 的相关组件:

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

现在即可使用 Docker 服务。

8.1.2 配置 docker 用户组·

由于 Docker-CE 需要以管理员模式运行命令行程序,所以日常使用显得很麻烦。为此,我们可以将普通用户 ${USERNAME} 添加到 docker 用户组里,这样就可以免去 sudo.

应该注意,docker 用户组的权限非常高,和 root 是等同的。因此,后期探索好用的 root-less 容器环境非常有价值。

1
2
3
4
5
6
7
8
9
10
11
12
# 创建 docker 用户组
sudo groupadd docker

# 将当前用户加入 docker 用户组
sudo usermod -aG docker ${USERNAME}

# 重启 docker 服务
sudo systemctl restart docker

# 切换或者退出当前账户并重新登入
su
su ${USERNAME}

8.2 配置 Portainer·

1
2
docker pull portainer/portainer-ee:latest
docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest

portainer-ee 激活密钥可去申请,获得一个五节点或三节点的免费授权。密钥如下:

1
secret

总结·

这篇文章事无巨细地介绍了我在安装 Debian 12 的过程中要做的步骤,可以说除了剔除了密钥信息之外毫无保留。

我认为,任何 Linux 用户都应该把自己通用服务器的配置过程固定化、完善化,这是成为 Linux 管理员的良好习惯。