Init
This commit is contained in:
parent
5fb49494ed
commit
7dce0c6a4d
|
@ -0,0 +1,8 @@
|
|||
[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
|
|
@ -0,0 +1,54 @@
|
|||
#!/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@luks\x2d${_UUID_ESC}.service.d"
|
||||
cat > "${SYSTEMD_RUN}/systemd-cryptsetup@luks\x2d${_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-by\x2duuid-${_UUID_ESC}.device
|
||||
After=dev-disk-by\x2duuid-${_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
|
|
@ -0,0 +1,15 @@
|
|||
[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
|
|
@ -0,0 +1,87 @@
|
|||
#!/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
|
|
@ -0,0 +1,18 @@
|
|||
#!/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."
|
|
@ -0,0 +1,5 @@
|
|||
[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
|
|
@ -0,0 +1,28 @@
|
|||
#!/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_simple "$moddir/luks.key" "/etc/luks.key"
|
||||
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"
|
||||
}
|
|
@ -1,2 +1,10 @@
|
|||
# dracut-luks-autounlock
|
||||
dracut + systemd + LUKS + usbflash
|
||||
|
||||
That project solve issue when you want auto unlock LUKS volumes with USB key but you're initramfs using systemd.
|
||||
|
||||
## Instalation
|
||||
1. Place 99luks-auto inside /usr/lib/dracut/modules.d
|
||||
2. chmod +x /usr/lib/dracut/modules.d/99luks-auto/*.sh
|
||||
3. echo 'add_dracutmodules+=" luks-auto "' > /etc/dracut.conf.d/luks-auto.conf
|
||||
4. dracut -f
|
||||
|
|
Loading…
Reference in New Issue