dracut + systemd + LUKS + usbflash = เบ›เบปเบ”เบฅเบฑเบญเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เป€เบฅเบทเปˆเบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เบปเบ™เบ™เบฒเบ™เบกเบฒเปเบฅเป‰เบง, เบเบฑเบšเป„เบ›เป€เบกเบทเปˆเบญ Centos 7 (RHEL 7) เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เปƒเบ™เป„เบ”เบฃเบŸเปŒเบ”เป‰เบงเบ Centos 6, เบˆเบฐเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบšเบเบฒเบ™เบ›เบปเบ”เบฅเบฑเบญเบเป„เบ”เบฃเบŸเปŒเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ USB flash drive เบ”เป‰เบงเบเบเบฐเปเบˆเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบกเบทเปˆเบญ 7 เป„เบ”เป‰เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ, เบ—เบฑเบ™เบ—เบตเบ—เบฑเบ™เปƒเบ”เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบ„เบตเบเปƒเบŠเป‰. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบŠเบญเบเบซเบฒเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เปƒเบ™เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™ dracut เบเบฑเบš sysvinit เป‚เบ”เบเปƒเบŠเป‰เป€เบชเบฑเป‰เบ™เบ‡เปˆเบฒเบเป†เปƒเบ™ config: echo 'omit_dracutmodules+=" systemd "' > /etc/dracut.conf.d/luks-workaround.conf
เป€เบŠเบดเปˆเบ‡เบ—เบฑเบ™เบ—เบตเป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฒเบ”เบ„เบงเบฒเบกเบ‡เบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบฅเบฐเบšเบปเบš - เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเป„เบงเปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบฅเบฐเบšเบปเบš, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบงเบฅเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบฅเบฐเบšเบปเบšเบซเบผเบธเบ”เบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ.
เบชเบดเปˆเบ‡เบ—เบตเปˆเบเบฑเบ‡เบกเบตเบขเบนเปˆ: 905683
เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบเบฒเบ™เปเบเป‰เป„เบ‚, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ•เบปเบ™เป€เบญเบ‡, เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบšเปˆเบ‡เบ›เบฑเบ™เบกเบฑเบ™เบเบฑเบšเบ›เบฐเบŠเบฒเบŠเบปเบ™, เบœเบนเป‰เบ—เบตเปˆเบชเบปเบ™เปƒเบˆ, เบญเปˆเบฒเบ™เบ•เปเปˆ.
dracut + systemd + LUKS + usbflash = เบ›เบปเบ”เบฅเบฑเบญเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

Systemd, เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Centos 7 เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเปƒเบ”เป†, เป€เบžเบฒเบฐเบงเปˆเบฒเบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเปƒเบ™ syntax เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เบ‚เป‰เบญเบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบเปƒเบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”. เบ•เปเปˆเบกเบฒ, เบ‚เป‰เบญเบเบกเบฑเบ systemd, เปเบ•เปˆเบ„เบงเบฒเบกเบ›เบฐเบ—เบฑเบšเปƒเบˆเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเป€เบฅเบฑเบเบ™เป‰เบญเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ dracut เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ boot เป‚เบ”เบเปƒเบŠเป‰ systemd เบชเบปเบกเบ—เบปเบšเบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เปเบœเปˆเบ™. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เปเบ•เปˆเบเบฒเบ™เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เปเบœเปˆเบ™เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบชเบธเบ”.
เป‚เบ”เบเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเป„เบ”เป‰เบชเบถเบเบชเบฒเบ„เบนเปˆเบกเบท, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบงเปˆเบฒเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบซเบกเบ”เบฅเบฐเบšเบปเบšเบเบฑเบš USB เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบ„เบนเปˆเบกเบทเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเปเบœเปˆเบ™เบ—เบตเปˆเบกเบตเบเบธเบ™เปเบˆเปƒเบ™เปเบœเปˆเบ™ USB, เปเบฅเบฐเปเบœเปˆเบ™ USB เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบšเบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. UUID, LABEL เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เบกเบฑเบ™เบšเปเปˆเบชเบฐเบ”เบงเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒเบชเบดเปˆเบ‡เบ™เบตเป‰เบขเบนเปˆเป€เบฎเบทเบญเบ™, เบชเบฐเบ™เบฑเป‰เบ™เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เป‰เบญเบเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เบฅเปเบ–เป‰เบฒเปเบฅเบฐ, เบซเบผเบฑเบ‡เบˆเบฒเบเบฅเปเบ–เป‰เบฒเป€เบเบทเบญเบš 7 เบ›เบต, เบ‚เป‰เบญเบเบฎเบนเป‰เบงเปˆเบฒเบšเปเปˆเบกเบตเปƒเบœเบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ.

เบšเบฑเบ™เบซเบฒ

เปเบ™เปˆเบ™เบญเบ™, เป€เบเบทเบญเบšเบ—เบธเบเบ„เบปเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™ plugin เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบชเปเบฒเบฅเบฑเบš 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 เปเบฅเบฐเบชเป‰เบฒเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™ kernel. เป€เบ„เบทเปˆเบญเบ‡เบ›เบฑเปˆเบ™เป„เบŸเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบซเบ™เปˆเบงเบ 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™