마운트 된 파일 시스템의 / sys / class 또는 / sys / devices 항목을 어떻게 찾을 수 있습니까?


3

내가 가지고있는 것 : 나는 파일 시스템에 microSD 카드가 마운트 된 장소를 안다. /storage/sdcard1

필요한 항목 : 어떤 기기 폴더인지 확인하려면 예 : /sys/class/mmc_host/mmc0 (이것은 /sys/devices/msm_sdcc.1/mmc_host/mmc0 ) 대 /sys/class/mmc_host/mmc1 (이것은 /sys/devices/msm_sdcc.2/mmc_host/mmc1 ).

나는 그와 같은 파일의 내용을 잡을 수 있도록 올바른 디렉토리를 찾아야한다. cid, serial, oemid, 등등.

맞춰 볼 수있을거야. /sys/class/mmc_host/mmc1 에 장착 된 microSD 카드에 해당합니다. /storage/sdcard1하지만 일부 Android 기기의 경우 mmc0.

우리가 안드로이드에 있기 때문에 좀 더 전형적인 리눅스에 비해 몇가지 제약이 있습니다 :

  • 아니 /etc/mtab 또는 /etc/fstab 파일이있다.
  • 아니 hwinfo 또는 hdparm 명령들
  • dmesg 실행되지 않음 (klogctl : 작업이 허용되지 않음)
  • df "마운트 된"열을 출력하지 않습니다.
  • 액세스 할 수 없음 stat() 또는 다른 저수준 호출; 최소한 NDK 개발이 없다면, 다이빙을 할 수있는 심층적 인 수영장이며 아키텍처 관련 빌드가 필요합니다.

여기의 출력은 다음과 같습니다. df microSD 카드 관련 :

Filesystem               Size     Used     Free   Blksize
/storage/sdcard1        29.0G     2.0G    27.0G   32768

(내가 생각하기에 혼란 스럽다. mount 나타냅니다. /storage/sdcard 마운트 포인트 오히려 파일 시스템 ).

그리고 관련 출력 mount:

/dev/block/vold/179:65 /mnt/media_rw/sdcard1 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/fuse /storage/sdcard1 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

위 그림은에 마운트 된 파일 시스템이 /storage/sdcard1 ~이다. /dev/fuse. 그러나 /dev/fuse 3 곳에 설치됩니다.

$ mount | grep fuse                                    
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /storage/emulated/legacy fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /storage/sdcard1 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

어쨌든 나는 아직도 어떤 방법을 알아 내지 못하는지 알 수있다. /sys/class/... 또는 /sys/devices/... 디렉토리에 해당합니다. /storage/sdcard1.

따라서 초기 질문에 대답하는 한 가지 방법은 하위 질문 인 / sys / class 또는 / sys / devices 항목을 어떻게 찾을 수 있습니까? FUSE가 마운트 된 파일 시스템의 경우 ? 적어도이 경우에 대한 질문에 대답해야합니다 (그러나 모든 Android 기기가 동일한 방식으로 microSD 카드를 탑재하는지는 알 수 없습니다).

모든 제안을 부탁드립니다.


3 가지 유용한 답변이 있기 때문에 현상금을 수여 할 답을 선택하는 것은 어려웠지만 아무도 완전한 해결책을 찾지 못했습니다 (아직). 노력과 의견을 보내 주셔서 감사합니다.
LarsH

답변:


4

Dan에 의해 설명 되었 듯이,이 파일 시스템은 FUSE에 의해 제공됩니다. 즉, 사용자 공간에서 구현되고 사용자가 인용 한 마운트 라인은 어떤 사용자 공간 파일 시스템이 사용 중인지를 나타내지 않습니다. 그래서 우리는 그것이 어떤 프로그램이 될 수 있고 임의의 것을 할 수 있다는 것을 압니다. 예 : 그것은 다양한 장치 및 / 또는 네트워크 및 / 또는 프로그래머의 마음을 넘어선 다른 방식의 블록을 결합하여 데이터 블록을 제공 할 수 있습니다.

