Debian Chrony 时间同步、RAID5 与 LUKS 磁盘加密配置
1. 服务介绍
Chrony 是 Debian 常用的 NTP 时间同步服务,用于让服务器与可信时间源保持一致。准确时间会直接影响 Kerberos、证书校验、日志审计、数据库事务和集群服务。
本文同时整理一组 Debian 综合实训中的存储配置:使用 ``mdadm`` 创建带热备盘的 RAID5,再通过 LVM 提供文件系统;使用 LUKS 加密独立磁盘,并配置开机解锁和挂载。最后给出账号初始化脚本的安全写法,便于把多个服务账号流程标准化。
实验目标:
• Chrony 服务端能够从上游同步,并向指定客户端网段提供时间。
• Chrony 客户端能够查询同步源和偏移量。
• 3 个数据盘组成 RAID5,另加 1 个热备盘,RAID 设备通过 LVM 挂载到 /backup。
• 独立磁盘使用 LUKS 加密,映射为 crypt 后格式化并挂载到 /mnt/crypt。
• 所有验证命令能够区分"服务正常""配置已加载"和"客户端实际可用"。
2. 准备运行环境
• 操作系统:Debian Linux;本文命令适用于使用 systemd 的 Debian 实验环境。
• 权限:root 或具备 sudo 权限的管理员账号。
• 时间角色:准备 1 台 Chrony 服务端和至少 1 台客户端;服务端的上游时间源、客户端网段按实际拓扑替换。
• 网络:NTP 使用 UDP 123;服务端、客户端和上游时间源之间必须可达。
• 存储:RAID5 使用 4 块同容量实验盘,其中 3 块组成阵列、1 块作为热备;LUKS 另使用 1 块独立磁盘。
• 设备名:示例使用 /dev/sdb 到 /dev/sde 创建 RAID 分区、/dev/sdf 创建 LUKS。执行前必须用 lsblk、blkid 和容量信息确认设备,不能照抄设备名。
• 备份:修改 /etc/chrony/chrony.conf、/etc/fstab、/etc/crypttab 前先备份;生产磁盘不得直接套用实验命令。
• 密钥:LUKS 密码只在交互提示中输入;不要把真实密码写入 Markdown、脚本、命令历史或截图。
3. 相关知识与注意点
3.1 Chrony
• Debian 服务名通常是 chrony,守护进程名称是 chronyd;管理命令以 systemctl status chrony 为准。
• server、pool 用于指定上游时间源,allow 用于允许客户端网段查询;不要把 allow 写成任意公网网段。
• Chrony 正常同步要同时看 chronyc sources -v 和 chronyc tracking。sources -v 中的 ^* 表示当前选中的同步源,^+ 表示可用候选源。
• Chrony 已经会持续校时,通常不需要每 5 分钟执行一次 ntpdate。需要立即校正时可使用 chronyc makestep,并记录执行原因。
• local stratum 只适合隔离实验或上游暂时不可用的场景,不能代替可靠 NTP 源。
3.2 RAID5、LVM 与挂载
• RAID5 提供单盘故障容错,不等于备份;阵列重建期间性能和可靠性都会下降。
• 热备盘只有在阵列降级后才会自动接替,仍要用 mdadm --detail 检查重建状态。
• RAID 设备和 LVM 逻辑卷只能选择一个层级格式化。本文格式化 /dev/vg_backup/lv_backup,不再格式化 /dev/md0。
• /etc/fstab 推荐使用文件系统 UUID,并加入 nofail 等符合业务要求的挂载参数,避免设备异常导致系统启动失败。
• RAID 元数据、LVM 元数据和业务数据都需要纳入备份与监控。
3.3 LUKS
• LUKS 保护的是静态数据;磁盘解锁并挂载后,拥有文件系统权限的进程仍可读取数据。
• /etc/crypttab 使用 LUKS UUID,不能把普通文件系统 UUID 填进去;映射后的 ext4 文件系统还要单独写入 /etc/fstab。
• 自动解锁会降低重启后的可用性风险,但会增加密钥文件或密钥服务的保护要求。
• 加密盘初始化会覆盖目标设备,必须再次确认设备路径和数据备份。
3.4 自动化脚本
• 脚本参数要校验,账号创建要具备幂等性,密码应通过交互式 passwd、密钥系统或受控密钥服务提供。
• 不要在脚本中硬编码初始密码、远程 root 登录参数、固定公网地址或明文数据库密码。
• 跨主机创建账号时,优先使用 Ansible 等受控自动化工具和最小权限账号。
• 修改账号、Samba、Web 或邮件权限后,必须分别验证服务配置、账号登录和文件访问结果。
4. 实验步骤
4.1 安装 Chrony
bash
apt update
apt install -y chrony
systemctl enable --now chrony
systemctl status chrony --no-pager
4.2 配置 Chrony 服务端
先备份配置:
bash
cp -a /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak.$(date +%F-%H%M%S)
vim /etc/chrony/chrony.conf
按实际拓扑保留可用上游源,并配置服务端:
conf
# 替换为实际可达的 NTP 服务
server NTP_SERVER_IP iburst
# 替换为实际客户端网段
allow CLIENT_SUBNET
# 仅隔离实验且无上游时使用
# local stratum 10


