저는 udev의 위대함을 이해하고 개발자들의 노력에 감사하면서도 단순히 그에 대한 대안이 있는지 궁금했습니다.
예를 들어, 내 시스템(하드웨어 변경 없음)에서 어쨌든 거의 동일한 대부분의 장치 노드를 생성하는 시작 스크립트를 만드는 방법이 있어야 한다고 상상할 수 있습니다.
건너뛰고 싶은 이점이나 이유는 udev
건너뛰기와 동일합니다 dbus
. 즉, 복잡성을 줄이고 시스템을 보다 안전하게 설정하기 위한 변경 사항을 늘립니다.
답변1
최신 Linux 커널은 커널이 발견하자마자 모든 장치 노드를 동적으로 생성하는 devtmpfs
파일 시스템 (고대 와 혼동하지 마십시오 devfs
) 을 지원합니다. (사실 최근 udev
출시된필요하다이것; udev는 더 이상 장치 노드를 생성하지 않고 심볼릭 링크만 생성한다는 것을 알 수 있습니다.)
마찬가지로 펌웨어 로딩도 커널로 이동되었으므로 udev
수행되는 유일한 남은 작업은 모듈 로딩(모달리아제에 따라)과 장치 권한 및 기타 udev 규칙 적용입니다.
따라서 이론적으로 완전 단일체 커널은신병udev 없이도 괜찮습니다.
그러나 여기서 진짜 문제는 나중에 일어나는 일입니다.
상당수의 사용자 공간 프로그램은
libudev
. 장치를 열거하고 추가/제거된 이벤트를 수신하는 것은 커널 인터페이스(sysfs 및 netlink)를 사용하여 직접 수행할 수 있지만 다양한 udev 규칙이 첨부한 모든 메타데이터 없이는 여전히 남게 됩니다./dev/disk/by-*
udev 규칙은 ,/dev/mapper
,/dev/input/by-path
,/dev/snd/by-path
등 의 다양한 "영구" 심볼릭 링크도 유지합니다 . 예를 들어, 두 개의 디스크가 연결되어 있는 경우 첫 번째 디스크가 항상sda
또는 이라는 보장은 없지만sdb
udev는 의 심볼릭 링크가/dev/disk/by-uuid
계속해서 올바른 디스크를 가리키도록 보장합니다.장치 노드는 이제 커널에 의해 생성되므로 더 이상 걱정할 필요가 없지만 일부 장치 유형은 동적으로 할당된 주/부 번호를 사용하기 시작했다는 점에 유의하는 것이 여전히 중요
/dev/fuse
합니다/dev/hpet
.~ 할 것이다재부팅할 때마다 숫자가 달라지므로 또는devtmpfs
(이전 시스템에서는) uevents를 수신하는 프로그램은 다음과 같습니다.필수의.
mdev
물론 이러한 작업 중 상당수는 와 같은 다른 프로그램을 통해 쉽게 수행할 수 있습니다 . 내 요점은 정적 /etc/MAKEDEV
스크립트가 더 이상 작동하지 않는다는 것입니다 ...
따라서 기본적으로 부팅 복잡성과 관련하여 udev는최소당신의 걱정.
답변2
udev
거기 에는 다양한 대안이 있습니다 . Gentoo는 다음과 같은 것을 사용할 수 있는 것 같습니다.mdev
. 또 다른 옵션은 udev
의 전임자를 사용하는 것입니다 devfsd
. 마지막으로 mknod
.
후자의 경우 다른 옵션처럼 임시 파일 시스템이 아닌 디스크에 노드를 생성할 수 있으므로 부팅 시 모든 것을 생성할 필요가 없습니다. 물론, 새 하드웨어(예: USB 스틱)를 연결하면 장치 파일을 동적으로 생성할 수 있는 유연성이 상실됩니다. 나는 이 시대의 표준 접근 방식이 합리적으로 필요할 수 있는 모든 장치 파일을 이미 생성해 두는 것이라고 생각합니다 /dev
(예: 많은 장치 파일).
물론 이러한 접근 방식 중 하나를 최신 배포판에서 작동시키는 것은 아마도 상당히 어려울 것입니다. 젠투 위키에서는 mdev
데스크톱 환경에서 작업하는 데 어려움이 있다고 언급합니다(젠투 외부는 물론이고). 마지막 devfsd
릴리스는 2002년이었습니다. 최신 커널에서도 작동할지 전혀 모르겠습니다. 수동으로 노드를 생성하는 것이 아마도 가장 실행 가능한 접근 방식일 것입니다. 그러나 비활성화하는 것조차 udev
어려울 수 있습니다. 특히 systemd
( udev
는 이제 의 일부 systemd
이므로 강력한 종속성을 암시합니다)를 사용하는 distos에서는 더욱 그렇습니다.
내 조언은 계속됩니다 udev
;)
답변3
몇 가지 대안이 있습니다:
- 부트스트랩의 일부로 실행되는 스크립트에 적절한
chmod
,chown
, 등의 명령 세트를 갖기만 하면 됩니다 .ln
systemd-udev
시스템 프로젝트의 일부인 플러그 앤 플레이 관리자를 사용하세요 .- 사용젠투의
eudev
systemd-udev
, 이는 systemd가 이제 크게 갈라진 포크입니다 . - 사용데부안의
vdev
는 Jude Nelson이 개발한 플러그 앤 플레이 관리자로 Devuan의 일부입니다. - Use
mdev
, 다른 답변과 달리 Gentoo의 것이 아닙니다. 내장된 플러그 앤 플레이 관리자입니다.BusyBox. - 사용짜증나
mdev
Dimitris Papastamos가 개발한 플러그 앤 플레이 관리자입니다. - 사용로랑 베르코의
mdevd
BusyBox와 구성이 호환되지만mdev
자체 소켓 처리를 수행하고 LISTEN 프로토콜을 이해하지 못합니다.
첫 번째를 제외하고 이들 모두에는 장치에 대한 커널 알림 이벤트에 반응하는 방법을 설명하는 규칙 세트가 필요합니다. 확실히.
/proc/sys/kernel/hotplug
또한 두 개의 mdev
s와 같이 를 위해 설계된 프로그램을 사용하고 netlink 소켓을 수신한 다음 해당 프로그램을 생성하여 이를 적응시키고 직렬화하는 도구도 있습니다 .
답변4
이것은 오래되었지만 헛된 검색을 하는 다른 사람들을 위해 여기에 내 솔루션을 캡처하고 싶습니다.
udev를 피하는 것은 쉽지 않습니다. DEVTMPFS를 구성에서 제외해도 커널이 /dev에 RAM 디스크를 마운트하고 채우는 것이 중단되지 않습니다. 불행하게도 필요한 /dev/shm 및 /dev/pts 마운트 지점을 생성하지 않습니다. 필요한 것은 부팅 인수에 devtmpfs.mount=0을 추가하는 것입니다.