LUKS加密Linux外置硬盘
一款带指纹解锁的移动硬盘
空闲固态搭配硬盘盒给到All in one主机的监控服务Frigate当数据盘使用,又不想硬盘即插即读在家裸奔视频流出,此时你需要对外挂硬盘进行加密,这里使用LUKS。
1. 系统这里使用Debian12
sudo apt update
安装更新(先用ssh连接Linux系统,然后使用命令这个步骤不用说了吧,不用吧)
2. 安装加密服务
sudo apt install cryptsetup
安装加密软件
sudo /usr/sbin/cryptsetup luksFormat /dev/sdb1
创建LUKS加密容器
输入两次密码
3. 创建挂载点
sudo /usr/sbin/cryptsetup luksOpen /dev/sdb1 encrypted_drive
打开加密容器
sudo /usr/sbin/mkfs.ext4 /dev/mapper/encrypted_drive
创建文件系统
sudo mkdir /mnt/encrypted_drive
创建挂载点
4. 创建自动脚本
vim mount_encrypted_drive.sh
创建脚本文件
加入脚本内容,参考如下代码
#!/bin/bash
# 配置
DEVICE="/dev/sdb1" # 请替换为实际的设备名
MAPPER_NAME="encrypted_drive"
MOUNT_POINT="/mnt/encrypted_drive"
KEY_FILE="/root/luks-key"
# 日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" | tee -a /var/log/encrypt_mount.log
}
# 检查设备是否存在
if [ ! -b "$DEVICE" ]; then
log "设备 $DEVICE 不存在,退出脚本"
exit 1
fi
# 检查挂载点是否存在,如果不存在则创建
if [ ! -d "$MOUNT_POINT" ]; then
log "创建挂载点 $MOUNT_POINT"
mkdir -p "$MOUNT_POINT"
fi
# 检查是否已经挂载
if mountpoint -q "$MOUNT_POINT"; then
log "设备已经挂载在 $MOUNT_POINT"
exit 0
fi
# 检查加密映射是否已经存在
if [ -e "/dev/mapper/$MAPPER_NAME" ]; then
log "加密映射 $MAPPER_NAME 已经存在"
else
# 解锁加密硬盘
log "正在解锁加密硬盘..."
if ! /usr/sbin/cryptsetup luksOpen --key-file "$KEY_FILE" "$DEVICE" "$MAPPER_NAME" 2>> /var/log/encrypt_mount.log; then
log "解锁加密硬盘失败"
exit 1
fi
fi
if [ ! -e "/dev/mapper/$MAPPER_NAME" ]; then
log "加密设备映射不存在"
exit 1
fi
# 挂载硬盘
log "正在挂载硬盘..."
if mount "/dev/mapper/$MAPPER_NAME" "$MOUNT_POINT" 2>> /var/log/encrypt_mount.log; then
log "硬盘成功挂载到 $MOUNT_POINT"
else
log "挂载失败: $(tail -n 1 /var/log/encrypt_mount.log)"
/usr/sbin/cryptsetup luksClose "$MAPPER_NAME"
exit 1
fi
5. 测试脚本
chmod +x mount_encrypted_drive.sh
添加可执行权限
sudo /usr/sbin/cryptsetup luksClose encrypted_drive
关闭加密容器
bash mount_encrypted_drive.sh
执行脚本
lsblk
检查硬盘是否解密并挂载成功
6. 设置挂载自动化
sudo dd if=/dev/urandom of=/root/luks-key bs=4096 count=1
创建密钥文件到/root目录
sudo chmod 400 /root/luks-key
设置文件仅root用户可读
sudo /usr/sbin/cryptsetup luksAddKey /dev/sdX /root/luks-key
将密钥添加到LUKS加密的硬盘,需要输入密码
cp /root/mount_encrypted_drive.sh /usr/local/bin/mount_encrypted_drive.sh
将脚本放到bin目录下
vim /etc/systemd/system/mount-encrypted-drive.service
创建一个systemd服务文件,输入如下内容
[Unit]
Description=Mount encrypted drive
After=local-fs.target
Before=docker.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mount_encrypted_drive.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
7. 启动服务
sudo systemctl enable mount-encrypted-drive.service
设置开机启动
sudo systemctl start mount-encrypted-drive.service
启动服务
8. 问题排查
检查加密卷的文件系统类型,mapper路径这是加密设备解密后的映射位置,不是物理路径,解密成功会返回类似 /dev/mapper/encrypted_drive: UUID="2xxxxxxxxxxxxxxxxxxxxxxxxxx1" BLOCK_SIZE="4096" TYPE="ext4"
sudo blkid /dev/mapper/encrypted_drive
脚本运行失败后立即运行这个命令,查看是否有更多错误信息
dmesg | tail
确认 /dev/sdb1 是否真的是一个 LUKS 加密分区,如果这个命令返回错误,那么这个分区可能没有被正确加密
sudo /usr/sbin/cryptsetup isLuks /dev/sdb1
如果上面的命令确认是 LUKS 分区,尝试手动打开它,输入密码。如果成功,应该能在 /dev/mapper 中看到 encrypted_drive
sudo /usr/sbin/cryptsetup luksOpen /dev/sdb1 encrypted_drive
检查密钥文件: 确保 /root/luks-key 文件存在并且有正确的权限,应该只有 root 用户可读
sudo ls -l /root/luks-key
使用密钥文件手动打开加密分区
sudo /usr/sbin/cryptsetup luksOpen --key-file /root/luks-key /dev/sdb1 encrypted_drive
确保 cryptsetup 包已正确安装
sudo apt install cryptsetup
如果还不行,就重新格式化
sudo /usr/sbin/cryptsetup luksFormat /dev/sdb1
打开加密容器
sudo /usr/sbin/cryptsetup luksOpen /dev/sdb1 encrypted_drive
创建文件系统
sudo /usr/sbin/mkfs.ext4 /dev/mapper/encrypted_drive
关闭加密容器
sudo /usr/sbin/cryptsetup luksClose encrypted_drive
创建密钥,这里不确定是关闭加密容器后还能否创建密钥,大概率是先不能关闭加密容器
sudo dd if=/dev/urandom of=/root/luks-key bs=4096 count=1
设置文件仅root用户可读
sudo chmod 400 /root/luks-key
将密钥添加到LUKS加密的硬盘,需要输入密码,然后继续设置为系统自启动
sudo /usr/sbin/cryptsetup luksAddKey /dev/sdX /root/luks-key