새 장치(USB 스틱 또는 IDE/SATA HDD)가 PC에 연결될 때 OS 수준에서(예: 커널 수준에서 사용자 공간 수준으로) 어떤 일이 발생하는지 더 잘 이해하고 싶습니다. 또한 "dd" 명령이 어느 수준에서 작동하는지 알고 싶습니다.
내가 이해하는 바는 일단 외부 드라이브가 연결되면 커널이 이 이벤트를 "가로채서" udevd 데몬이 있는 상태에서 항상 듣고 있는 udev 시스템에 알린다는 것입니다. Udisks는 블록 장치 정보를 수집하는 인스턴스입니다. 이를 위해 Udisk에는 udev가 필요합니다. Udisks는 d-bus에 연결됩니다(dbus는 단순한 udisk 이상에서 사용됩니다. 많은 프로그램이 dbus를 사용하여 정보를 교환합니다). d-bus를 통해 누구나 udisk에 연결하고 현재 장치 목록이 무엇인지 물어볼 수 있습니다.
질문: dd 명령을 시작하면 d-bus에 연결되어 드라이브를 복사/이미지화할 수 있나요?
또한 Linux 레벨을 보여주는 Wikipedia의 사진도 첨부했습니다. 연결된 장치에서 해당 사진의 dd 명령 인스턴스까지의 경로를 알려주실 수 있나요?
미리 감사드립니다.
빈센조.
답변1
이것은 실제로 두 가지 질문입니다.
1)은 "읽기" 시스템 호출을 발행하고 결과를 얻은 다음 "쓰기" 시스템 호출을 발행하여 복사를 수행 하는 dd
일반 사용자 애플리케이션입니다 . 차이점은 블록 크기를 설정할 수 있다는 것입니다 . 이것이 바로 블록 장치가 전통적으로 복사에 사용되는 이유입니다. 그러나 오늘날에도 똑같은 일을 할 것이며 , 현대 버전 (아마도 고대 버전과는 달리)도 항상 완전한 블록을 읽고 쓸 것이기 때문에 그만큼 빠릅니다 .cp
cp
cp
dd
dd
cp /dev/sdb /dev/sdc
dd
cp
cp
"디스크 레이아웃"이나 그와 유사한 것을 얻기 위한 특별한 방법 도 없습니다 dd
. OS가 완료되었다는 신호를 보낼 때까지 읽기만 하면 됩니다.
2)
외부 드라이브가 연결되면 커널은 이 이벤트를 "가로채기"합니다.
모든 드라이버 수준 작업이 이미 커널에서 발생하기 때문에 커널은 실제로 이 이벤트를 가로채지 않습니다. 따라서 USB 장치를 연결하면 USB 호스트 컨트롤러 하드웨어가 이를 인식하고 인터럽트를 생성하고 USB 호스트 컨트롤러 드라이버가 이에 반응한 다음 USB 스택의 다양한 부분이 새 장치를 열거하기 시작합니다. 해당 장치 유형을 식별하고 잠재적인 드라이버를 식별합니다. , 이러한 드라이버 등으로 생성된 새 블록 장치를 연결합니다.
udev
커널이 이러한 이벤트를 사용자 공간에 전달하는 메커니즘일 뿐이므로 사용자 공간은 예를 들어 심볼릭 링크를 생성하여 이에 반응할 수 있습니다.
그리고 udevd 데몬 덕분에 시스템이 항상 듣고 있음을 udev에 알립니다.
Udisks는 블록 장치 정보를 수집하는 인스턴스입니다.
udisks
데스크톱은 D-Bus에서 모든 작업을 수행하는 것을 좋아하기 때문에 블록 장치 정보를 얻기 위해 데스크톱에서 사용하는 데스크톱 데몬입니다. D-Bus Desktop을 실행하지 않는 경우에는 실제로 필요하지 않습니다 udisks
(사실 일부 컴퓨터에서는 실행되지 않습니다).
d-bus를 통해 누구나 udisk에 연결하고 현재 장치 목록이 무엇인지 물어볼 수 있습니다.
/dev
또는 에서 정보를 보는 등 다른 방법으로도 이 작업을 동일하게 수행할 수 있습니다 /sys
.
전체 udev - udisk - 데스크탑 체인에는 데스크탑만 필요합니다.잘 아는새로운 블록 장치가 나타나거나 기존 블록 장치의 상태가 변경되면 데스크탑에 멋진 창 등이 표시될 수 있습니다. Linux를 전통적인 방식으로 사용하고 USB 스틱에 연결할 때 멋진 창이 필요하지 않은 경우에는 이것이 필요하지 않습니다.