0

我编写了一个脚本来配置图像并将其转换为 sd 卡,以便在 Raspberry Pi 上使用它们。

在此脚本的第 418 行,您将找到以下代码:

    如果 [ "$encrypt_system" == "y" ]
      然后
        # @参见 https://gist.github.com/gea0/4fc2be0cb7a74d0e7cc4322aed710d38
        rescue_suffix=".$(date +%s).rescue"
        search_hooks="HOOKS=(base udev autodetect modconf block filesystems keyboard fsck)"
        replace_hooks="HOOKS=(base udev autodetect modconf block sleep netconf dropbear encryptssh filesystems keyboard fsck)"
        mkinitcpio_path="/etc/mkinitcpio.conf"
        mkinitcpio_rescue_path="$mkinitcpio_path$rescue_suffix"
        search_modules="模块=()"
        replace_modules="MODULES=(g_cdc usb_f_acm usb_f_ecm smsc95xx g_ether)"
        root_mapper_path="/dev/mapper/root"
        fstab_path="/mnt/etc/fstab"
        fstab_rescue_path="$fstab_path$rescue_suffix"
        crypttab_path="/mnt/etc/crypttab"
        crypttab_rescue_path="$crypttab_path$rescue_suffix"
        boot_txt_path="/boot/boot.txt"
        boot_txt_rescue_path="$boot_txt_path$rescue_suffix"
        boot_txt_delete_line=$(echo "part uuid \${devtype} \${devnum}:2 uuid" | sed -e 's/[]\/$*.^[]/\\&/g')
        boot_txt_setenv_origin=$(echo "setenv bootargs console=ttyS1,115200 console=tty0 root=PARTUUID=\${uuid} rw rootwait smsc95xx.macaddr=\"\${usbethaddr}\"" | sed -e 's/[] \/$*.^[]/\\&/g')
        boot_txt_setenv_replace=$(echo "setenv bootargs console=ttyS1,115200 console=tty0 ip=::::$target_hostname:eth0:dhcp cryptdevice=$encrypted_pa​​rtition_path:root root=$root_mapper_path rw rootwait smsc95xx.macaddr=\"\${usbethaddr }\""| sed -e 's/[\/&]/\\&/g')
        info "设置加密..." &&
        问题“输入加密密码:” && 读取 -r luks_password
        问题“重复加密密码:” && 读取 -r luks_password_repeat
        如果 [ "$luks_password" != "$luks_password_repeat" ]
          然后
            错误“密码不匹配。”
        菲
        (
        echo "pacman --noconfirm -S --needed $(get_packages "server/luks") &&"
        echo "cp -v /home/$target_username/.ssh/authorized_keys /etc/dropbear/root_key &&"
        回声“cp -v $mkinitcpio_path $mkinitcpio_rescue_path &&”
        echo "sed -i 's/$search_modules/$replace_modules/g' $mkinitcpio_path &&"
        echo "sed -i 's/$search_hooks/$replace_hooks/g' $mkinitcpio_path &&"
        echo "echo \"$mkinitcpio_path 的内容:\$(cat \"$mkinitcpio_path\")\" &&"
        #关于 mkinitcpio 警告@see https://gist.github.com/imrvelj/c65cd5ca7f5505a65e59204f5a3f7a6d
        回声“mkinitcpio -P &&”
        echo "echo '$luks_password' | sudo cryptsetup -v luksFormat -c aes-xts-plain64 -s 512 -h sha512 --use-random -i 1000 $encrypted_pa​​rtition_path &&"
        echo "echo '$luks_password' | sudo cryptsetup -v luksOpen $encrypted_pa​​rtition_path root &&"
        回声“mkfs.ext4 $root_mapper_path &&”
        echo "mount $root_mapper_path /mnt &&"
        echo "rsync --info=progress2 -axHAX / /mnt/ &&"
        回声“cp -v $fstab_path $fstab_rescue_path &&”
        echo "echo $root_mapper_path' / ext4 默认值,noatime 0 1' >> $fstab_path &&"
        echo "echo \"$fstab_path 的内容:\$(cat \"$fstab_path\")\" &&"
        回声“cp -v $crypttab_path $crypttab_rescue_path &&”
        echo "echo 'root '$encrypted_pa​​rtition_path' none luks' >> $crypttab_path &&"
        echo "echo \"$crypttab_path 的内容:\$(cat \"$crypttab_path\")\" &&"
        #boot.txt 仅适用于 raspberry pi 3 @todo 需要为 arch raspbery pi 4 实现
        回声“cp -v $boot_txt_path $boot_txt_rescue_path &&”
        echo "sed -i 's/$boot_txt_delete_line//g' $boot_txt_path &&"
        echo "sed -i 's/$boot_txt_setenv_origin/$boot_txt_setenv_replace/g' $boot_txt_path &&"
        echo "echo \"$boot_txt_path 的内容:\$(cat \"$boot_txt_path\")\" &&"
        回声“cd /boot/ && ./mkscr &&”
        echo "umount $root_mapper_path &&"
        echo "sudo cryptsetup -v luksClose root &&"
        echo "exit || echo 'chroot 环境错误!' echo '试图关闭解密的根。'; sudo cryptsetup -v luksClose root"
        ) | chroot "$root_mount_path" /bin/bash || 错误
    菲

