외장 하드 드라이브를 연결할 때 LUKS 파티션의 암호를 해독하려고 합니다. 그래서 다음과 같이 udev 규칙을 구성했습니다.
ACTION=="add", KERNEL=="sdb1", SUBSYSTEM=="block", ATTR{size}=="1048576000", RUN+="/home/user/myfile.sh
myfile.sh 스크립트:
password=`su - user -c 'export DISPLAY=:0;kdialog --password "Decrypt HDD"'`
sleep 5
echo "$password" | cryptsetup luksOpen /dev/sdb1 backups
mount /dev/mapper/backups /media/backups/
스크립트는 다음과 같이 비밀번호를 읽습니다.대화 상자, 파티션의 암호를 해독하고 마운트한 후. 수동으로 실행하면 작동됩니다. 문제는 USB를 꽂을 때,대화 상자시작되었지만 /dev/sdb1 암호화된 파티션은 스크립트가 완료될 때까지 감지되지 않습니다. 따라서 cryptsetup luksOpen 및 mount는 아무 작업도 수행하지 않습니다(암호화된 파티션이 감지되기 전에 시작되기 때문입니다)...
udev 규칙이 포함된 파일은 /etc/udev/rules.d의 90-crypt.rules입니다.
답변1
마지막으로 RUN을 사용하면 긴 프로그램/스크립트를 실행할 수 없다는 문제를 발견했습니다. 그리고 해결책은 스크립트를 실행하고 규칙을 사용하는 서비스를 만드는 것입니다.SYSTEMD_WANTS당신의 서비스로.
남자 udev에서:
RUN{type} "유형"에 따라 특정 이벤트에 대한 모든 규칙을 처리한 후 실행될 프로그램 목록에 프로그램을 추가합니다.
"program"
Execute an external program specified as the assigned value. If no absolute path is given, the program is expected to live in /lib/udev; otherwise, the absolute path must be specified.
This is the default if no type is specified.
"builtin"
As program, but use one of the built-in programs rather than an external one.
The program name and following arguments are separated by spaces. Single quotes can be used to specify arguments with spaces.
This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device.
Starting daemons or other long-running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.
Note that running programs that access the network or mount/unmount filesystems is not allowed inside of udev rules, due to the default sandbox that is enforced on systemd-udevd.service.
해결책:
/etc/systemd/system/myservice.service>에 서비스 생성
[Unit]
Description=Auto backup
[Service]
ExecStart=/home/manu/Sysadmin/auto-backup.sh
그리고 udev 규칙을 변경합니다:
ACTION=="add", KERNEL=="sdb1", SUBSYSTEM=="block", ATTR{size}=="1048576000", ENV{SYSTEMD_WANTS}="myservice.service"