dracut + systemd + LUKS + usbflash = เด“เดŸเตเดŸเต‹ เด…เตบเดฒเต‹เด•เตเด•เต

เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดฎเตเดฎเตเดชเต เดธเต†เตปเตเดฑเต‹เดธเต 7 (RHEL 7) เดชเตเดฑเดคเตเดคเดฟเดฑเด™เตเด™เดฟเดฏเดชเตเดชเต‹เตพ เด•เดฅ เด†เดฐเด‚เดญเดฟเดšเตเดšเต. เดจเดฟเด™เตเด™เตพ Centos 6 เด‰เดณเตเดณ เดกเตเดฐเตˆเดตเตเด•เดณเดฟเตฝ เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด†เดตเดถเตเดฏเดฎเดพเดฏ เด•เต€เด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต USB เดซเตเดฒเดพเดทเต เดกเตเดฐเตˆเดตเต เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดกเตเดฐเตˆเดตเตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เด…เตบเดฒเต‹เด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ เดชเตเดฐเดถเตเดจเด™เตเด™เดณเตŠเดจเตเดจเตเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, 7 เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดคเดชเตเดชเต‹เตพ, เดจเดฟเด™เตเด™เตพ เดชเดคเดฟเดตเตเดชเต‹เดฒเต† เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเดฟเดฒเตเดฒ. เด•เต‹เตบเดซเดฟเด—เดฑเดฟเดฒเตเดณเตเดณ เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต sysvinit-เดฒเต‡เด•เตเด•เต dracut เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเดคเดฟเตฝ เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดธเดพเดงเดฟเดšเตเดšเต: echo 'omit_dracutmodules+=" systemd "' > /etc/dracut.conf.d/luks-workaround.conf
เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดตเต‡เด—เดคเตเดคเดฟเดฒเตเด‚ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเตเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจ systemd- เดฏเตเดŸเต† เดŽเดฒเตเดฒเดพ เดธเต—เดจเตเดฆเดฐเตเดฏเดตเตเด‚ เด‡เดคเต เดžเด™เตเด™เตพเด•เตเด•เต เดชเต†เดŸเตเดŸเต†เดจเตเดจเต เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดคเตเดคเดฟ, เด‡เดคเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดชเตเดชเต เดธเดฎเดฏเด‚ เด—เดฃเตเดฏเดฎเดพเดฏเดฟ เด•เตเดฑเดšเตเดšเต.
เด•เดพเดฐเตเดฏเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เด‰เดฃเตเดŸเต: 905683
เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเดคเต†, เดžเดพเตป เดŽเดจเดฟเด•เตเด•เดพเดฏเดฟ เด‡เดคเต เด‰เดฃเตเดŸเดพเด•เตเด•เดฟ, เด‡เดชเตเดชเต‹เตพ เดžเดพเตป เด…เดคเต เดชเตŠเดคเตเดœเดจเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเด™เตเด•เดฟเดŸเตเดจเตเดจเต, เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดตเตผ, เดตเดพเดฏเดฟเด•เตเด•เตเด•.
dracut + systemd + LUKS + usbflash = เด“เดŸเตเดŸเต‹ เด…เตบเดฒเต‹เด•เตเด•เต

เด†เดฎเตเด–เด‚

Systemd, เดžเดพเตป เด†เดฆเตเดฏเดฎเดพเดฏเดฟ Centos 7-เดจเตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟเดฏเดชเตเดชเต‹เตพ, เด’เดฐเต เดตเดฟเด•เดพเดฐเดตเตเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เดฟเดฏเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดธเตผเดตเต€เดธเต เดฎเดพเดจเต‡เดœเตโ€Œเดฎเต†เตปเตเดฑเต เดตเดพเด•เตเดฏเด˜เดŸเดจเดฏเดฟเตฝ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเต เดชเตเดฑเดฎเต†, เดŽเดจเดฟเด•เตเด•เต เด†เดฆเตเดฏเด‚ เดตเดฒเดฟเดฏ เดตเตเดฏเดคเตเดฏเดพเดธเด‚ เดคเต‹เดจเตเดจเดฟเดฏเดฟเดฒเตเดฒ. เดคเตเดŸเตผเดจเตเดจเต, เดŽเดจเดฟเด•เตเด•เต systemd เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดŸเต, เดชเด•เตเดทเต‡ เด†เดฆเตเดฏ เดฎเดคเดฟเดชเตเดชเต เด…เตฝเดชเตเดชเด‚ เด•เต‡เดŸเดพเดฏเดฟ, เด•เดพเดฐเดฃเด‚ เดกเดฟเดธเตเด•เต เดŽเตปเด•เตเดฐเดฟเดชเตเดทเดจเตเดฎเดพเดฏเดฟ เดšเต‡เตผเดจเตเดจเต systemd เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเต‚เดŸเตเดŸเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดกเตเดฐเดพเด•เตเดฑเตเดฑเต เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผ เด•เต‚เดŸเตเดคเตฝ เดธเดฎเดฏเด‚ เดšเต†เดฒเดตเดดเดฟเดšเตเดšเดฟเดฒเตเดฒ. เดชเตŠเดคเตเดตเต‡, เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเต, เดŽเดจเตเดจเดพเตฝ เดธเต†เตผเดตเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เดดเต†เดฒเตเดฒเดพเด‚ เดกเดฟเดธเตเด•เต เดชเดพเดธเตเดตเต‡เดกเต เดจเตฝเด•เตเดจเตเดจเดคเต เดเดฑเตเดฑเดตเตเด‚ เดฐเดธเด•เดฐเดฎเดพเดฏ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒ.
เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดถเตเดชเดพเตผเดถเด•เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดฎเดพเดจเตเดตเตฝ เดชเด เดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเดชเตเดชเต‹เตพ, systemd เดฎเต‹เดกเดฟเตฝ USB-เดฏเตเดฎเดพเดฏเตเดณเตเดณ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดธเดพเดงเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟ, เดŽเดจเตเดจเดพเตฝ เด“เดฐเต‹ เดกเดฟเดธเตเด•เดฟเดจเต†เดฏเตเด‚ เด’เดฐเต USB เดกเดฟเดธเตเด•เดฟเดฒเต† เด’เดฐเต เด•เต€เดฏเตเดฎเดพเดฏเดฟ เดฎเดพเดจเตเดตเตฝ เด…เดธเตเดธเต‹เดธเดฟเดฏเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดคเตเดฐเดฎเต‡, USB เดกเดฟเดธเตเด•เดฟเดจเต† เด…เดคเดฟเตปเตเดฑเต† เดธเดนเดพเดฏเดคเตเดคเต‹เดŸเต† เดฎเดพเดคเตเดฐเดฎเต‡ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเต‚. 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•