这会生成以下输出:

    [信息]:设置加密...
    [问题]:输入加密密码:  
    测试
    [问题]:重复加密密码:
    测试
    警告:rsync-3.2.3-1 是最新的 -- 跳过
    警告:autoconf-2.69-7 是最新的 -- 跳过
    警告:automake-1.16.2-3 是最新的 -- 跳过
    警告:binutils-2.35-1 是最新的 -- 跳过
    警告:bison-3.6.4-1 是最新的 -- 跳过
    警告:fakeroot-1.24-2 是最新的——跳过
    警告:file-5.39-1 是最新的 -- 跳过
    警告:findutils-4.7.0-2 是最新的 -- 跳过
    警告:flex-2.6.4-3 是最新的——跳过
    警告:gawk-5.1.0-1 是最新的——跳过
    警告:gcc-10.2.0-1 是最新的 -- 跳过
    警告:gettext-0.21-1 是最新的 -- 跳过
    警告:grep-3.4-1 是最新的——跳过
    警告:groff-1.22.4-3 是最新的 -- 跳过
    警告:gzip-1.10-3 是最新的 -- 跳过
    警告:libtool-2.4.6+44+gb9b44533-14 是最新的 -- 跳过
    警告:m4-1.4.18-3 是最新的 -- 跳过
    警告:make-4.3-3 是最新的——跳过
    警告:pacman-5.2.2-1 是最新的 -- 跳过
    警告:patch-2.7.6-8 是最新的——跳过
    警告:pkgconf-1.7.3-1 是最新的 -- 跳过
    警告:sed-4.8-1 是最新的 -- 跳过
    警告:sudo-1.9.3.p1-1 是最新的——跳过
    警告:texinfo-6.7-3 是最新的——跳过
    警告:which-2.21-5 是最新的——跳过
    警告:uboot-tools-2020.04-1 是最新的 -- 跳过
    警告:dropbear-2020.80-1 是最新的 -- 跳过
    警告:mkinitcpio-utils-0.0.3-5 是最新的 -- 跳过
    警告:mkinitcpio-netconf-0.0.5-2 是最新的 -- 跳过
    警告:mkinitcpio-dropbear-0.0.3-6 是最新的 -- 跳过
     没有什么可以做的
    '/home/alarm/.ssh/authorized_keys' -> '/etc/dropbear/root_key'
    '/etc/mkinitcpio.conf' -> '/etc/mkinitcpio.conf.1601472644.rescue'
    /etc/mkinitcpio.conf 的内容:# vim:set ft=sh
    # 模块
    # 在任何引导挂钩之前加载以下模块
    # 跑。高级用户可能希望指定所有系统模块
    # 在这个数组中。例如:
    # MODULES=(piix ide_disk reiserfs)
    模块=(g_cdc usb_f_acm usb_f_ecm smsc95xx g_ether)
    
    # 二进制文件
    # 此设置包括给定用户可能的任何其他二进制文件
    # 希望进入 CPIO 图像。这是最后运行的,所以它可以用来
    # 覆盖给定钩子包含的实际二进制文件
    # BINARIES 是依赖解析的,所以你可以放心地忽略库
    二进制=()
    
    # 文件
    # 这个设置和上面的 BINARIES 类似,但是添加了文件
    # 按原样,不以任何方式解析。这对配置文件很有用。
    文件=()
    
    # 钩子
    # 这是这个文件中最重要的设置。HOOKS 控制
    # 添加到映像中的模块和脚本,以及启动时发生的情况。
    #顺序很重要,建议不要改
    # 添加 HOOKS 的顺序。运行'mkinitcpio -H'
    # 对给定钩子的帮助。
    # 'base' 是_required_,除非你确切地知道你在做什么。
    # 'udev' 是_required_ 以便自动加载模块
    # 'filesystems' 是 _required_ 除非你在 MODULES 中指定你的 fs 模块
    # 例子:
    ## 此设置指定上述 MODULES 设置中的所有模块。
    ## 不需要raid、lvm2 或加密根。
    # 钩子=(基础)
    #
    ## 此设置将自动检测系统的所有模块,并且应该
    ## 正常工作
    # HOOKS=(基本 udev 自动检测块文件系统)
    #
    ## 此设置将生成支持大多数系统的“完整”图像。
    ## 没有进行自动检测。
    # HOOKS=(基本 udev 块文件系统)
    #
    ## 此设置组装了一个带有加密根 FS 的 pata mdadm 数组。
    ## 注意:有关 RAID 设备的更多信息,请参阅“mkinitcpio -H mdadm”。
    # HOOKS=(基础 udev 块 mdadm 加密文件系统)
    #
    ## 此设置在 USB 设备上加载 lvm2 卷组。
    # HOOKS=(基础 udev 块 lvm2 文件系统)
    #
    ## 注意:如果您在单独的分区上有 /usr,则必须包括
    # usr、fsck 和关闭挂钩。
    HOOKS=(base udev autodetect modconf block sleep netconf dropbear encryptssh filesystems keyboard fsck)
    
    # 压缩
    # 使用它来压缩 initramfs 图像。默认情况下,gzip 压缩
    # 用来。使用“cat”创建未压缩的图像。
    #COMPRESSION="gzip"
    #COMPRESSION="bzi​​p2"
    #COMPRESSION="lzma"
    #COMPRESSION="xz"
    #COMPRESSION="lzop"
    #COMPRESSION="lz4"
    
    # 压缩选项
    # 压缩器的附加选项
    #COMPRESSION_OPTIONS=()
    ==> 从预设构建图像:/etc/mkinitcpio.d/linux-aarch64.preset: 'default'
      -> -k 5.8.9-2-ARCH -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img
    ==> 开始构建:5.8.9-2-ARCH
      -> 运行构建钩子:[base]
      -> 运行构建钩子:[udev]
      -> 运行构建挂钩:[自动检测]
      -> 运行构建钩子:[modconf]
      -> 运行构建钩子:[块]
      -> 运行构建钩子:[睡眠]
      -> 运行构建钩子:[netconf]
      -> 运行构建钩子:[dropbear]
    正在为 dropbear 生成 dss 主机密钥...
    未知键类型“dss”
    用法:/usr/sbin/dropbearkey -t -f [-s bits]
    -t type 要生成的密钥类型。之一:
            RSA
            ecdsa
            ed25519
    -f 文件名 使用文件名作为密钥。
                   ~/.ssh/id_dropbear 推荐用于客户端密钥。
    -s bits 密钥大小,以位为单位,应该是 8 的倍数(可选)
               ECDSA 的尺寸为 256 384 521
               Ed25519 固定大小为 256 位
    -y 只打印公钥和指纹
            中的私钥。
    dropbear_rsa_host_key:sha1!!a1:7b:17:e0:43:2e:2c:d2:8e:d3:17:21:15:fb:45:4a:7f:7e:96:57
    dropbear_ecdsa_host_key:sha1!!14:7e:96:5c:1d:8e:60:bd:fb:70:21:93:d5:c7:1e:71:85:49:02:ef
      -> 运行构建钩子:[encryptssh]
      -> 运行构建钩子:[文件系统]
      -> 运行构建钩子:[键盘]
      -> 运行构建钩子:[fsck]
    ==> 生成模块依赖
    ==> 创建 gzip 压缩的 initcpio 映像:/boot/initramfs-linux.img
    bsdtar:无法设置默认语言环境
    bsdtar:无法设置默认语言环境
    ==> 图像生成成功
    ==> 从预设构建图像:/etc/mkinitcpio.d/linux-aarch64.preset: 'fallback'
      -> -k 5.8.9-2-ARCH -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S 自动检测
    ==> 开始构建:5.8.9-2-ARCH
      -> 运行构建钩子:[base]
      -> 运行构建钩子:[udev]
      -> 运行构建钩子:[modconf]
      -> 运行构建钩子:[块]
    ==> 警告:可能缺少模块固件:wd719x
      -> 运行构建钩子:[睡眠]
      -> 运行构建钩子:[netconf]
    ==> 警告:模块可能缺少固件:rsi_sdio
    ==> 警告:可能缺少模块固件:rsi_usb
    ==> 警告:模块可能缺少固件:atmel
    ==> 警告:可能缺少模块固件:at76c50x_usb
    ==> 警告:可能缺少模块固件:rtl8723ae
    ==> 警告:模块可能缺少固件:zd1201
    ==> 警告:可能缺少模块固件:zd1211rw
    ==> 警告:可能缺少模块固件:prism54
    ==> 警告:可能缺少模块固件:p54pci
    ==> 警告:可能缺少模块固件:p54usb
    ==> 警告:可能缺少模块固件:orinoco_usb
    ==> 警告:模块可能缺少固件:wcn36xx
    ==> 警告:可能缺少模块的固件:b43legacy
    ==> 警告:模块可能缺少固件:b43
    ==> 警告:可能缺少模块固件:ipw2100
    ==> 警告:可能缺少模块固件:ipw2200
    ==> 警告:可能缺少模块固件:mt7603e
      -> 运行构建钩子:[dropbear]
    正在为 dropbear 生成 dss 主机密钥...
    未知键类型“dss”
    用法:/usr/sbin/dropbearkey -t -f [-s bits]
    -t type 要生成的密钥类型。之一:
            RSA
            ecdsa
            ed25519
    -f 文件名 使用文件名作为密钥。
                   ~/.ssh/id_dropbear 推荐用于客户端密钥。
    -s bits 密钥大小,以位为单位,应该是 8 的倍数(可选)
               ECDSA 的尺寸为 256 384 521
               Ed25519 固定大小为 256 位
    -y 只打印公钥和指纹
            中的私钥。
    dropbear_rsa_host_key:sha1!!a1:7b:17:e0:43:2e:2c:d2:8e:d3:17:21:15:fb:45:4a:7f:7e:96:57
    dropbear_ecdsa_host_key:sha1!!14:7e:96:5c:1d:8e:60:bd:fb:70:21:93:d5:c7:1e:71:85:49:02:ef
      -> 运行构建钩子:[encryptssh]
      -> 运行构建钩子:[文件系统]
      -> 运行构建钩子:[键盘]
      -> 运行构建钩子:[fsck]
    ==> 生成模块依赖
    ==> 创建 gzip 压缩的 initcpio 映像:/boot/initramfs-linux-fallback.img
    bsdtar:无法设置默认语言环境
    bsdtar:无法设置默认语言环境
    ==> 图像生成成功
    未知主机 QEMU_IFLA 类型:54
    未知主机 QEMU_IFLA 类型:54
    警告:设备 /dev/mmcblk1p3 已经包含“crypto_LUKS”超级块签名。
    设备 /dev/mmcblk1p3 上现有的“crypto_LUKS”超级块签名(偏移量:0 字节)将被擦除。
    设备 /dev/mmcblk1p3 上现有的“crypto_LUKS”超级块签名(偏移量:16384 字节)将被擦除。
    已创建密钥槽 0。
    命令成功。
    未知主机 QEMU_IFLA 类型:54
    未知主机 QEMU_IFLA 类型:54
    钥匙槽 0 解锁。
    命令成功。
    mke2fs 1.45.6(2020 年 3 月 20 日)
    创建具有 14724352 个 4k 块和 3686400 个 inode 的文件系统
    文件系统 UUID:da0071a7-ef0d-4051-9461-145add2be871
    存储在块上的超级块备份:
        32768、98304、163840、229376、294912、819200、884736、1605632、2654208、
        4096000、7962624、11239424
    
    分配组表:完成                            
    编写 inode 表:完成                            
    创建日志(65536 块):完成
    编写超级块和文件系统记帐信息:完成   
    
      1,924,493,579 99% 5.42MB/s 0:05:38 (xfr#32483, to-chk=0/43361)    
    '/mnt/etc/fstab' -> '/mnt/etc/fstab.1601472644.rescue'
    /mnt/etc/fstab 的内容:# 关于文件系统的静态信息。
    # 详见 fstab(5)。
    
    #      
    /dev/mmcblk0p1 /boot vfat 默认值 0 0
    /dev/mapper/root / ext4 默认值,noatime 0 1
    '/mnt/etc/crypttab' -> '/mnt/etc/crypttab.1601472644.rescue'
    /mnt/etc/crypttab 的内容:# 加密块设备的配置。
    # 详见 crypttab(5)。
    
    # 注意:不要在此处列出您的根 (/) 分区,它必须设置
    # 事先通过 initramfs (/etc/mkinitcpio.conf)。
    
    #                                                           
    # 家庭 UUID=b8ad5c18-f445-495d-9095-c9ec4f9d2f37 /etc/mypassword1
    # 数据1 /dev/sda3 /etc/mypassword2
    # 数据2 /dev/sda5 /etc/cryptfs.key
    # 交换 /dev/sdx4 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
    # 卷 /dev/sdb7 无
    根 /dev/mmcblk1p3 无 luks
    '/boot/boot.txt' -> '/boot/boot.txt.1601472644.rescue'
    /boot/boot.txt的内容:#修改后运行./mkscr
    
    # 将根分区设置为引导设备的第二个分区
    
    
    setenv bootargs 控制台=ttyS1,115200 控制台=tty0 ip=::::home-server:eth0:dhcp cryptdevice=/dev/mmcblk1p3:root root=/dev/mapper/root rw rootwait smsc95xx.macaddr="${usbethaddr} "
    
    如果加载 ${devtype} ${devnum}:${bootpart} ${kernel_addr_r} /Image; 然后
      如果加载 ${devtype} ${devnum}:${bootpart} ${fdt_addr_r} /dtbs/${fdtfile}; 然后
        如果加载 ${devtype} ${devnum}:${bootpart} ${ramdisk_addr_r} /initramfs-linux.img; 然后
          booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r};
        别的
          booti ${kernel_addr_r} - ${fdt_addr_r};
        菲;
      菲;
    菲
    图片名称:U-Boot 启动脚本
    创建时间:2020 年 9 月 30 日星期三 13:43:18
    图像类型:ARM Linux 脚本(未压缩)
    数据大小:668 字节 = 0.65 KiB = 0.00 MiB
    加载地址:00000000
    入口点:00000000
    内容:
       图片 0:660 字节 = 0.64 KiB = 0.00 MiB
    未知主机 QEMU_IFLA 类型:54
    未知主机 QEMU_IFLA 类型:54
    命令成功。

当我启动树莓派并尝试连接它时,我在终端上得到以下输出:

    ssh root@192.168.178.61
    cat:无法打开'/.cryptdev':没有这样的文件或目录
    命令需要设备和映射名称作为参数。
    与 192.168.178.61 的连接已关闭。

如果有人能告诉我错误在哪里以及我如何解决这个问题,我会很高兴!:)

4

1 回答 1

0

问题解决了。错误是在编译和生产系统上使用了不同的设备名称。见https://bbs.archlinux.de/viewtopic.php?pid=377823

于 2020-10-01T10:36:27.250 回答