shell - 为什么我的 Arch Linux 全自动安装程序不工作?

标签 shell installation archlinux

我最近一直在为 ArchLinux 开发一个简单的全自动安装程序。

  • 我从一个基本的三分区系统开始;这构成了一个可引导的系统。
  • 我添加了 LVM 和更多的逻辑分区;这也有效。
  • 我现在正在尝试添加 LUKS 加密;这是行不通的。

  • 我想在 LVM 中使用 LUKS 以获得更大的灵活性。对于具有单个磁盘的 BIOS 系统,它应该如下所示:
    Raw Partitions
    +-----------+------+-------+-----------+
    | Partition | Name | Size  | Flags     |
    +-----------+------+-------+-----------+
    | /dev/sda1 | grub | 2MB   | bios_grub |
    | /dev/sda2 | boot | 200MB | boot      |
    | /dev/sda3 | lvm  |       | lvm       |
    +-----------+------+-------+-----------+
    
    LVM Partitions
    +-------------+--------------+-------+------+
    | LVM Device  | LUKS Device  | Name  | Size |
    +-------------+--------------+-------+------+
    | LvmDvc-root | LuksDvc-root | root  | 2GB  |
    | LvmDvc-home | LuksDvc-home | home  | 2GB  |
    | LvmDvc-var  | LuksDvc-var  | var   | 1G   |
    | LvmDvc-usr  | LuksDvc-usr  | usr   | 1G   |
    | LvmDvc-swap | LuksDvc-swap | swap  | 4G   |
    +-------------+--------------+-------+------+
    
    LvmDvc-root解密为LuksDvc-root使用密码。

    所有其他 LVM 设备都使用存储在 /etc/ctyptkeys 中的 key 解密。 .

    分区安装为:
    /dev/mapper/LuksDvc-root -> /
    /dev/sda2                -> /boot
    /dev/mapper/LuksDvc-home -> /home
    /dev/mapper/LuksDvc-var  -> /var
    /dev/mapper/LuksDvc-usr  -> /usr
    

    据我所知,磁盘分区和系统安装工作得很好。我收到大量关于 lvmetad 的错误在 grub 配置期间未加载,但 Arch 维基中的文档表明这不是问题( https://wiki.archlinux.org/index.php/GRUB#UEFI_systems_2 )。我在之前版本的脚本中也收到了这些相同的错误(使用 LVM,但不是 LUKS),并且它生成了一个可引导系统。所以我不认为这个错误信息表明有问题。

    当我启动系统时,我通过 GRUB 就好了。我看到一个对话来解密根分区:
    A password is required to access the LuksDvc-root volume:
    Enter passphrase for /dev/mapper/LvmDvc-root:
    

    我输入了安装过程中使用的密码,并收到以下消息:
    No key available with this passphrase.
    

    我正在使用一个非常简单的密码进行测试(asdfasdf),所以我怀疑我把它搞砸了。我可以毫无意外地从实时安装程序解密和挂载整个系统,但我无法在启动时让它发生。

    我不确定哪些信息对解决这个问题最有帮助。这是我用来安装系统的脚本:
    #!/usr/bin/env bash
    set -ex -o pipefail -o nounset
    
    # Raw Partitioning
    
    parted --script --align optimal -- /dev/sda mklabel gpt
    
    parted --script --align optimal -- /dev/sda mkpart primary 2 4
    parted --script --align optimal -- /dev/sda name 1 bios_grub
    parted --script --align optimal -- /dev/sda set 1 bios_grub on
    
    parted --script --align optimal -- /dev/sda mkpart primary 4 204
    parted --script --align optimal -- /dev/sda name 2 boot
    parted --script --align optimal -- /dev/sda set 2 boot on
    
    parted --script --align optimal -- /dev/sda mkpart primary 204 -1
    parted --script --align optimal -- /dev/sda name 3 lvm
    parted --script --align optimal -- /dev/sda set 3 lvm on
    
    # LVM Partitioning
    
    pvcreate -ff --yes /dev/sda3
    vgcreate LvmDvc /dev/sda3
    lvcreate --zero y --wipesignatures y --name root --size 2G LvmDvc
    lvcreate --zero y --wipesignatures y --name home --size 2G LvmDvc
    lvcreate --zero y --wipesignatures y --name var --size 1G LvmDvc
    lvcreate --zero y --wipesignatures y --name usr --size 1G LvmDvc
    lvcreate --zero y --wipesignatures y --name swap --size 4G LvmDvc
    
    # Root Partition
    
    echo asdfasdf | cryptsetup -q --key-file - luksFormat /dev/mapper/LvmDvc-root
    echo asdfasdf | cryptsetup -q --key-file - luksOpen /dev/mapper/LvmDvc-root LuksDvc-root
    mkfs.ext4 -q /dev/mapper/LuksDvc-root
    
    mkdir -p /mnt/archbox
    mount /dev/mapper/LuksDvc-root /mnt/archbox
    
    # Boot Partition
    
    mkfs.ext4 -q /dev/sda2
    
    # Encrypted Partitions
    
    mkdir -p /mnt/archbox/etc/cryptkeys
    chmod 400 /mnt/archbox/etc/cryptkeys
    
    dd if=/dev/random of=/mnt/archbox/etc/cryptkeys/home bs=512 count=4 iflag=fullblock
    chmod 400 /mnt/archbox/etc/cryptkeys/home
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/home luksFormat /dev/mapper/LvmDvc-home
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/home luksOpen /dev/mapper/LvmDvc-home LuksDvc-home
    mkfs.ext4 -q /dev/mapper/LuksDvc-home
    
    dd if=/dev/random of=/mnt/archbox/etc/cryptkeys/var bs=512 count=4 iflag=fullblock
    chmod 400 /mnt/archbox/etc/cryptkeys/var
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/var luksFormat /dev/mapper/LvmDvc-var
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/var luksOpen /dev/mapper/LvmDvc-var LuksDvc-var
    mkfs.ext4 -q /dev/mapper/LuksDvc-var
    
    dd if=/dev/random of=/mnt/archbox/etc/cryptkeys/usr bs=512 count=4 iflag=fullblock
    chmod 400 /mnt/archbox/etc/cryptkeys/usr
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/usr luksFormat /dev/mapper/LvmDvc-usr
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/usr luksOpen /dev/mapper/LvmDvc-usr LuksDvc-usr
    mkfs.ext4 -q /dev/mapper/LuksDvc-usr
    
    dd if=/dev/random of=/mnt/archbox/etc/cryptkeys/swap bs=512 count=4 iflag=fullblock
    chmod 400 /mnt/archbox/etc/cryptkeys/swap
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/swap luksFormat /dev/mapper/LvmDvc-swap
    cryptsetup -q --key-file /mnt/archbox/etc/cryptkeys/swap luksOpen /dev/mapper/LvmDvc-swap LuksDvc-swap
    mkswap /dev/mapper/LuksDvc-swap
    
    # Mount
    
    mkdir -p /mnt/archbox/boot
    mount /dev/sda2 /mnt/archbox/boot
    
    mkdir -p /mnt/archbox/home
    mount /dev/mapper/LuksDvc-home /mnt/archbox/home
    
    mkdir -p /mnt/archbox/var
    mount /dev/mapper/LuksDvc-var /mnt/archbox/var
    
    mkdir -p /mnt/archbox/usr
    mount /dev/mapper/LuksDvc-usr /mnt/archbox/usr
    
    swapon /dev/mapper/LuksDvc-swap
    
    # Packages
    
    mkdir -p ./cache-dir
    rm -f /mnt/archbox/var/lib/pacman/db.lck
    pacstrap /mnt/archbox --cachedir ./cache-dir base grub
    
    # Root password
    
    echo "root:asdfasdf" | chpasswd --root /mnt/archbox
    
    # FSTab
    
    genfstab -U -p /mnt/archbox >> /mnt/archbox/etc/fstab
    
    # CryptTab
    
    echo "" > /mnt/archbox/etc/crypttab
    echo "home /dev/mapper/LvmDvc-home /mnt/archbox/etc/cryptkeys/home" >> /mnt/archbox/etc/crypttab
    echo "usr /dev/mapper/LvmDvc-usr /mnt/archbox/etc/cryptkeys/usr" >> /mnt/archbox/etc/crypttab
    echo "var /dev/mapper/LvmDvc-var /mnt/archbox/etc/cryptkeys/var" >> /mnt/archbox/etc/crypttab
    echo "swap /dev/mapper/LvmDvc-swap /mnt/archbox/etc/cryptkeys/swap" >> /mnt/archbox/etc/crypttab
    
    # Ramdisk
    
    file=/mnt/archbox/etc/mkinitcpio.conf
    
    search="^\s*MODULES=.*$"
    replace="MODULES=\\\"virtio virtio_blk virtio_pci virtio_net\\\""
    grep -q "$search" "$file" && sed -i "s#$search#$replace#" "$file" || echo "$replace" >> "$file"
    
    search="^\s*HOOKS=.*$"
    replace="HOOKS=\\\"base udev autodetect modconf block keymap encrypt lvm2 filesystems keyboard shutdown fsck usr\\\""
    grep -q "$search" "$file" && sed -i "s#$search#$replace#" "$file" || echo "$replace" >> "$file"
    
    arch-chroot /mnt/archbox mkinitcpio -p linux
    
    # Bootloader
    
    arch-chroot /mnt/archbox grub-install --target=i386-pc --recheck /dev/sda
    
    file=/mnt/archbox/etc/default/grub
    
    search="^\s*GRUB_CMDLINE_LINUX=.*$"
    replace="GRUB_CMDLINE_LINUX=\\\"init=/usr/lib/systemd/systemd cryptdevice=/dev/mapper/LvmDvc-root:LuksDvc-root root=/dev/mapper/LuksDvc-root quiet\\\""
    grep -q "$search" "$file" && sed -i "s#$search#$replace#" "$file" || echo "$replace" >> "$file"
    
    search="^\s*GRUB_DISABLE_LINUX_UUID=.*$"
    replace="GRUB_DISABLE_LINUX_UUID=true"
    grep -q "$search" "$file" && sed -i "s#$search#$replace#" "$file" || echo "$replace" >> "$file"
    
    arch-chroot /mnt/archbox grub-mkconfig -o /boot/grub/grub.cfg
    

    有没有什么明显的错误?我应该怎么做?我可以提供其他/特定信息吗?

    tl;dr - 安装脚本似乎有效,但我无法在启动时解密系统。呸!

    最佳答案

    我发现了主要问题:格式化根 LUKS 卷应该使用密码完成,而不是 key 文件。去掉选项--key-file -关于根卷的格式和打开修复了我看到的问题。

    脚本中还有一些其他问题,但我会在尝试并未能修复它们后回来。

    关于shell - 为什么我的 Arch Linux 全自动安装程序不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23504966/

    相关文章:

    shell - 如何在ubuntu中逐行流水线

    windows服务安装 "Administrator access is needed"

    java - install4j:从控制面板中排除卸载程序

    mysql - 运行 SQL 脚本出现语法错误

    node.js - 在 Node/Grunt 中执行特定于操作系统的脚本

    linux - 两个远程服务器linux之间的数据传输(sftp)

    bash - 意外标记附近出现语法错误 `<'

    ruby-on-rails - JRuby 有限的 openssl 加载 - 如何消除?

    docker - 在 Arch Linux 上安装 Docker - 来自 url 的 404 错误

    mongodb.lock 权限被拒绝