장치 노드에 대한 스크립트 실행

장치 노드에 대한 스크립트 실행

다음과 같은 문제가 있습니다. LVM에 암호화된 LV가 있는 Arch를 실행하는 컴퓨터가 있습니다. (암호화된) LV 내부에는 또 다른 PV가 있습니다. 그래서 실제로 두 개의 VG가 있습니다. 하나는 암호화되지 않은 데이터를 포함하고 다른 하나는 암호화된 데이터만 포함합니다.

지금은 일이 잘 되도록 노력하고 있어요. 암호화된 볼륨의 PV를 스캔하고 설치하는 스크립트가 있습니다. 안타깝게도 타이밍 문제로 인해 제대로 작동하지 않습니다.

내가 아는 한, 내가 전화 pvscan하거나 disk vgscan하면 lvscanLVM 서명이 검색되어 발견되면 새 VG가 활성화됩니다. 이것은 지금까지 작동합니다. 그런 다음 udev알림을 받고 아래에 다른 링크를 만드세요 /dev. 불행하게도 이는 비동기적으로 발생합니다. 따라서 내 스크립트는 파일 시스템을 확인/마운트하는 데 필요한 링크를 찾지 못한 채 계속 실행됩니다.

그래서 내 질문은 다음과 같습니다

  • udev모든 링크가 생성되어 사용할 준비가 될 때까지 기다릴 수 있습니까 ?
  • udev매개변수/환경변수/...로 연결된 모든 스크립트를 호출하는 규칙을 등록할 수 있나요 ?
  • 블록 장치 자체를 통해 udev생성된 링크와 일치하는 규칙을 등록할 수 있나요?
  • vgscan& Co.가 종료되고 해결될 때까지 기다릴 수 있는 방법이 있나요 udev?

다른 생각이 있으시면 듣고 싶습니다.

답변1

설정이 약간 특이합니다(LVM 내의 LVM).

일반적으로, 가능한 한 udev에 의존해야 하며 자신의 스크립트에 너무 많이 의존하지 않아야 합니다. 즉, 작업을 트리거하고 udev/systemd가 이벤트 트리거 방식으로 나머지를 처리하도록 합니다(일부 스크립트에서 명령을 순차적으로 실행하는 대신). ! 또한 "모든 것"이 아닌 귀하의 장치만 검사된다는 점에 유의하십시오.

무슨 일이 일어나고 있는지 이해하기 위해 읽고 69-lvm-metad.rules사용할 수도 있습니다 .udevadm monitor

그러나 나는 또한 귀하의 질문 중 일부에 답변해 드리겠습니다.

장치 노드에 대한 스크립트 실행

스크립트를 실행하려면 RUNudev 규칙에서 사용할 수 있습니다. 이는 RUN비동기식이며 실행 중입니다.뒤쪽에규칙이 처리되었습니다( 와 비교 PROGRAM).

ACTION=="add", KERNEL=="sdb", RUN+="/usr/local/bin/some_script"

udev는 udev-event의 변수를 기반으로 하는 KERNEL환경 변수를 사용하여 스크립트를 호출 합니다.ACTION

물론 심볼릭 링크를 일치시킬 수도 있지만 작업을 수행하려면 심볼릭 링크 이름에 의존하기보다는 실제 장치와 일치시키고 추가로 지정할 수도 있습니다. 이를 사용하여 udevadm monitor --property해당 속성(고유 ID 등)을 포함한 다양한 이벤트를 볼 수 있습니다. 그리고 링크가 추가될 예정이라 매칭이 어려울 수 있으니 참고해주세요(직접 확인하진 못했습니다).

   SYMLINK
       Match the name of a symlink targeting the node. It can be used once a SYMLINK key has been set in one of the preceding
       rules. There may be multiple symlinks; only one needs to match.

udev 이벤트가 처리되기를 기다리는 중

udevadm settle

모든 udev 이벤트가 처리될 때까지 차단됩니다. 또한 시간 초과 또는 특정 파일이 나타날 때까지 기다리는 매개 변수가 있지만 사용 사례에서는 매개 변수 없이 실행하는 것으로 충분합니다.

인용하다udevadm 맨페이지:

udevadm settle [options]
    Watches the udev event queue, and exits if all current events are handled.

관련 정보