dracut + systemd + LUKS + usbflash = เชธเซเชตเชคเชƒ เช…เชจเชฒเซ‹เช•

เชตเชพเชฐเซเชคเชพ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เชถเชฐเซ‚ เชฅเชˆ เชนเชคเซ€, เชœเซเชฏเชพเชฐเซ‡ Centos 7 (RHEL 7) เชฐเชฟเชฒเซ€เช เชฅเชˆ เชนเชคเซ€. เชœเซ‹ เชคเชฎเซ‡ เชธเซ‡เช‚เชŸเซ‹เชธ 6 เชธเชพเชฅเซ‡ เชกเซเชฐเชพเช‡เชตเซเชธ เชชเชฐ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เช†เชตเชถเซเชฏเช• เช•เซ€ เชธเชพเชฅเซ‡ USB เชซเซเชฒเซ‡เชถ เชกเซเชฐเชพเช‡เชตเชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ‹ เช›เซ‹ เชคเซเชฏเชพเชฐเซ‡ เชกเซเชฐเชพเช‡เชตเชจเชพ เชธเซเชตเชšเชพเชฒเชฟเชค เช…เชจเชฒเซ‹เช•เชฟเช‚เช—เชฎเชพเช‚ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชจ เชนเชคเซ€. เชœเซ‹ เช•เซ‡, เชœเซเชฏเชพเชฐเซ‡ 7 เชฐเซ€เชฒเชฟเช เชฅเชฏเซเช‚, เชคเซเชฏเชพเชฐเซ‡ เช…เชšเชพเชจเช• เชฌเชงเซเช‚ เชคเชฎเชพเชฐเซ€ เช†เชฆเชค เชฎเซเชœเชฌ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจ เชนเชคเซเช‚. เชชเช›เซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเชฎเชพเช‚ เชเช• เชธเชฐเชณ เชฒเซ€เชŸเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชกเซเชฐเชพเช•เชŸเชจเซ‡ sysvinit เชชเชฐ เชชเชฐเชค เช•เชฐเชตเชพเชจเซ‹ เช‰เช•เซ‡เชฒ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชนเชคเซเช‚: echo 'omit_dracutmodules+=" systemd "' > /etc/dracut.conf.d/luks-workaround.conf
เชœเซ‡เชฃเซ‡ เชคเชฐเชค เชœ เช…เชฎเชจเซ‡ systemd - เชธเชฟเชธเซเชŸเชฎ เชธเซ‡เชตเชพเช“เชจเชพ เชเชกเชชเซ€ เช…เชจเซ‡ เชธเชฎเชพเช‚เชคเชฐ เชฒเซ‹เช‚เชšเชจเซ€ เชคเชฎเชพเชฎ เชธเซเช‚เชฆเชฐเชคเชพเชฅเซ€ เชตเช‚เชšเชฟเชค เช•เชฐเซ€ เชฆเซ€เชงเซเช‚, เชœเซ‡เชฃเซ‡ เชธเชฟเชธเซเชŸเชฎ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชธเชฎเชฏเชจเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช˜เชŸเชพเชกเซเชฏเซ‹.
เชตเชธเซเชคเซเช“ เชนเชœเซ เชชเชฃ เช›เซ‡: 905683
เช‰เช•เซ‡เชฒเชจเซ€ เชฐเชพเชน เชœเซ‹เชฏเชพ เชตเชฟเชจเชพ, เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเซเชฏเซเช‚, เช…เชจเซ‡ เชนเชตเซ‡ เชนเซเช‚ เชคเซ‡เชจเซ‡ เชฒเซ‹เช•เซ‹ เชธเชพเชฅเซ‡ เชถเซ‡เชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚, เชœเซ‡เชฎเชจเซ‡ เชฐเชธ เช›เซ‡, เชตเชพเช‚เชšเซ‹.
dracut + systemd + LUKS + usbflash = เชธเซเชตเชคเชƒ เช…เชจเชฒเซ‹เช•

เชชเชฐเชฟเชšเชฏ

