udev를 사용하여 파티션에 e2label을 설정하는 방법은 무엇입니까?

udev를 사용하여 파티션에 e2label을 설정하는 방법은 무엇입니까?

디스크를 삽입할 때 자동으로 파티션에 레이블을 할당하고 싶습니다. 내 작업 방법은 다음과 같은 새로운 udev 규칙을 만드는 것입니다.

KERNEL=="sd[a-z][0-9]", KERNELS=="ata[12]", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4", ENV{ID_FS_LABEL}=="", ACTION=="add", RUN+="/bin/sh -c 'sudo e2label %E{DEVNAME} TEST_LABEL'"

이 규칙은 파일 시스템이 인지 ext4, 현재 e2label이 비어 있는지 확인합니다 "". udev 규칙의 모든 조건이 충족되면 sudo e2label %E{DEVNAME} TEST_LABEL명령이 실행됩니다 .

이것은 작동합니다. 거의? 디스크를 삽입하고 할당 태그 확인을 사용했을 때 e2label이미 할당되어 있음을 발견했습니다 TEST_LABEL. 그런데 태그를 확인해 보니 lsblk -f해당 LABEL섹션이 비어 있습니다. 태그를 확인하는 다른 udev 규칙 TEST_LABEL도 우선순위가 낮더라도 실행되지 않습니다. 그런 다음 디스크를 제거했다가 다시 삽입하면 실행 시 레이블이 표시되고 lsblk -f다른 udev 규칙이 실행됩니다.

왜 이런거야? 내가 무엇을 잘못하고 있거나 무엇을 이해하지 못합니까?

답변1

udev는 각 작업/규칙에 대한 태그를 읽지 않으며, 60-persistent-storage.rules사용될 때 한 번 읽은 blkid다음 장치가 변경되지 않는 한 업데이트하지 않습니다. 따라서 레이블을 변경한 후 실행된 규칙은 에서 얻은 (현재는 사용되지 않는) 값을 계속 사용합니다 60-persistent-storage.rules. 이것이 lsblk새 태그가 표시되지 않는 이유 이기도 합니다. lsblkudev 데이터베이스를 사용하여 이 정보를 얻으면 장치를 검색하지 않습니다(이를 사용해야 합니다 blkid -p). 따라서 규칙에서 장치를 다시 검색하거나 ID_FS_LABEL및를 ID_FS_LABEL_ENC새 레이블로 설정해야 합니다.

그런데. 일반적으로 실행하면 e2fslabeludev 변경 이벤트가 생성되므로 udev는 장치를 다시 검색합니다. udev는 inotify를 사용하여 장치의 메타데이터 변경 사항을 모니터링하지만 규칙에 따라 장치를 변경하면 이런 일이 발생하지 않습니다(그렇지 않으면 다음과 같은 일이 발생할 수 있습니다). 무한 오류) 매번 새로운 변경 이벤트를 생성하는 변경 이벤트 루프).

관련 정보