这是一台带有 SSD 的笔记本电脑。 Debian 安装程序默认适用于 luks2。使用这些会破坏 grub 部分的安装,因为最新的 grub 版本不支持氩气2id PBKDF。 argon2id 应该比 luks1 方式好很多,但是后者应该可以开箱即用。 (除了grub之外,Debian安装没有问题。)
我已经关注了几个视频从实时 USB 安装 Debian。 (debian-live-12.1.0-amd64-lxqt.iso)
我的磁盘设置是有一个 1 GB EFI 分区。 (这可能太大了......)一个名为 crypt 的加密分区,其中有一个 LVM(我实际上可能不需要),在 LVM 中,有一个卷组 vg-1 以及一个 vg1-debian ext4 根分区和用于存放我的数据的 vg1-store ext4 分区。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot/efi
└─nvme0n1p2 259:2 0 215G 0 part
└─nvme0n1p2_crypt 253:0 0 215G 0 crypt
├─vg1-debian 253:1 0 46.6G 0 lvm /
└─vg1-store 253:2 0 167.6G 0 lvm /media/user/store
答案1
免责声明
- 备份您的数据!
- 拥有另一台计算机会有所帮助!
- 即使第一次尝试时一切正常,这也需要一些时间!
- 您必须在启动时解锁加密驱动器两次。
- 我只尝试过UEFI模式安装。
指导
因此,这个问题的解决方案是使用 live USB,创建分区,安装 Debian,跳过 grub,使用 live USB 启动,chroot
进入新安装并编译并安装修补过的 grub。
因为这实在是太乏味了,我为此编写了一个脚本。
我用的名字是gil_install.sh
:
#! /usr/bin/env bash
script_rel_path="/home/tempuser"
script_full_path="$script_rel_path/"$(basename "$0")
# choose which part of the script should run based on cli argument
# no argument case
if [ -z "$1" ] ; then
# assuming installed debian 12 system is mounted to /mnt
mkdir "/mnt$script_rel_path"
cp "$0" "/mnt$script_full_path"
# mount essentials for chroot
# https://wiki.debian.org/chroot
mount --bind /dev /mnt/dev/
mount --bind /dev/pts /mnt/dev/pts
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
# chroot and start the next part of this script from within the chroot
# couldn't get this part to work right
#chroot /mnt /bin/bash -i "$script_full_path 1"
echo "After chroot, enter command: cd $script_rel_path; bash $script_full_path 1"
chroot /mnt
fi
if [ "$1" == 1 ] ; then
echo "Installing build packages"
apt install -y gnulib libdevmapper-dev libfreetype-dev gettext autogen git bison help2man texinfo efibootmgr libisoburn1 libisoburn-dev mtools pkg-config m4 libtool automake autoconf flex fuse3 libfuse3-dev gawk
# mawk gives make error, so using gawk
mv /usr/bin/mawk /usr/bin/mawk_bu
ln -s /usr/bin/gawk /usr/bin/mawk
# git clone needed repos
git clone https://git.savannah.gnu.org/git/grub.git
cd grub
git clone https://git.savannah.nongnu.org/git/grub-extras.git
git clone https://aur.archlinux.org/grub-improved-luks2-git.git
git clone https://git.savannah.gnu.org/git/gnulib.git
cp "$0" "./"$(basename "$0")
/bin/bash -i $(basename "$0") 2
fi
if [ "$1" == 2 ] ; then
echo "Compiling grub"
# This part is copied from grub-improved-luks2-git/PKGBUILD
# It patches grub and compiles and installes it
patch -Np1 -i ./grub-improved-luks2-git/add-GRUB_COLOR_variables.patch
# Patch grub-mkconfig to detect Arch Linux initramfs images.
patch -Np1 -i ./grub-improved-luks2-git/detect-archlinux-initramfs.patch
# argon2
patch -Np1 -i ./grub-improved-luks2-git/argon_1.patch
patch -Np1 -i ./grub-improved-luks2-git/argon_2.patch
patch -Np1 -i ./grub-improved-luks2-git/argon_3.patch
patch -Np1 -i ./grub-improved-luks2-git/argon_4.patch
patch -Np1 -i ./grub-improved-luks2-git/argon_5.patch
# make grub-install work with luks2
patch -Np1 -i ./grub-improved-luks2-git/grub-install_luks2.patch
# Fix DejaVuSans.ttf location so that grub-mkfont can create *.pf2 files for starfield theme.
sed 's|/usr/share/fonts/dejavu|/usr/share/fonts/dejavu /usr/share/fonts/TTF|g' -i "configure.ac"
# Modify grub-mkconfig behaviour to silence warnings FS#36275
sed 's| ro | rw |g' -i "util/grub.d/10_linux.in"
# Modify grub-mkconfig behaviour so automatically generated entries read 'Arch Linux' FS#33393
sed 's|GNU/Linux|Linux|' -i "util/grub.d/10_linux.in"
# Pull in latest language files
#[ ! -z "$GRUB_ENABLE_NLS" ] && ./linguas.sh
# Remove lua module from grub-extras as it is incompatible with changes to grub_file_open
# http://git.savannah.gnu.org/cgit/grub.git/commit/?id=ca0a4f689a02c2c5a5e385f874aaaa38e151564e
rm -rf ./grub-extras/lua
export GRUB_CONTRIB=./grub-extras
export GNULIB_SRCDIR=./gnulib
CFLAGS=${CFLAGS/-fno-plt}
./bootstrap
mkdir ./build_x86_64-efi
cd ./build_x86_64-efi
../configure --with-platform=efi --target=x86_64 --prefix="/usr" --sbindir="/usr/bin" --sysconfdir="/etc" --enable-boot-time --enable-cache-stats --enable-device-mapper --enable-grub-mkfont --enable-grub-mount --enable-mm-debug --disable-silent-rules --disable-werror CPPFLAGS="$CPPFLAGS -O2"
make
cd ..
# now we should be in /home/tempuser/grub (on the mounted filesystem)
/bin/bash -i $(basename "$0") 3
fi
if [ "$1" == 3 ] ; then
echo "Installing grub"
# exit
cd ./build_x86_64-efi
make DESTDIR=/ bashcompletiondir=/usr/share/bash-completion/completions install
install -D -m0644 ../grub-improved-luks2-git/grub.default /etc/default/grub
fi
运行实时 USB 后,打开加密卷(更改此!)
sudo cryptsetup luksOpen /dev/nvme0n1p2 crypt
将其挂载到/mnt(更改分区名称!)
sudo mount /dev/mapper/vg1-debian /mnt
将efi分区挂载到/mnt/boot/efi(更改分区名称!)
sudo mkdir /mnt/boot/efi
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
选择:备份 Debian grub 配置
(或者使用这个在我的脚本中注释掉相应的行)
(补丁中的那个是针对 Arch 的,但是可以工作。)
(也许基本 Debian 版本更好,但我没试过。)
sudo cp /etc/default/grub /etc/default/grub_bu
下载我的脚本并启动它:
sudo bash gil_install.sh
请注意,输入后chroot
,您将必须手动复制并执行命令。
(它在脚本中。/打印到终端。)
之后,脚本应该运行、制作并安装修补过的 grub。
您可以使用 CLI 参数从多个点继续执行该脚本。
(请参阅脚本内部。)
请注意,脚本会在多个目录中复制自身,因此请小心编辑或执行哪个目录。
看:https://wiki.archlinux.org/title/GRUB#LUKS2
在 chroot 内部:
在 grub 中启用 cryptodisk
(取消注释 GRUB_ENABLE_CRYPTODISK=y 行)
(同时将 Arch 更改为 Debian...)
nano /etc/default/grub
使用grub-mkconfig工具生成/boot/grub/grub.cfg:
grub-mkconfig -o /boot/grub/grub.cfg
安装grub到efi分区
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
创建/boot/grub/grub-pre.cfg
nano /boot/grub/grub-pre.cfg
set crypto_uuid=3b411d89-xxxx-xxxx-xxxx-xxxxxxxxxxxx
cryptomount -u $crypto_uuid
set root=lvm/vg1-debian
set prefix=($root)/boot/grub
insmod normal
normal
制作EFI镜像:
grub-mkimage -p /boot/grub -O x86_64-efi -c /boot/grub/grub-pre.cfg -o /tmp/grubx64.efi luks2 part_gpt cryptodisk gcry_rijndael argon2 gcry_sha256 ext2 lvm
复制到 ESP:
install -v /tmp/grubx64.efi /boot/efi/EFI/GRUB/grubx64.efi
添加EFI条目:
sudo efibootmgr -c -d /dev/nvme0n1 -p 1 -L "debian" -l "\EFI\GRUB\grubx64.efi"
经过这一切和一些efibootmgr
“魔法”之后,我可以启动我的全新 Debian 12 安装。
希望这可以帮助。
我可能不会来维护这个,抱歉。
(我已经在这上面浪费了太多时间。)