물론 실제로는 상황에 맞는 지식을 기반으로 데이터가 mmc 장치 중 하나에서 온다고 기대할 수 있습니다. 하지만 그것도 알아낼 힘들 수도 있습니다 그 장치에서 데이터를 가져올 수 있기 때문에 mapper 장치를 통해 (여기에 내가 / 스토리지 / sdcard1 퓨즈를 통해 제공되는 것 같아요 유혹받을 거라고 여기에있는 것 같다 / mnt / media_rw / sdcard1 그 자체는 / dev / block / vold / 179 : 65에서 나온다. 이것은 mmc 장치 중 하나에서 가져온 device-mapper에 정의되어있다. (물론 장치의 조합이 될 수도있다. device-mapper는 RAID-0 / 1을 수행 할 수 있습니다).

그래서 이론 상으로는 어떤 마운트 된 프로세스가 FUSE- 데몬과 관련이 있는지 알아낼 수 있습니다. 그런 다음 / proc /에서이 프로세스를보고 어떤 파일이 열려 있는지 추측 할 수 있습니다 (즉, / mnt / media_rw / sdcard1에 있음을 알면) / proc / mounts를 다시보고 / dev / block / vold / 179 : 65에 있는지 확인하십시오 , 그런 다음 어떻게 든이 논리 볼륨의 구성을 찾습니다 (나는 / sys 또는 / proc에있는 정보를 찾을 수 없지만 어딘가에있을 수 있습니다). 결국 당신이 찾고있는 장치를 찾으십시오.

나는 이론 상으로는 당신의 답을 찾을 수 있다고 보장 할 수있는 프로그램을 작성할 수 없다고 확신합니다. 실제로, 당신은 아마도 충분한 동기, 시간, 추악한 해킹을 감안할 때, 당신의 사용 사례를 위해 작동하는 것을 자갈을 칠할 수 있습니다.

액세스 권한이있는 리소스의 세부 사항에 따라 더 쉬운 해결책은 "전체적으로"수행하는 것일 수 있습니다. 데이터가 장치에서 마운트 지점까지 (그리고 뒤로) 이동하는 경로에주의를 기울이지 마십시오. 대신 해당 마운트 지점의 데이터를보고 다양한 장치의 데이터를보고 상관 관계에 따라 장치를 결정합니다.

예 : 해당 파일 시스템에 512 바이트의 무작위 데이터가 들어있는 파일을 작성한 다음 후보 장치의 블록에서 512 바이트의 정확한 시퀀스를 찾으십시오. 당신이 거기에서 그것을 발견 할 수 있다면, 이것이 당신의 답이라고 내기를 할 수 있습니다. 또는 쓰지 않으려는 경우 : 해당 파일 시스템의 일부 파일의 처음 512 바이트를 가져 와서 장치 블록에서 찾아야합니다. 기기 중 하나에서만 발견되면 답변을 얻을 수 있습니다.


고맙습니다. 도움이됩니다. 장치에 쓸 수있는 것에 의존 할 수는 없지만 파일을 읽는 것이 좋습니다. 후보 장치의 블록에서 데이터를 어떻게 찾을 수 있습니까? 예 : 기기가에있는 경우 /sys/class/mmc_host/mmc1 ( /mmc1:1234 ), 어디에서 데이터를 찾습니까? 그리고 SD 카드에있는 모든 기가 바이트의 데이터를 조사해야합니까?
LarsH

1
나는 너 같은 것을보아야 할 것 같아. /proc/emmc 이 장치에 대해 존재하는 파티션을 찾은 다음 / dev /에서 해당 장치 노드를 찾습니다. /dev/[block/]mmcblk1p2 ), 그런 다음 장치 노드에서 읽습니다 (아마도 루트 액세스가 필요합니다). 그리고 네, 그 카드에있는 기가 바이트의 데이터를 조사해야합니다. 장치의 크기를 파일 시스템의 크기와 비교하면 대부분의 후보 장치 노드를 제거 할 수 있습니다.
Stefan

안타깝게도 Android (적어도이 휴대 전화에있는 버전)에는 /proc/emmc. 필자는 장치의 크기를 파일 시스템의 크기와 비교한다는 생각을 좋아합니다. 기가 바이트의 데이터는 너무 느릴 것입니다.
LarsH

2

그만큼 /sys 디렉토리 (AKA 리눅스 커널 sysfs )는 커널 객체에만 적용됩니다.

그만큼 /storage/sdcard1 언급하신 기기는 아니 커널 드라이버로 직접 마운트되었으므로 사용자 공간에 마운트되고 퓨즈 .

FUSE 마운트 지점을 특정 위치로 맵핑 /sys 장치 (있는 경우 FUSE 마운트 된 파일 시스템에는 기본 커널 장치가 없을 수도 있음)는 대개 추론을 제외하고는 일반 탑재 정보에서 확인할 수 없습니다 (예 : 특정 유형의 장치 만 마운트하는 경우).

그것 FUSE에서 매핑 정보를 얻을 수 있어야하지만, 나는 단서가 없습니다.


응답 해 주셔서 감사합니다. 그만큼 cid, serial, 등등은 아래에서 사용할 수 있습니다. /sys (예 : /sys/class/mmc_host/mmc0 ). 어쩌면 당신은 /storage/sdcard1/sys/class/mmc_host/mmc0 아래에서 사용할 수 없습니다. /sys? 퓨즈 아래에 마운트 된 장치에 대한 마운트 매핑 정보를 어디에서 찾을 수 있는지 알고 있습니까?
LarsH