Systemd, เชœเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เชธเซŒเชชเซเชฐเชฅเชฎ Centos 7 เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เชคเซเชฏเชพเชฐเซ‡ เช•เซ‹เชˆ เชฒเชพเช—เชฃเซ€เช“เชจเซเช‚ เช•เชพเชฐเชฃ เชจเชนเซ‹เชคเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชธเชฐเซเชตเชฟเชธ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชธเชฟเชจเซเชŸเซ‡เช•เซเชธเชฎเชพเช‚ เชจเชพเชจเชพ เชซเซ‡เชฐเชซเชพเชฐ เชธเชฟเชตเชพเชฏ, เชฎเชจเซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชฌเชนเซ เชซเชฐเช• เชจ เชฒเชพเช—เซเชฏเซ‹. เชคเซเชฏเชพเชฐเชฌเชพเชฆ, เชฎเชจเซ‡ systemd เช—เชฎเซเชฏเซเช‚, เชชเชฐเช‚เชคเซ เชชเซเชฐเชฅเชฎ เช›เชพเชช เชฅเซ‹เชกเซ€ เชฌเช—เชกเซ‡เชฒเซ€ เชนเชคเซ€, เช•เชพเชฐเชฃ เช•เซ‡ dracut เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เชกเชฟเชธเซเช• เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฃเชฎเชพเช‚ systemd เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเซ‚เชŸ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชŸเซ‡เช•เซ‹ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เชธเชฎเชฏ เชชเชธเชพเชฐ เช•เชฐเซเชฏเซ‹ เชจ เชนเชคเซ‹. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชธเชฐเซเชตเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชกเชฟเชธเซเช• เชชเชพเชธเชตเชฐเซเชก เชฆเชพเช–เชฒ เช•เชฐเชตเซ‹ เช เชธเซŒเชฅเซ€ เชฐเชธเชชเซเชฐเชฆ เชฌเชพเชฌเชค เชจเชฅเซ€.
เชญเชฒเชพเชฎเชฃเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เช…เชœเชฎเชพเชตเซเชฏเซ‹ เช…เชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเชจเซ‡ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎเซเชก เชฎเซ‹เชกเชฎเชพเช‚ เชฏเซเชเชธเชฌเซ€ เชธเชพเชฅเซ‡ เช—เซ‹เช เชตเชฃเซ€ เชถเช•เซเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชซเช•เซเชค เชฏเซเชเชธเชฌเซ€ เชกเชฟเชธเซเช• เชชเชฐเชจเซ€ เช•เซ€ เชธเชพเชฅเซ‡ เชฆเชฐเซ‡เช• เชกเชฟเชธเซเช•เชจเชพ เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชœเซ‹เชกเชพเชฃ เชธเชพเชฅเซ‡, เช…เชจเซ‡ เชฏเซเชเชธเชฌเซ€ เชกเชฟเชธเซเช• เชชเซ‹เชคเซ‡ เชœ เชคเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. UUID, LABEL เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เช†เชจเซ‡ เช˜เชฐเซ‡ เชœเชพเชณเชตเชตเซเช‚ เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เชจ เชนเชคเซเช‚, เชคเซ‡เชฅเซ€ เช…เช‚เชคเซ‡ เชนเซเช‚ เชฐเชพเชน เชœเซ‹เชตเชพเชฎเชพเช‚ เชกเซ‚เชฌเซ€ เช—เชฏเซ‹ เช…เชจเซ‡, เชฒเช—เชญเช— 7 เชตเชฐเซเชท เชฐเชพเชน เชœเซ‹เชฏเชพ เชชเช›เซ€, เชฎเชจเซ‡ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚.

เชธเชฎเชธเซเชฏเชพเช“

เช…เชฒเชฌเชคเซเชค, เชฒเช—เชญเช— เช•เซ‹เชˆ เชชเชฃ เชตเซเชฏเช•เซเชคเชฟ เชกเซเชฐเชพเช•เชŸ เชฎเชพเชŸเซ‡ เชชเซ‹เชคเชพเชจเซเช‚ เชชเซเชฒเช—เชˆเชจ เชฒเช–เซ€ เชถเช•เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชนเชตเซ‡ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€. เชคเซ‡ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ systemd เชธเซเชŸเชพเชฐเซเชŸเช…เชชเชจเซ€ เชธเชฎเชพเช‚เชคเชฐ เชชเซเชฐเช•เซƒเชคเชฟเชจเซ‡ เชฒเซ€เชงเซ‡, เชคเชฎเชพเชฐเซ‹ เช•เซ‹เชก เชถเชพเชฎเซ‡เชฒ เช•เชฐเชตเซ‹ เช…เชจเซ‡ เชฒเซ‹เชกเชฟเช‚เช— เชชเซเชฐเช—เชคเชฟเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเชตเซ‹ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€. เชกเซเชฐเชพเช•เชŸ เชฎเชพเชŸเซ‡เชจเชพ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เช เชฌเชงเซเช‚ เชœ เชธเชฎเชœเชพเชตเซเชฏเซเช‚ เชจเชฅเซ€. เชœเซ‹ เช•เซ‡, เชฒเชพเช‚เชฌเชพ เชชเซเชฐเชฏเซ‹เช—เซ‹ เชชเช›เซ€, เชนเซเช‚ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเชคเซ‹.

เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡

เชคเซ‡ เชคเซเชฐเชฃ เชเช•เชฎเซ‹ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡:

  1. luks-auto-key.service - LUKS เชฎเชพเชŸเซ‡ เช•เซ€เช“ เชธเชพเชฅเซ‡ เชกเซเชฐเชพเชˆเชตเซ‹ เชฎเชพเชŸเซ‡ เชถเซ‹เชงเซ‡ เช›เซ‡
  2. luks-auto.target - เชฌเชฟเชฒเซเชŸ-เช‡เชจ systemd-cryptsetup เชเช•เชฎเซ‹ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡
  3. luks-auto-clean.service - luks-auto-key.service เชฆเซเชตเชพเชฐเชพ เชฌเชจเชพเชตเซ‡เชฒ เช•เชพเชฎเชšเชฒเชพเช‰ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชธเชพเชซ เช•เชฐเซ‡ เช›เซ‡

เช…เชจเซ‡ luks-auto-generator.sh เช เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช›เซ‡ เชœเซ‡ systemd เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชเช•เชฎเซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡. เชธเชฎเชพเชจ เชœเชจเชฐเซ‡เชŸเชฐ fstab เชเช•เชฎเซ‹ เชตเช—เซ‡เชฐเซ‡ เชฆเซเชตเชพเชฐเชพ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

luks-auto-generator.sh

drop-in.conf เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชธเซเชŸเชพเชจเซเชกเชฐเซเชก systemd-cryptsetup เชจเซเช‚ เชตเชฐเซเชคเชจ luks-auto.target เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชจเชฟเชฐเซเชญเชฐเชคเชพเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เชฌเชฆเชฒเชพเชฏ เช›เซ‡.

luks-auto-key.service เช…เชจเซ‡ luks-auto-key.sh

เช† เชเช•เชฎ luks-auto-key.sh เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเซ‡ เช›เซ‡, เชœเซ‡, rd.luks.* เช•เซ€เชจเชพ เช†เชงเชพเชฐเซ‡, เช•เซ€ เชธเชพเชฅเซ‡ เชฎเซ€เชกเชฟเชฏเชพ เชถเซ‹เชงเซ‡ เช›เซ‡ เช…เชจเซ‡ เชตเชงเซ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‡ เช•เชพเชฎเชšเชฒเชพเช‰ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชจเช•เชฒ เช•เชฐเซ‡ เช›เซ‡. เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€, luks-auto-clean.service เชฆเซเชตเชพเชฐเชพ เช…เชธเซเชฅเชพเชฏเซ€ เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเช•เชพเชฎเชพเช‚เชฅเซ€ เช•เซ€เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชธเซเชคเซเชฐเซ‹เชคเซ‹:

/usr/lib/dracut/modules.d/99luks-auto/module-setup.sh

#!/bin/bash

check () {
        if ! dracut_module_included "systemd"; then
                "luks-auto needs systemd in the initramfs"
                return 1
        fi
        return 255
}

depends () {
        echo "systemd"
        return 0
}

install () {
        inst "$systemdutildir/systemd-cryptsetup"
		inst_script "$moddir/luks-auto-generator.sh" "$systemdutildir/system-generators/luks-auto-generator.sh"
		inst_script "$moddir/luks-auto-key.sh" "/etc/systemd/system/luks-auto-key.sh"
		inst_script "$moddir/luks-auto.sh" "/etc/systemd/system/luks-auto.sh"
		inst "$moddir/luks-auto.target" "${systemdsystemunitdir}/luks-auto.target"
		inst "$moddir/luks-auto-key.service" "${systemdsystemunitdir}/luks-auto-key.service"
		inst "$moddir/luks-auto-clean.service" "${systemdsystemunitdir}/luks-auto-clean.service"
		ln_r "${systemdsystemunitdir}/luks-auto.target" "${systemdsystemunitdir}/initrd.target.wants/luks-auto.target"
		ln_r "${systemdsystemunitdir}/luks-auto-key.service" "${systemdsystemunitdir}/initrd.target.wants/luks-auto-key.service"
		ln_r "${systemdsystemunitdir}/luks-auto-clean.service" "${systemdsystemunitdir}/initrd.target.wants/luks-auto-clean.service"
}