检查配置并重启:
bash
chronyd -Q
systemctl restart chrony
systemctl enable chrony
4.3 配置 Chrony 客户端
客户端安装并启动 Chrony:
bash
apt update
apt install -y chrony
systemctl enable --now chrony
编辑 /etc/chrony/chrony.conf,把服务端地址替换为实际地址:
conf
server NTP_SERVER_IP iburst
修改后执行:
bash
systemctl restart chrony
chronyc sources -v
chronyc tracking
Chrony 已提供持续同步时,不建议再用 ntpdate 和 cron 重复校时。若实验要求定时维护,可受控调用 chronyc makestep,并先确认服务端可达:
bash
chronyc activity
chronyc -n sources
5. 配置 RAID5、LVM 与开机挂载
5.1 确认实验磁盘
bash
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,UUID
blkid
确认 /dev/sdb 到 /dev/sde 都是空闲实验盘后,再分别创建 Linux RAID 分区。分区完成后再次检查:
bash
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
5.2 创建 RAID5 与热备盘
安装工具:
bash
apt update
apt install -y mdadm lvm2
使用 3 个分区创建 RAID5,第 4 个分区作为热备盘:
bash
mdadm --create /dev/md0 \
--level=5 \
--raid-devices=3 \
--spare-devices=1 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
观察同步和阵列状态:
bash
cat /proc/mdstat
mdadm --detail /dev/md0
保存阵列配置并更新 initramfs:
bash
mdadm --detail --scan | tee -a /etc/mdadm/mdadm.conf
update-initramfs -u
5.3 使用 LVM 提供 /backup
在 RAID 设备上创建 PV、VG 和 LV:
bash
pvcreate /dev/md0
vgcreate vg_backup /dev/md0
lvcreate -l 100%FREE -n lv_backup vg_backup
格式化逻辑卷并挂载:
bash
mkfs.ext4 /dev/vg_backup/lv_backup
mkdir -p /backup
blkid /dev/vg_backup/lv_backup
把查询到的文件系统 UUID 写入 /etc/fstab:
fstab
UUID=BACKUP_FS_UUID /backup ext4 defaults,nofail 0 2
验证挂载:
bash
mount -a
findmnt /backup
df -hT /backup
touch /backup/raid5-lvm-test
ls -l /backup/raid5-lvm-test
6. 配置 LUKS 加密磁盘
6.1 安装并初始化 LUKS
安装工具并确认目标磁盘:
bash
apt update
apt install -y cryptsetup
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
下面命令会清除目标设备内容。确认 /dev/sdf 是独立的空闲实验盘后执行,密码在交互提示中输入,不写入命令行:
bash
cryptsetup luksFormat /dev/sdf
cryptsetup open /dev/sdf crypt


6.2 格式化并挂载映射设备
加密设备打开后,真正可格式化和挂载的是 /dev/mapper/crypt:
bash
mkfs.ext4 /dev/mapper/crypt
mkdir -p /mnt/crypt
blkid /dev/mapper/crypt
mount /dev/mapper/crypt /mnt/crypt
findmnt /mnt/crypt