1
네, 그게 내가 의미했던 것입니다. 나는 대답을 업데이트했다.
Dan Cornilescu

1

코멘트가 되기에는 너무 긴 스크래치 :

  1. 동일한 장치를 두 개 이상의 장소에 마운트하는 것은 드문 일이 아닙니다 (어쩌면 다른 읽기 / 쓰기 권한이있는 경우 일 수 있습니다 ...). 에이 mount | grep fuse | grep -v emulated 예제에서 에뮬레이트 된 마운트 지점 중에서 선택하는 것이 도움이 될 것입니다.

  2. 안드로이드 4.2.2 및 이전 버전에서 실제로 존재합니다 vold.fstab, 대신에 작업을 수행하는 도움말 스크립트 /etc/fstab (전에 vold.conf [ 1 ]). 아마 당신은 그 스크립트를 구문 분석하고 좋은 출발점을 얻을 수 있습니다. Android 4.2.2 및 이전 버전의 구문은 [ 2 ] :

    dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
    
    • label: 볼륨의 레이블.
    • mount_point: 볼륨을 마운트해야하는 파일 시스템 경로.
    • partition: 파티션 번호 (1부터 시작) 또는 첫 번째 사용 가능한 파티션의 경우 'auto'.
    • sysfs_path: 이 마운트 지점을 제공 할 수있는 장치에 대한 하나 이상의 sysfs 경로 공백으로 구분하고 각 공백으로 시작해야합니다. /.
    • flags: 쉼표로 구분 된 선택적 플래그 목록이며 포함 할 수 없습니다. /.   가능한 값은 다음과 같습니다. nonremovableencryptable.
  3. Android 출시 4.3 및 이후 버전

    init, vold 및 recovery가 사용하는 다양한 fstab 파일이 /fstab.<device> file.

    그래서 장치 이름을 알고 있어야합니다. 강조 표시된 파일 이름에 .

    다시 그것은보고된다 [ 2 ]에 의해 관리되는 외부 저장 장치 볼륨의 경우 vold, 다음 형식을 찾아야합니다.

    <src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
    

    어디에

    • src: 아래 경로 sysfs (일반적으로 /sys )를 마운트 지점을 제공 할 수있는 디바이스에 보냅니다. 경로는 다음으로 시작해야합니다. /.
    • mount_point: 볼륨을 마운트해야하는 파일 시스템 경로.
    • type: 볼륨의 파일 시스템 유형입니다. 외부 카드의 경우 일반적으로 vfat.
    • mnt_flags: Vold는이 필드를 무시하고 기본값으로 설정해야합니다.
    • fs_mgr_flags: Vold는 통합 된 모든 행을 무시합니다. fstab 그 (것)들을 포함하지 않는 voldmanaged= 이 필드의 플래그. 이 플래그 다음에는 카드를 설명하는 레이블과 파티션 번호 또는 auto라는 단어가 와야합니다. 다음은 그 예입니다. voldmanaged=sdcard:auto. 가능한 다른 플래그는 다음과 같습니다. nonremovable, encryptable=sdcard, noemulatedsd, 및 encryptable=userdata.

참고 문헌

  1. 질문들 vold.conf 및 vold.fstab에 대한 정보 .
  2. Android 코드 장치 구성 페이지.

이 유용한 정보를 제공해 주셔서 감사합니다. /fstab.qcom 내 Android 5.1.1 기기에 있지만 루트 사용자 만 읽을 수 있습니다.
LarsH

천만에요. 또한 Android 5.x에는 파일이 있습니다. storage_list.xml , 그때 그들은 6.0에서 뭔가를 제거합니다 ... 읽기 이리 ...
Hastur

나는에 대한 언급을 보았다. storage_list.xml,하지만 5.1.1에서는 이러한 파일을 찾을 수 없습니다. 참조한 문서는 디렉토리가 어디에 있는지를 말하지 않습니다. 어디에서 찾을 수 있습니까?
LarsH

솔직히 말해서 :) 그것은 장치 아래에있는 것 같습니다. 여기에 의견을 읽으십시오. .
Hastur

나는 모든 카운트를 치고있다. 최상위 수준이 없습니다. /device 폴더. 몇 가지 예가 있습니다. /sys/block/mmcblk0/device, 하지만 storage_list.xml 그곳에. 거기에 /vendor/overlay,하지만 그것은 포함되지 않습니다 storage_list.xml. 아니 frameworks 어느 한 쪽.
LarsH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.