저는 최소한의 Linux와 일부 사용자 정의 코드를 실행하는 간단한 "장치" 유형 장치를 구축하려고 합니다. 제가 제공하는 기능 중 하나는 사용자가 USB 플래시 드라이브나 하드 드라이브를 특정 USB 포트에 연결할 수 있고 장치가 해당 장치의 파일 시스템에 데이터를 쓸 수 있다는 것입니다.
이 질문에는 두 부분이 있습니다.
#1: 특정 하드웨어 USB 포트에 연결된 USB 대용량 저장 장치의 실제 블록 장치 파일을 확인하는 방법은 무엇입니까?
단순히 USB 저장 장치가 항상 연결되어 있다고 가정하는 것은 /dev/sdb
사용자가 허브를 포트에 연결한다고 가정하거나 여러 끝점이 있는 장치(예: 카드 리더기)를 사용한다고 가정하는 것처럼 다소 위험해 보입니다. 또한 장치가 USB 포트의 USB 장치를 사용하여 재부팅되거나 부팅되고 어떤 이유로 시스템이 USB 장치 /dev/sda
및 내부 저장소를 생성하기로 결정했다고 가정합니다 /dev/sdb
. (아마도 장치의 부팅 미디어도 USB일 것이므로 그럴 가능성이 매우 높습니다.)
그래서 기본적으로 제가 하고 싶은 것은 "USB 대용량 저장 장치에 대한 장치 파일(예: /dev/sdb)을 주세요"라고 말하는 것입니다.특정한USB 포트. "포트에서 여러 블록 장치가 발견되면 "배열" 또는 해당 단일 장치와 관련된 모든 엔드포인트 목록이 필요합니다.
예를 들어 누군가 허브를 포트에 연결하고 여러 플래시 드라이브를 해당 허브에 연결하면 다음 중 하나를 선택할 수 있습니다. 직접) 또는 2) 허브에 연결된 모든 블록 장치 목록을 가져옵니다(멀티 엔드포인트 장치와 유사).
또한 누군가가 해당 포트에 저장 장치가 아닌 장치를 연결하는 경우, 내가 무엇을 생각해내든 저장 장치 노드를 제공해서는 안 됩니다.
#2: 쓰기가 발생하지 않는 한 먼저 마운트 해제하지 않고도 안전하게 제거할 수 있도록 파일 시스템을 마운트하는 가장 좋은 방법은 무엇입니까?
예를 들어, 사용자는 장치의 표시등이 깜박이는 동안 장치를 절대 제거하지 말라고 지시받습니다. 그러나 사용자에게 수동 제거 프로세스를 수행하도록 요구하면 장치에 대한 사용자 환경이 좋지 않을 수 있습니다. (매우 작은 사용자 인터페이스를 가지므로 접근하기 쉽고 안전한 하드웨어 제거 옵션을 구현하는 것은 어려울 것입니다.) 기본적으로 사용자는 다음 사항이 시각적으로 분명해지는 즉시 드라이브를 꺼낼 수 있어야 합니다. 없음 더 많은 쓰기가 발생합니다.
분명히 대부분의 연결된 장치는 vfat입니다. 또한 ntfs(ntfs-3g를 통해)와 exfat(exfat-fuse를 통해)를 지원하고 싶습니다.
내 코드로 데이터를 쓸 때마다 간단히 동기화를 실행할 수 있지만 한 가지 사용 사례는 데이터를 청크 단위로 USB 장치로 스트리밍하는 외부 애플리케이션입니다. 데이터 로거를 생각해 보세요. 파일을 생성하고 데이터를 청크로 전송하지만,~ 사이각 블록은 사용자가 쓰기 사이에 드라이브를 가져올 수 있도록 하고 시스템이 이를 감지하여 데이터 로깅을 완전히 중지하도록 하고 드라이브 구조가 안전한지 확인해야 합니다.
또한 장치를 가져온 후에는 내 코드가 마운트를 제거하고 드라이브를 볼 것으로 예상되는 모든 작업을 중지할 수 있도록 신속하게 인식해야 합니다.
나는 사용자가 드라이브를 마음대로 당길 수 있도록 많은 것을 요구하고 있다는 것을 알고 있습니다. 분명히 사용자가 드라이브를 당기는 경우기간이것을 쓰는 것은 문제가 될 것입니다. 그러나 나는 적어도 이 성배에 가능한 한 가까이 다가가고 싶습니다.
아이디어가 있나요?
답변1
(1)의 경우 udisk를 확인해 보시기 바랍니다. udisk는 많은 문제를 해결해 주었습니다. "사용자가 삽입하면 어떻게 되나요?" 같은 것도 포함됩니다.둘저장 장치? ” (기억하세요: USB 허브 및 물론 일부 장치는 두 가지 이상의 형태로 제공됩니다.) udisk를 사용하면 사용 가능한 장치를 쉽게 찾고 장치를 사용할 수 있거나 제거할 때 알림을 받고 다양한 장치 속성을 확인할 수 있습니다. 또한 다양한 파일 시스템에 대한 지원을 포함하여 설치를 처리합니다.
(2)의 경우 가능하면 쓰기 사이에 장치를 마운트 해제합니다. 그렇지 않은 경우 마운트 sync
및/또는 dirsync
모드를 사용하면 도움이 됩니다. 이렇게 하면 쓰기 간에 파일 시스템을 일관된 상태로 유지해야 합니다. 또한 사전 할당된 공간에 쓰는 경우 일반적으로 파일 시스템 메타데이터 변경 사항이 전혀(또는 최소한 mtime만) 발생합니다. (로그를 생성할 때 10MB의 0을 쓴 다음 처음으로 돌아가서 데이터를 스트리밍하세요. 10MB에 도달하면 다른 로그를 생성하세요. 드물게 생성되는 작업만 실제로 파일 시스템 손상 위험에 직면하게 됩니다.)
그러나 Julie Pelletier가 지적했듯이 일종의 플라이아웃 버튼이 더 좋을 것입니다.
또한 참고로 외부 애플리케이션이 해당 데이터를 파이프에 쓰도록 할 수 있는 경우(생성된 명명된 파이프 사용 포함 mkfifo
) 코드는 파이프에서 데이터를 읽고 USB에 대한 실제 쓰기를 처리할 수 있습니다. tmpfs의 임시 파일에 쓰는 외부 응용 프로그램이 있는 경우에도 마찬가지입니다.