dracut + systemd + LUKS + usbflash = เจ†เจŸเฉ‹ เจ…เจจเจฒเฉŒเจ•

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

เจœเจพเจฃ เจชเจ›เจพเจฃ

เจธเจฟเจธเจŸเจฎเจก, เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ Centos 7 เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ, เจ•เฉ‹เจˆ เจญเจพเจตเจจเจพเจตเจพเจ‚ เจชเฉˆเจฆเจพ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเฉ‡เจตเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจธเฉฐเจŸเฉˆเจ•เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฎเจพเจฎเฉ‚เจฒเฉ€ เจคเจฌเจฆเฉ€เจฒเฉ€ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจฎเฉˆเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจฌเจนเฉเจคเจพ เจซเจฐเจ• เจฎเจนเจฟเจธเฉ‚เจธ เจจเจนเฉ€เจ‚ เจนเฉ‹เจ‡เจ†เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจจเฉ‚เฉฐ systemd เจชเจธเฉฐเจฆ เจ†เจ‡เจ†, เจชเจฐ เจชเจนเจฟเจฒเจพ เจชเฉเจฐเจญเจพเจต เจฅเฉ‹เฉœเจพ เจตเจฟเจ—เฉœ เจ—เจฟเจ†, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจกเจฐเจพเจ•เจŸ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‡ เจกเจฟเจธเจ• เจเจจเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจฆเฉ‡ เจจเจพเจฒ เจธเจฟเจธเจŸเจฎเจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฌเฉ‚เจŸ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฟเจ†เจฆเจพ เจธเจฎเจพเจ‚ เจจเจนเฉ€เจ‚ เจฒเจ—เจพเจ‡เจ†เฅค เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจน เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจœเจฆเฉ‹เจ‚ เจตเฉ€ เจธเจฐเจตเจฐ เจšเจพเจฒเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจกเจฟเจธเจ• เจชเจพเจธเจตเจฐเจก เจฆเจพเจ–เจฒ เจ•เจฐเจจเจพ เจธเจญ เจคเฉ‹เจ‚ เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ.
เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฟเจซเจผเจพเจฐเจธเจผเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจ เจ…เจคเฉ‡ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจฎเจนเจฟเจธเฉ‚เจธ เจ•เฉ€เจคเจพ เจ•เจฟ เจธเจฟเจธเจŸเจฎเจก เจฎเฉ‹เจก เจตเจฟเฉฑเจš USB เจฆเฉ‡ เจจเจพเจฒ เจธเฉฐเจฐเจšเจจเจพ เจธเฉฐเจญเจต เจนเฉˆ, เจชเจฐ เจธเจฟเจฐเจซเจผ USB เจกเจฟเจธเจ• 'เจคเฉ‡ เจ‡เฉฑเจ• เจ•เฉเฉฐเจœเฉ€ เจจเจพเจฒ เจนเจฐเฉ‡เจ• เจกเจฟเจธเจ• เจฆเฉ‡ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจธเจฌเฉฐเจง เจจเจพเจฒ, เจ…เจคเฉ‡ USB เจกเจฟเจธเจ• เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ‡เจธเจฆเฉ‡ เจฆเฉเจ†เจฐเจพ เจœเฉ‹เฉœเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ. UUID, LABEL เจจเฉ‡ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพเฅค เจ˜เจฐ เจตเจฟเฉฑเจš เจ‡เจธ เจจเฉ‚เฉฐ เจฌเจฃเจพเจˆ เจฐเฉฑเจ–เจฃเจพ เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจจเจนเฉ€เจ‚ เจธเฉ€, เจ‡เจธ เจฒเจˆ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจ‰เจกเฉ€เจ• เจตเจฟเฉฑเจš เจกเฉเฉฑเจฌ เจ—เจฟเจ† เจ…เจคเฉ‡, เจฒเจ—เจญเจ— 7 เจธเจพเจฒเจพเจ‚ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจจเฉ‚เฉฐ เจ…เจนเจฟเจธเจพเจธ เจนเฉ‹เจ‡เจ† เจ•เจฟ เจ•เฉ‹เจˆ เจตเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจนเฉฑเจฒ เจ•เจฐเจจ เจตเจพเจฒเจพ เจจเจนเฉ€เจ‚ เจธเฉ€เฅค

เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚

เจฌเฉ‡เจธเจผเฉฑเจ•, เจฒเจ—เจญเจ— เจ•เฉ‹เจˆ เจตเฉ€ เจกเจฐเจพเจ•เจŸ เจฒเจˆ เจ†เจชเจฃเจพ เจชเจฒเฉฑเจ—เจ‡เจจ เจฒเจฟเจ– เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจนเฉเจฃ เจ‡เฉฐเจจเจพ เจ†เจธเจพเจจ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เจน เจชเจคเจพ เจšเจฒเจฟเจ† เจ•เจฟ เจธเจฟเจธเจŸเจฎเจก เจธเจŸเจพเจฐเจŸเจ…เฉฑเจช เจฆเฉ‡ เจธเจฎเจพเจจเจพเจ‚เจคเจฐ เจธเฉเจญเจพเจ… เจฆเฉ‡ เจ•เจพเจฐเจจ, เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจฒเฉ‹เจกเจฟเฉฐเจ— เจชเฉเจฐเจ—เจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ เจ‡เฉฐเจจเจพ เจ†เจธเจพเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ. เจกเจฐเจพเจ•เจŸ เจฒเจˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจจเฉ‡ เจธเจญ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจฆเฉฑเจธเจฟเจ†เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฒเฉฐเจฌเฉ‡ เจชเฉเจฐเจฏเฉ‹เจ—เจพเจ‚ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจธเฉ€.

เจ•เจฟเจฆเจพ เจšเจฒเจฆเจพ

เจ‡เจน เจคเจฟเฉฐเจจ เจฏเฉ‚เจจเจฟเจŸเจพเจ‚ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจนเฉˆ:

  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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