저는 현재 기본 파일 시스템 추상화(C++로 작성)를 작성 중이며 Linux에 "유용한" 마운트 장치 목록을 가져와야 합니다.
getmntent
getmntent_r
쉽게 구문 분석할 수 있는 기능을 찾았 /etc/mtab
지만 /proc/mounts
설치된 많은 장치는 "유용하지" 않습니다(예: /sys/fs/cgroup/net_cls
). 특히 물리적 장치, 파티션 또는 네트워크 공유/드라이브와 관련된 설치를 찾으려고 합니다.
내가 찾은 가장 가까운 방법은 mnt_fsname
(장치 이름)이 로 시작하는지 확인하는 것인데 /
, 내 시스템에서는 다음과 같이 범위가 좁혀졌습니다.
/
/boot
/run/media/[username]/0CA8-1F2D
/run/media/[username]/14E0-3E80
이것이 제가 원하는 것 같습니다(마지막 두 개는 USB 스틱의 파티션입니다). 하지만 이를 사용하여 네트워크 공유/장치를 시험해 볼 기회가 없었습니다.
기본적으로 이는 Windows와 같은 "드라이브"에 근접한 것으로 간주되므로 물리적 장치 등에 관심이 있지만 이는 도서관 사용자가 필요한 경우 목록에 없는 장치로 이동하는 것을 막지는 못합니다.
따라서 기본적으로 질문은 다음과 같이 요약됩니다.
마운트 항목의 장치 이름이 a로 시작하는 경우
/
물리적 장치, 파티션 또는 네트워크 공유가 보장됩니까?특별히 중요하거나 유용한 내용이 누락되었나요?
이 작업을 수행하는 더 나은/더 정확한 방법이 있습니까?
답변1
나는 "유용한 마운트"라는 개념이 모든 상황에서 의미가 있다고 생각하지 않습니다. 이동식 물리적 드라이브 및 네트워크 마운트를 포함하고 , 및 아래의 파일 시스템과 같은 파일 시스템을 시스템 액세스에서 제외 /dev
하려고 /proc
합니다 /sys
. 사용자 마운트 파일 시스템은 어떻습니까? FUSE에서 파일 시스템을 제공한다는 사실을 알더라도 그것이 무엇인지는 알 수 없습니다. 아카이브, 네트워크 마운트, 디렉토리의 대체 보기, 디스크 이미지, 일부 프로그램을 제어하는 방법 등이 될 수 있습니다.
장치 이름이 다음으로 시작하는지 확인하는 것이 /
나에게는 유용하지 않은 것 같습니다. 예를 들어, 번들 설치는 포함되고 네트워크 설치는 제외됩니다.
나는 당신이 할 수 있는 가장 좋은 일은 바퀴를 재발명하지 않는 것이라고 생각합니다. 다른 것이 없다면, 다른 사람들과 동일한 메커니즘을 사용함으로써 사용자를 혼란스럽게 하지 않을 것입니다("왜 X는 이 파일 시스템을 나열하지만 Y는 나열하지 않습니까???"). 게다가, 다른 사람들이 하고 있는 일이 의미가 있을 가능성도 있습니다.
그래서 내 제안은 적어도 GTK+인 Gnome 라이브러리를 사용하는 것입니다. GTK+에는파일 열기 대화상자"장소" 아래에 마운트된 일부 파일 시스템이 표시됩니다. 사용자는 다음을 수행할 수 있습니다.거기에 나열된 내용을 제어하세요어느 정도- 그들이 알아낼 수 있다면, 그건. GTK+에서 파일 열기 대화상자를 표시하지 않더라도 동일한 "위치" 목록을 사용할 수 있습니다(해당 목록을 얻는 방법은 모르겠습니다. API 문서를 확인하세요).
답변2
"유용함"은 관점의 문제이지만 어쨌든 내 생각은 다음과 같습니다.
const getMount = (mountId, _parentID, _deviceNo, root, mountPoint, mountOptions, _fields, _mountSource, superOptions, blob) => (
{
mountId,
// parentID,
// deviceNo,
root,
mountPoint,
mountOptions: mountOptions.split(','),
// fields,
// mountSource,
superOptions: superOptions.split(','),
blob
})
const mounts = fs.readFileSync('/proc/self/mountinfo', 'utf-8')
mounts.split(/\n/)
.filter(l => l.length > 0) // filter empty line at end
.map((m) => getMount(...m.split(' ')))
.filter((m) =>
!/^\/(snap|run|sys|proc|dev)($|\/)/.test(m.mountPoint) &&
!['mqueue', 'tmpfs'].includes(m.superOptions) &&
!m.superOptions.includes('mqueue') &&
!m.superOptions.includes('tmpfs') &&
!m.mountOptions.includes('ro')
)
.map((l) =>
console.log(l))
(필요한 것은 일반적으로 파일을 삭제할 수 있는 장치이므로 휴지통 경로와 관련된 것이 중요합니다(이를 계산하는 방법은 또 다른 이야기입니다))