udev
데이터를 복구하려고 하는 컴퓨터의 설정이 손상되었기 때문에 (참조나의 이 글) USB 플래시 드라이브에 해당하는 "캐릭터 스페셜" 장치에 쓰려고 하는데 문제가 있습니다.
내가 기대하는 것은 (루트 권한으로) 다음을 수행할 수 있다는 것입니다.
echo "test 123" > /dev/bus/usb/001/031
하지만 난 이해해
bash: echo: write error: Invalid argument
어떻게 되어가나요? 문자 장치에 쓰는 방법은 무엇입니까?
폴리스티렌: 일반적으로 예상했던 블록 장치( /dev/sdb
, 에 있는 것 )가 /dev/block
어떤 이유로 생성되지 않기 때문에 특히 흥미롭습니다. 그런데 USB 드라이브를 연결하면 실제로 캐릭터 장치가 생성되는 것을 확인했습니다. (그리고 제거하면 문자 장치도 삭제됩니다.) 해당 장치에 쓸 수 있는 방법을 찾을 수 있다면 오디오 케이블을 통해 데이터를 천천히 전송하는 데 드는 많은 수고를 덜 수 있습니다(현재로서는 이것이 최선의 방법입니다).
답변1
이는 "원시 USB" 장치입니다. 이를 사용하려면 몇 가지 USB 관련 ioctl()
기능이 필요합니다. 단순히 셸에서 원시 데이터를 쓰는 것만으로는 많은 성과를 거두지 못합니다. 데이터는 먼저 유효한 USB 패킷으로 포맷되어야 하며, 그런 다음 ioctl()
기능을 사용하여 장치 내의 올바른 USB 끝점에 대한 연결을 설정해야 합니다.
USB 저장 장치에 대해 이야기하고 있으므로 프로세스가 더욱 복잡해집니다. 이러한 USB 패킷의 경우 가능한 저장 명령 세트 6개 중 하나가 있어야 합니다. 실제로 가장 일반적인 명령 세트는 USB에 캡슐화된 SCSI 프로토콜인 "SCSI Transparent" 명령 세트입니다.
그러므로 먼저 /dev/sg*
자신만의 SCSI 명령 패킷을 만들어 디스크 장치에 쓰기 위해 장치를 사용하는 방법을 배워야 합니다. 이것이 달성되면 프로세스에 USB 전용 래퍼를 추가할 수 있으며 그런 다음에만 이러한 /dev/bus/usb/<busnum>/<devnum>
장치를 사용하여 원시 블록을 USB 저장 장치에 쓸 수 있습니다.
대부분의 경우 원시 USB를 사용하는 것은 ioctl()
매우 구체적인 것이 필요하지 않는 한 매우 지루합니다. 원시 USB 액세스가 필요한 대부분의 프로그래머는 libusb
다른 라이브러리(예: libftdi
FTDI USB-직렬 변환기 칩 개발자 수준 액세스를 위한 하드웨어)를 사용할 것입니다. USB의 기본 메커니즘을 처리합니다. 간단히 말해서, 귀하와 같은 구조 상황에서 원시 USB 저장 장치를 성공적으로 사용하려면 상당히 정교한 USB I/O 프로그래머가 되어야 합니다.
그렇긴 하지만, 귀하의 다른 게시물은 정말로 엄청난 데이터 복구 작업을 완료해야 했던 것처럼 보입니다. 그런 점에서 저는 귀하의 업적을 존중하지만... 또한 백업의 중요성도 이해하시기를 바랍니다.