
특정 플래시 드라이브에 대해 USB 플래시 드라이브에 특정 /dev 이름(예: /dev/backup1, /dev/backup2....)이 할당되도록 RHEL7에서 udev를 구성하려고 합니다. / dev/sdx 할당을 수행했지만 udev 규칙을 사용하여 자동화된 심볼릭 링크를 설정하려고 합니다.
blkid는 나에게 다음을 제공합니다:
/dev/sdi1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdj1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdk1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
나는 다음과 같은 작업을 하고 싶었습니다: 내 규칙 파일에서
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="64A5-F009", SYMLINK+="backupkeya%n"
하지만 3개의 USB 플래시 드라이브 모두 동일한 UUID를 가지고 있기 때문에 특정 플래시 드라이브가 특정 가상 장치 이름에 연결되기를 원했습니다. 따라서 "drive2"라고 표시된 항목을 연결하면 /dev/backupkeyb에 연결됩니다. 현재 우리는 3개의 플래시 드라이브를 가지고 있지만 약 8개로 확장하려고 합니다.
udevadm은 나에게 독특함을 줍니다...
[root@alpha2 mnt]# udevadm info /dev/sdg | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014252
[root@alpha2 mnt]# udevadm info /dev/sdi | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0330219070015017
[root@alpha2 mnt]# udevadm info /dev/sdj | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014208
udev 규칙을 다음과 같이 변경했습니다(/etc/udev/rules.d/99-symlink.rules).
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/bin/udevadm info --name=%N", RESULT=="0305119070014208", SYMLINK+="backupkeyc%n"
그러나 일련 번호가 ...4208인 키를 연결했을 때 /dev/backupkeyc 심볼릭 링크가 생성되지 않았습니다. udevadm 문의 출력이 내 RESULT==와 정확히 일치하지 않았기 때문인 것 같습니다.
/usr/local/udevinfo 스크립트를 생성하고 udev 규칙을 어수선하게 하지 않기 위해 아래와 같이 PROGRAM=="/usr/local/udevinfo %N"을 변경했습니다...플래시 드라이브를 넣은 후 - 심볼릭 링크 없음 - 그러나 더 중요한 것은 장치 이름을 포함해야 하는 /tmp/passeddata에 아무것도 없었기 때문에 udev 규칙이 실행되지 않은 것처럼 보입니다.
echo "$1" >> /tmp/passeddata
udevadm info --name=$1 | grep "ID_SERIAL_SHORT" | awk -F= '{print $2}'
내가 놓친 게 있나요? 내가 하려는 일을 더 쉽게 할 수 있는 방법이 있나요?
답변1
예, 'udevadm info'는 일련번호뿐만 아니라 수많은 정보를 출력하기 때문에 정확히 일치하지 않았습니다.
그러나 'udevadm info'에 표시되는 모든 내용은에 의해 설정udev는 스스로 규칙을 따릅니다(종종 udev 내장 기능을 호출하여). 따라서 ENV{ID_SERIAL_SHORT}=="..."
외부 프로그램을 호출할 필요 없이 이미 일련번호를 사용 가능합니다 . ("E:" 접두사가 실제로 이를 나타냅니다.)
KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="0305119070014208", SYMLINK+="backupkeyc"
(실제로 'udevadm info'가 작동하지 않을 수도 있습니다.조금도규칙 처리 중. udev 규칙의 일반적인 실수는 "규칙 완료" 신호에서만 정보를 얻는 도구를 사용하는 것입니다.)
답변2
나는 그러한 솔루션에 스크립트를 사용하지 않고 환경을 직접 사용한다는 @grawity의 답변에 전적으로 동의합니다. 하지만 다른 측면에서는 다음과 같습니다.
프로그램의 구문은 귀하가 작성하고 작동하는 방식으로 정확합니다. 아마도 파일이 생성되지 않는 파일에는 아무것도 없다는 뜻일까요? 그러면 (스니펫에서와 같이) Shebang 라인이 누락되었거나 실행 권한이 있습니까? 그렇지 않으면 그런 식으로 작동해야 합니다. 그리고 udev가 알고 있는 모든 정보가 환경에서 변수로 사용 가능하므로 인수를 전달할 필요도 없습니다. 따라서 스크립트는 udev 규칙 PROGRAM 문에 의해 호출될 때 해당 항목에 액세스할 수 있습니다.
그러나 다른 접근 방식을 따르는 것이 훨씬 더 편리하고 일반적입니다.
장치의 일련 번호를 사용하지 않고 UUID 또는 파티션 레이블을 할당합니다(또는 두 가지 모두를 사용하여 동일한 UUID 또는 파티션 레이블을 가진 다른 항목이 삽입될 확률을 낮춤) ). 따라서 파티션의 레이블을 다시 지정하거나 다시 포맷하여 새로운 "UUID"를 설정하십시오. 다시 포맷하고 싶지 않은 경우 기존 파티션 내에서 UUID 정보를 패치하는 것도 가능합니다(이 작업을 수행하는 도구에 대해서는 모르지만 직접 작성하는 것은 정말 간단합니다).
그렇게 하면 시스템을 수정하지 않고도 대상을 교체할 수 있습니다. 또는 예를 들어 수영장에 스틱을 더 추가하세요.
이 경우 특정 형식의 파티션 레이블을 특정 형식의 심볼릭 링크 이름으로 변환하는 작은 PROGRAM 스크립트를 사용하는 것이 더 나을 수도 있습니다.
또 다른 방법(가능한 경우 가장 표준을 준수하는 방법)은 장치에서 GPT를 사용하고 사용 사례에 대해 특정 파티션 유형 및 -UUID 조합을 할당하는 것일 수 있습니다. 추가 파티션 이름도 가능합니다.