/usr/lib/dracut/modules.d/99luks-auto/luks-auto-generator.sh


#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

. /lib/dracut-lib.sh

SYSTEMD_RUN='/run/systemd/system'
CRYPTSETUP='/usr/lib/systemd/systemd-cryptsetup'
TOUT=$(getargs rd.luks.key.tout)
if [ ! -z "$TOUT" ]; then
	mkdir -p "${SYSTEMD_RUN}/luks-auto-key.service.d"
	cat > "${SYSTEMD_RUN}/luks-auto-key.service.d/drop-in.conf"  <<EOF
[Service]
Type=oneshot
ExecStartPre=/usr/bin/sleep $TOUT

EOF
fi
mkdir -p "$SYSTEMD_RUN/luks-auto.target.wants"
for argv in $(getargs rd.luks.uuid -d rd_LUKS_UUID); do
	_UUID=${argv#luks-}
	_UUID_ESC=$(systemd-escape -p $_UUID)
	mkdir -p "${SYSTEMD_RUN}/systemd-cryptsetup@luksx2d${_UUID_ESC}.service.d"
	cat > "${SYSTEMD_RUN}/systemd-cryptsetup@luksx2d${_UUID_ESC}.service.d/drop-in.conf"  <<EOF
[Unit]
After=luks-auto.target
ConditionPathExists=!/dev/mapper/luks-${_UUID}

EOF
	cat > "${SYSTEMD_RUN}/luks-auto@${_UUID_ESC}.service"  <<EOF
[Unit]
Description=luks-auto Cryptography Setup for %I
DefaultDependencies=no
Conflicts=umount.target
IgnoreOnIsolate=true
Before=luks-auto.target
BindsTo=dev-disk-byx2duuid-${_UUID_ESC}.device
After=dev-disk-byx2duuid-${_UUID_ESC}.device luks-auto-key.service
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutSec=0
ExecStart=/etc/systemd/system/luks-auto.sh ${_UUID}
ExecStop=$CRYPTSETUP detach 'luks-${_UUID}'
Environment=DRACUT_SYSTEMD=1
StandardInput=null
StandardOutput=syslog
StandardError=syslog+console

EOF
ln -fs ${SYSTEMD_RUN}/luks-auto@${_UUID_ESC}.service $SYSTEMD_RUN/luks-auto.target.wants/luks-auto@${_UUID_ESC}.service
done

/usr/lib/dracut/modules.d/99luks-auto/luks-auto-key.service


[Unit]
Description=LUKS AUTO key searcher
After=cryptsetup-pre.target
Before=luks-auto.target
DefaultDependencies=no

[Service]
Environment=DRACUT_SYSTEMD=1
Type=oneshot
ExecStartPre=/usr/bin/sleep 1
ExecStart=/etc/systemd/system/luks-auto-key.sh
RemainAfterExit=true
StandardInput=null
StandardOutput=syslog
StandardError=syslog+console

/usr/lib/dracut/modules.d/99luks-auto/luks-auto-key.sh


#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
export DRACUT_SYSTEMD=1

. /lib/dracut-lib.sh
MNT_B="/tmp/luks-auto"
ARG=$(getargs rd.luks.key)
IFS=$':' _t=(${ARG})
KEY=${_t[0]}
F_FIELD=''
F_VALUE=''
if [ ! -z $KEY ] && [ ! -z ${_t[1]} ];then
	IFS=$'=' _t=(${_t[1]})
	F_FIELD=${_t[0]}
	F_VALUE=${_t[1]}
	F_VALUE="${F_VALUE%"}"
	F_VALUE="${F_VALUE#"}"
fi
mkdir -p $MNT_B

