如何用全盘安装Debian 12(引导也)luks2加密grub2,lvm UEFI?

如何用全盘安装Debian 12(引导也)luks2加密grub2,lvm UEFI?

这是一台带有 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 安装。
希望这可以帮助。
我可能不会来维护这个,抱歉。
(我已经在这上面浪费了太多时间。)

相关内容