Debian 12 系统初始化
坑边闲话:Linux 的系统初始化教程对新手非常有帮助,本文提供一个合适的流程化操作,方便用户使用相关服务。从第一步开始就进入了 ssh 模式。
本文略过 Debian 12 的安装过程,但是假设用户在选择服务器角色的时候勾选了 SSH-Server 选项。如果没有勾选,接下来需要在 KVM 界面手动安装 openssh-server
.
1. 配置常规用户·
首先进入路由器(这里以 OpenWrt 为例)后台,查看 dhcp 地址分配数据,找到新系统被分配的 IP 地址,随后使用 ssh 客户端连接到 debian 12 系统。
关于先配置网络,还是先配置
sudo
用户,我个人认为无论哪个先行,都必须输入一次“繁琐的” root 密码,因此最好是先配置用户,这样以后都用sudo
来配置,简单省力。
1 | # 1. 切换到 root 用户 |
如果用户不存在,则要用命令创建合适的用户:
1 | sudo useradd -u <USER_ID> -m -s /usr/bin/zsh ${USERNAME} |
特别注意:
<USER_ID>
需要小心设置,一般这是一个大于 1000 的整数,如果要使用 NAS 上的 NFS 共享,则最好让 NAS 用户与本机用户的UID
相同。
2. 设置 ssh-server
配置·
一般来说,通过 ssh 公钥验证的方式登录最为安全,因此我们连接到新系统的第一步就是配置登录方式。
2.1 设置常规用户的授权公钥·
使用 ssh-keygen
生成一套密钥。
1 | mkdir -p ~/.ssh |
将通用 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 | PasswordAuthentication no |
,这将起到以下作用:
- 关闭密码登录
- 只开启 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 | # 1. 换源 (不能用 `vim`,因为还没安装) |
nano
有如下快捷键:
Ctrl + K
— 删除行Ctrl + O
— 保存Ctrl + X
— 退出
随后将文件全文替换为以下内容:
1 | # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
无需重启任何服务,即可使用新的源。如果要正确配置源优先级,可编辑 /etc/apt/preferences.d/stable
文件:
1 | sudo nano /etc/apt/preferences.d/stable |
文件内容如下:
1 | Package: * |
其中,Pin-Priority
的数值越高,代表优先级越高。
为了让每次 apt
操作都显示版本号,可以编辑 apt
配置项目:
1 | sudo nano /etc/apt/apt.conf.d/99show-versions |
文件内容如下:
1 | APT::Get::Show-Versions "true"; |
如此一来,每次使用 apt
操作软件均会提示包版本号。
3.2 安装常用软件·
常用以下软件。
- 系统管理
- 命令行工具
- 网络工具
- 系统资源监控
- 文件系统相关
- 软件编译与构建
- 可能会用到的 library
1 | # 1. 更新 apt |
3.3 获取 python
·
3.3.1 安装 miniconda
·
1 | mkdir ~/bin && cd ~/bin |
期间要输入目录,笔者建议输入以下内容:
1 | /home/${USERNAME}/bin/miniconda3 |
随后断开 ssh,并重新登录。
3.3.2 安装常见的 Python 包·
1 | conda install python |
3.4 获取 golang
·
Go 是很重要的一个基础语言,目前很多 NeoVim 的插件也依赖 Go 环境。然而,Debian 的上游 Go 版本较低,经常遇到组件要求更高 Go 版本的情况。为此我们选择手动安装。
转到 Go 官网下载页面执行以下脚本可自动化安装最新版 Golang.
1 |
|
3.5 获取 rust
·
Rust 是新一代内存安全语言,使用 Rust 开发可以降低维护难度。可通过以下命令交互式地安装 Rust 语言。
1 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
3.6. 获取 neovim
·
目前 NeoVim 最新版 v0.10.1
尚未集成到 apt 库,所以需要手动安装。这里笔者选择 appimage
格式。可通过 NeoVim GitHub 仓库 Release 界面查看最新版本。
执行下列命令:
1 | cd ~ |
配置系统级别名:
1 | CUSTOM_NVIM_PATH=/usr/local/bin/nvim.appimage |
下载配置文件:
1 | git clone https://github.com/LittleNewton/nvim-config.git ~/.config/nvim |
安装 Python 依赖:
1 | pip3 install -U neovim |
安装 LTS 版的 node.js
和 npm
:
1 | # 1. Download and import the Nodesource GPG key |
至此,在命令行输入 vim
即可自动安装配置 Vim 及其插件。
4. 配置 zsh
环境·
4.1 配置 zsh
·
Zsh 的配置非常简单,已经实现了全部自动化。直接执行以下命令即可。
1 | echo '# XDG 规范的路径 |
随后下载配置文件。
1 | git clone [email protected]:LittleNewton/zsh-config.git ~/.config/zsh |
1 | # 对于非我本人的其他用户,请使用 https 克隆仓库 |
最后编辑 /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 | # 对于非我本人的其他用户,请使用 https 克隆仓库 |
4.4 配置 joshuto
·
1 | git clone [email protected]:LittleNewton/joshuto-config.git ~/.config/joshuto |
1 | # 对于非我本人的其他用户,请使用 https 克隆仓库 |
5. 配置存储·
(fstab
的配置因人而异,自行参考。)
5.1 在 /mnt
目录创建挂载点·
为后续所有类型存储挂载创建挂载点。这一步比较重要,因为挂载点的位置影响后续的安排,所以为了简单起见,笔者特意模仿了 TrueNAS 上的存储目录设置 NFS、CIFS 挂载点,方便后续写统一的配置文件。
1 | sudo mkdir -p /mnt/DapuStor_R5100_RAID-Z1/app_data |
5.2 创建 fstab
相关 entry·
5.2.1 配置 CIFS 密钥相关文件·
首先配置 smb.cred
密码文件:
1 | sudo vim /etc/smb.cred |
输入以下内容:
1 | username=xxx |
随后设置权限:
1 | sudo chown root:root /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 | # /etc/iscsi/iscsid.conf |
随后修改 /etc/iscsi/initiatorname.iscsi
文件
1 | sudo nvim /etc/iscsi/initiatorname.iscsi |
将其中的唯一有效行改为:
1 | # /etc/iscsi/initiatorname.iscsi |
5.2.2.2 运行发现程序并配置登录·
首先运行发现程序,找到可以连接的 node:
1 | 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 | sudo iscsiadm -m session -o show |
查看 node 状态,可以发现自动登录被配置为 manual 手动:
1 | sudo iscsiadm -m node -o show |
必要的话可以配置为自动登录:
1 | sudo iscsiadm -m node -o update -T iqn.2019-08.cn.littlenewton:h12-truenas:teststore -n node.startup -v automatic |
再查看:
1 | sudo iscsiadm -m node -o show |
此后重启将默认登录。
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 | # 先断开会话:-u, --logout, only for `session` and `node`. |
此时若重新连接,必须再次执行 discovery
程序。
5.2.3 修改 /etc/fstab
文件·
1 | # Shell |
追加如下内容:
1 | # NFS 共享挂载 |
1 | # NFS 共享挂载 |
刷新 fstab
的 entry
,启用挂载的所有存储
1 | sudo mount -av |
6. 配置网络·
使用 NetworkManager
配置 Debian 的网络。如果是最小化安装则要安装该软件:sudo apt install network-manager
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 | /usr/bin/ip -o link show | awk -F': ' '{print $2}' | grep -Ev '^(lo|docker0|tailscale0|veth)' | while read iface; do |
重启网络
1 | sudo systemctl reload <PROFILE> |
6.2 使用 nmcli
命令行·
建议使用 nmtui
1 | sudo nmcli n on |
7. 配置时区和时钟同步·
出于诸多原因,精确的时间对于网络至关重要,比如:
- 网络管理:从不同网络设备采集来的日志信息进行分析时,需要以时间作为参照依据。如果不同设备上的系统时间不一致,会因先后顺序等问题给故障定位带来障碍。
- 计费系统:计费业务对于时间尤其敏感,要求所有设备的时间保持一致,否则会引起计费不准确,导致用户质疑、投诉等。
- 协同处理:多个系统协同处理同一个复杂事件,为保证正确的执行顺序,多个系统必须参考同一时钟。
- 系统时间:某些应用或服务需要准确的时间来标记用户登录、交易等操作信息,确保可追溯记录。
因此有一个统一的标准时间对于网络而言意义重大。NTP 就是用来使网络中的各个主机时钟同步的一种协议,他把主机的时钟同步到协调世界时 UTC,其精度在 LAN 网络内可达 1 毫秒内,在 WAN 网络上可以达到几十毫秒内。NTP 是由美国 Delaware 大学 David L .Mills 教授设计的,是最早用于网络中时钟同步的标准之一。NTP 是从时间协议和 ICMP 时间戳报文演变而来。
此外,许多全球性 App,比如 Google Calendar 等,均会使用时区进行事件提醒,如果时区设置不正确,日历将无法工作。
7.1 调整时区·
此配置基于 Systemd,不包含此功能的 Debian 12 将无法使用下面的命令。若用户根据本文逐步配置,则不存在此问题。相关命令如下:
1 | # 检查时区 |
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-ce
和 Portainer
·
8.1 配置 docker 环境·
容器运行时是现在通用 Linux 环境里不可缺少的一部分,通过容器技术,可快速部署服务。
8.1.1 安装 docker-ce
·
容器技术自流行以来,有多个符合标准的运行时,即多个公司、组织研发了合乎标准的“容器”概念实现。此处选择 Docker 公司维护的社区版 Docker-CE 作为示范。
以下脚本来自官方安装教程。
先配置 APT 上游:
1 | # Add Docker's official GPG key: |
随后下载 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 | # 创建 docker 用户组 |
8.2 配置 Portainer·
1 | docker pull portainer/portainer-ee:latest |
portainer-ee 激活密钥可去申请,获得一个五节点或三节点的免费授权。密钥如下:
1 | secret |
总结·
这篇文章事无巨细地介绍了我在安装 Debian 12 的过程中要做的步骤,可以说除了剔除了密钥信息之外毫无保留。
我认为,任何 Linux 用户都应该把自己通用服务器的配置过程固定化、完善化,这是成为 Linux 管理员的良好习惯。