finding_luks_keys(){
	local _DEVNAME=''
	local _UUID=''
	local _TYPE=''
	local _LABEL=''
	local _MNT=''
	local _KEY="$1"
	local _F_FIELD="$2"
	local _F_VALUE="$3"
	local _RET=0	
	blkid -s TYPE -s UUID -s LABEL -u filesystem | grep -v -E -e "TYPE=".*_member"" -e "TYPE="crypto_.*"" -e "TYPE="swap"" | while IFS=$'' read -r _line; do
		IFS=$':' _t=($_line);
		_DEVNAME=${_t[0]}
		_UUID=''
		_TYPE=''
		_LABEL=''
		_MNT=''
		IFS=$' ' _t=(${_t[1]});
		for _a in "${_t[@]}"; do
			IFS=$'=' _v=(${_a});
			temp="${_v[1]%"}"
			temp="${temp#"}"
			case ${_v[0]} in
				'UUID')
					_UUID=$temp
				;;
				'TYPE')
					_TYPE=$temp
				;;
				'LABEL')
					_LABEL=$temp
				;;
			esac
		done
		if [ ! -z "$_F_FIELD" ];then
			case $_F_FIELD in
				'UUID')
					[ ! -z "$_F_VALUE" ] && [ "$_UUID" != "$_F_VALUE" ] && continue
				;;
				'LABEL')
					[ ! -z "$_F_VALUE" ] && [ "$_LABEL" != "$_F_VALUE" ] && continue
				;;
				*)
					[ "$_DEVNAME" != "$_F_FIELD" ] && continue
				;;
			esac
		fi
		_MNT=$(findmnt -n -o TARGET $_DEVNAME)
		if [ -z "$_MNT" ]; then
			_MNT=${MNT_B}/KEY-${_UUID}
			mkdir -p "$_MNT" && mount -o ro "$_DEVNAME" "$_MNT"
			_RET=$?
		else
			_RET=0
		fi
		if [ "${_RET}" -eq 0 ] && [ -f "${_MNT}/${_KEY}" ]; then
			cp "${_MNT}/${_KEY}" "$MNT_B/${_UUID}.key"
			info "Found ${_MNT}/${_KEY} on ${_UUID}"
		fi
		if [[ "${_MNT}" =~ "${MNT_B}" ]]; then
			umount "$_MNT" && rm -rfd --one-file-system "$_MNT"						
		fi
	done
	return 0
}
finding_luks_keys $KEY $F_FIELD $F_VALUE

/usr/lib/dracut/modules.d/99luks-auto/luks-auto.target


[Unit]
Description=LUKS AUTO target
After=systemd-readahead-collect.service systemd-readahead-replay.service
After=cryptsetup-pre.target luks-auto-key.service
Before=cryptsetup.target

/usr/lib/dracut/modules.d/99luks-auto/luks-auto.sh


#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
export DRACUT_SYSTEMD=1
. /lib/dracut-lib.sh

MNT_B="/tmp/luks-auto"
CRYPTSETUP='/usr/lib/systemd/systemd-cryptsetup'

for i in $(ls -p $MNT_B | grep -v /);do
	info "Trying $i on $1..."
	$CRYPTSETUP attach "luks-$1" "/dev/disk/by-uuid/$1" $MNT_B/$i 'tries=1'
	if [ "$?" -eq "0" ]; then
		info "Found $i for $1"
		exit 0
	fi
done
warn "No key found for $1.  Fallback to passphrase mode."

/usr/lib/dracut/modules.d/99luks-auto/luks-auto-clean.service

[Unit]
Description=LUKS AUTO key cleaner
After=cryptsetup.target
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/usr/bin/rm -rfd --one-file-system /tmp/luks-auto

/etc/dracut.conf.d/luks-auto.conf

add_dracutmodules+=" luks-auto "

เชธเซเชฅเชพเชชเชจ


mkdir -p /usr/lib/dracut/modules.d/99luks-auto/
# ั€ะฐะทะผะตั‰ะฐะตะผ ั‚ัƒั‚ ะฟะพั‡ั‚ะธ ะฒัะต ั„ะฐะนะปั‹
chmod +x /usr/lib/dracut/modules.d/99luks-auto/*.sh
# ัะพะทะดะฐะตะผ ั„ะฐะนะป /etc/dracut.conf.d/luks-auto.conf
# ะ˜ ะณะตะฝะตั€ะธั€ัƒะตะผ ะฝะพะฒั‹ะน initramfs
dracut -f

เชจเชฟเชทเซเช•เชฐเซเชท

เชธเช—เชตเชก เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ sysvinit เชฎเซ‹เชก เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒ เช†เชฆเซ‡เชถ เชตเชพเช•เซเชฏ เชตเชฟเช•เชฒเซเชชเซ‹ เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชคเชคเชพ เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ€ เช›เซ‡, เชœเซ‡ เชœเซ‚เชจเชพ เชธเซเชฅเชพเชชเชจเซ‹เชฎเชพเช‚ เชตเชพเชชเชฐเชตเชพเชจเซเช‚ เชธเชฐเชณ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