dracut + systemd + LUKS + usbflash = рд╕реНрд╡рдпрдВ рдЕрдирд▓реЙрдХ

рд╕реЗрдВрдЯреЛрд╕ 7 (RHEL 7) рд░рд┐рд▓реАрдЭ рдЭрд╛рд▓реЗ рддреЗрд╡реНрд╣рд╛ рд╣реА рдХрдерд╛ рдлрд╛рд░ рдкреВрд░реНрд╡реА рд╕реБрд░реВ рдЭрд╛рд▓реА. рдЬрд░ рддреБрдореНрд╣реА рд╕реЗрдВрдЯреЛрд╕ 6 рд╕рд╣ рдбреНрд░рд╛рдЗрд╡реНрд╣рд╕реНрд╡рд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╡рд╛рдкрд░рд▓реЗ рдЕрд╕реЗрд▓, рддрд░ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдЖрд╡рд╢реНрдпрдХ рдХреА рд╕рд╣ USB рдлреНрд▓реЕрд╢ рдбреНрд░рд╛рдЗрд╡реНрд╣ рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рддреЗрд╡реНрд╣рд╛ рдбреНрд░рд╛рдЗрд╡реНрд╣рдЪреНрдпрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЕрдирд▓реЙрдХрдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рд╕рдорд╕реНрдпрд╛ рдирд╡реНрд╣рддреА. рддрдерд╛рдкрд┐, рдЬреЗрд╡реНрд╣рд╛ 7 рд░рд┐рд▓реАрдЬ рдЭрд╛рд▓рд╛, рддреЗрд╡реНрд╣рд╛ рдЕрдЪрд╛рдирдХ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЖрдкрд▓реНрдпрд╛ рд╕рд╡рдпреАрдкреНрд░рдорд╛рдгреЗ рдХрд╛рд░реНрдп рдХрд░рдд рдирд╛рд╣реА. рдирдВрддрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреАрд▓ рд╕реЛрдкреНрдпрд╛ рдУрд│реАрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди dracut рд▓рд╛ 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 рд╡рд░реНрд╖реЗ рд╡рд╛рдЯ рдкрд╛рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░ рдорд▓рд╛ рд╕рдордЬрд▓реЗ рдХреА рдХреЛрдгреАрд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгрд╛рд░ рдирд╛рд╣реА.

рд╕рдорд╕реНрдпрд╛

рдЕрд░реНрдерд╛рдд, рдЬрд╡рд│рдЬрд╡рд│ рдХреЛрдгреАрд╣реА dracut рд╕рд╛рдареА рд╕реНрд╡рддрдГрдЪреЗ рдкреНрд▓рдЧрдЗрди рд▓рд┐рд╣реВ рд╢рдХрддреЛ, рдкрд░рдВрддреБ рддреЗ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рдЖрддрд╛ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА. рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рд╕рд┐рд╕реНрдЯрдордб рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрдЪреНрдпрд╛ рд╕рдорд╛рдВрддрд░ рд╕реНрд╡рд░реВрдкрд╛рдореБрд│реЗ, рдЖрдкрд▓рд╛ рдХреЛрдб рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рд▓реЛрдбрд┐рдВрдЧ рдкреНрд░рдЧрддреА рдмрджрд▓рдгреЗ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА. dracut рд╕рд╛рдареА рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рд╕рд░реНрд╡рдХрд╛рд╣реА рд╕реНрдкрд╖реНрдЯ рдХреЗрд▓реЗ рдирд╛рд╣реА. рддрдерд╛рдкрд┐, рдкреНрд░рджреАрд░реНрдШ рдкреНрд░рдпреЛрдЧрд╛рдВрдирдВрддрд░, рдореА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡реВ рд╢рдХрд▓реЛ.

рд╣реЗ рдХрд╕ рдХрд╛рдо рдХрд░рдд

рд╣реЗ рддреАрди рдпреБрдирд┐рдЯреНрд╕рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ:

  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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