6.3 配置开机解锁与挂载
查询 LUKS UUID:
bash
blkid /dev/sdf
在 /etc/crypttab 中使用 LUKS UUID:
fstab
crypt UUID=LUKS_UUID none luks
在 /etc/fstab 中使用映射后文件系统 UUID:
bash
blkid /dev/mapper/crypt
fstab
UUID=CRYPT_FS_UUID /mnt/crypt ext4 defaults,nofail 0 2
如果实验要求密钥文件自动解锁,先用受限权限创建密钥文件,再将密钥加入 LUKS 槽位。密钥内容不能写入文章或日志:
bash
install -m 0600 /dev/null /root/crypt.key
cryptsetup luksAddKey /dev/sdf /root/crypt.key
把 /root/crypt.key 配置到 /etc/crypttab 的第三列,并确保只有 root 可读:
bash
chmod 600 /root/crypt.key
chmod 600 /etc/crypttab


检查配置文件内容和权限:
bash
cat /etc/crypttab
stat -c '%A %U %G %n' /root/crypt.key /etc/crypttab
重新加载并测试开机配置:
bash
systemctl daemon-reload
cryptsetup status crypt
mount -a
findmnt /mnt/crypt

重启后确认映射设备和挂载点:
bash
lsblk -f
findmnt /mnt/crypt
dmesg --level=err,warn | tail -n 30


7. 账号初始化脚本示例
下面示例只演示本机账号创建和参数校验。密码使用交互式 passwd,不保存到脚本;Samba、Web、邮件等服务的权限应按各自服务配置,不把远程 root 登录和明文凭据写进脚本。
创建脚本:
bash
mkdir -p /usr/local/sbin
vim /usr/local/sbin/user_add.sh
bash
#!/usr/bin/env bash
set -euo pipefail
user_name="$1"
if [[ -z "$user_name" || ! "$user_name" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]; then
echo "Usage: $0 USERNAME" >&2
exit 2
fi
if ! id "$user_name" >/dev/null 2>&1; then
useradd --create-home --shell /bin/bash "$user_name"
fi
passwd "$user_name"
echo "account ready: $user_name"
赋权并测试:
bash
chmod 750 /usr/local/sbin/user_add.sh
/usr/local/sbin/user_add.sh it01
id it01
getent passwd it01
如果需要接入 Samba 或 Web 服务,应分别使用服务原生命令并验证配置,例如:
bash
testparm -s
apachectl configtest
systemctl status smbd apache2 --no-pager
不要使用 echo "user:password" | chpasswd、硬编码密码、拼接远程 SSH 命令或允许 root 密码登录作为自动化方案。
8. 验证与排错
8.1 Chrony 服务端和客户端
bash
systemctl is-active chrony
ss -lunp | grep ':123'
chronyc -n sources -v
chronyc tracking
timedatectl status
客户端验证服务端可用性:
bash
chronyc -n sources
chronyc activity
重点检查:
• sources -v 出现 ^* 或可用的 ^+ 源。
• tracking 中存在正常的 stratum、Reference ID 和可接受的 offset。
• 服务端 UDP 123 监听,防火墙允许实际客户端网段。
• 客户端时间、时区和服务端时间一致。
8.2 RAID5、LVM 与文件系统
bash
cat /proc/mdstat
mdadm --detail /dev/md0
pvs
vgs
lvs -o+devices
findmnt /backup
df -hT /backup
阵列降级、同步未完成或 /backup 不可写时,先处理底层阵列和 LVM,再检查上层应用。
8.3 LUKS 与开机挂载
bash
cryptsetup status crypt
lsblk -f
findmnt /mnt/crypt
df -hT /mnt/crypt
journalctl -b -u systemd-cryptsetup@crypt.service --no-pager
常见问题:
• crypttab 使用了文件系统 UUID,而不是 LUKS UUID。
• fstab 没有使用映射后文件系统 UUID。
• 密钥文件权限过宽,或 initramfs 没有更新。
• 磁盘设备路径变化,应该使用 UUID 而不是固定 /dev/sdX。
• mount -a 报错时先查看 findmnt --verify。
bash
findmnt --verify
8.4 账号与服务联动
bash
id it01
getent passwd it01
testparm -s
apachectl configtest
journalctl -b --no-pager | tail -n 80
验证结果必须写清楚服务、节点、命令和结果,不要只写"测试成功"。
9. 小结
Chrony 负责时间同步;RAID5、LVM 和 LUKS 分别负责磁盘冗余、逻辑卷管理和静态数据加密。配置时先确认节点角色、网络、磁盘和 UUID,再修改服务配置;完成后使用服务状态、端口、协议查询、底层阵列状态和端到端访问结果逐层验证。
这篇文章只使用实验占位符表示地址、网段和 UUID;真实密码、密钥、固定公网地址和本地文件路径不应发布到文章中。