내부 드라이브 앞에 외부 드라이브를 넣지 않도록 커널에 어떻게 지시합니까?

내부 드라이브 앞에 외부 드라이브를 넣지 않도록 커널에 어떻게 지시합니까?

일반적으로 이름을 사용하는 내부 드라이버가 있습니다 /dev/sda.... /dev/sdc하지만 외장 하드 드라이브를 연결하고 재부팅하면 /dev/sdb어떤 이유로든 순서가 바뀌고 외장 드라이브를 차지하게 됩니다.

이제 UUID를 통해 장치를 참조할 수도 있지만 기억하기는 어렵습니다. 내부 하드웨어를 변경하지 않는 한 이러한 재정렬을 방지하고 싶습니다. 최소한 외장 하드 드라이브가 처음 4개의 드라이브에 연결되는 것을 방지하고 싶습니다.

답변1

기본적으로 장치 이름은 저장소 컨트롤러 드라이버가 초기화될 때 /dev/sd*선착순으로 할당됩니다 . 여러 개의 서로 다른 스토리지 컨트롤러가 있는 경우 로드 순서를 조작할 수 있습니다.

이것이 가능하지 않다면 udev 규칙을 작성하는 방법을 배워야 할 때입니다. 어렵지 않습니다.

첫 번째 실행 udevadm info -q all -a -n /dev/sda. 그러면 /dev/sdaudev 디스크를 식별하는 데 사용할 수 있는 모든 속성이 나열됩니다. 명령은 /dev/sda디스크 장치에서 시작하여 장치 트리 위로 이동하여 한 번에 하나의 속성 블록을 출력합니다. 첫 번째 블록의 속성을 사용할 수 있습니다.그리고 당신이 선택한 또 다른 작품.

첫 번째 블록은 항상 실제 블록 장치입니다. 유용한 속성이 많지 않은 경향이 있지만 이 SUBSYSTEM속성을 사용하여 규칙이 실제 블록 장치에 대해서만 실행되도록 할 수 있습니다. 따라서 udev 규칙의 첫 번째 조건은 입니다 SUBSYSTEM=="block".

일반적인 SATA 디스크의 경우 두 번째 블록에는 sd드라이버 수준 정보가 포함됩니다. 특정 디스크를 고유하게 식별하는 데 사용할 수 있는 ATTRS{model}및/또는 이 있습니다 . 공백이 많이 포함된 긴 문자열일 ATTRS{wwid}수 있지만 ATTRS{wwid}드라이브의 일련 번호나 기타 고유 식별자를 포함해야 합니다. 이것이 가장 적합합니다. 일련 번호 주위에 공백이나 기타 중요하지 않은 문자열이 있는 경우 다음과 같이 일치시킬 수 있습니다.

ATTRS{wwid}=="*<serial number>*"

디스크 장치를 고유하게 식별할 수 있을 만큼 충분하면 해당 장치로 무엇을 할지 결정할 수 있습니다. 가장 좋은 해결책은 아마도 SYMLINK+="custom_name"현재의 실제 장치 이름을 자동으로 가리키는 링크를 만드는 것입니다.

실제 장치 이름을 하드코딩하는 것과 같은 방법을 사용할 수도 있지만 NAME="sda"그렇게 하는 경우 사용자 정의 udev 규칙이 아직 없는 디스크가 중복 할당을 받지 않도록 모든 현재 디스크에 대해 이러한 규칙을 만드는 것이 좋습니다. (이렇게 하면 /etc/fstab새 이름과 일치하도록 파일을 업데이트하고 실수할 경우를 대비해 외부 미디어에서 부팅하여 문제를 해결하는 방법도 알아야 합니다. 이 점에서는 심볼릭 링크가 더 안전합니다.)

따라서 일련 번호가 S12345이고 모델 문자열이 있는 디스크의 경우 다음 규칙을 사용하여 "HyperDisk "별칭을 할당할 수 있습니다 . (참고: 속성에 후행 공백이 있는 것으로 보고되면 와일드카드를 포함하거나 규칙에 포함해야 합니다. 문자열은 정확히 나열된대로)./dev/dsk_sysudevadm info

SUBSYSTEM=="block", ATTRS{model}=="HyperDisk   ", ATTRS{wwid}="*S12345*", SYMLINK+="dsk_sys"

예를 들어 사용자 정의 규칙을 입력 /etc/udev/rules.d/custom.rules하고 재부팅(또는 실행 partprobe /dev/sda)하면 이제 해당 디스크를 가리키는 심볼릭 링크가 있어야 합니다 /dev/dsk_sys. 이름이 변경되더라도 해당 디스크를 계속 가리킵니다 /dev/sd*.

관련 정보