어떻게 윈도우 장치 이름에 리눅스 장치 경로를 일치시킬 수 있습니까?


3

일부 단계에서 Linux 환경에서 하위 수준의 디스크 작업을 수행하는 응용 프로그램을 작성하고 있습니다. 이 앱은 실제로 2 부분으로 구성됩니다. 하나는 Windows에서 실행되고 다른 하나는 사용자와 상호 작용하며 다른 부분은 LiveCD에서 실행되는 Linux 부분입니다. 사용자는 Windows 드라이브 문자를 선택하고 Linux 부분은 해당 파티션으로 작업을 수행합니다. 문제는 Windows 드라이브 문자 (C :)와 Linux 장치 이름 (예 :/dev/sda1) 사이의 일치를 찾는 것입니다.

  • 저장소 분할 정보 (예 : 드라이브 문자, 블록 번호, 일련 번호 드라이브) Windows의 일부 미리 정의 된 장소 (즉 루트 : 이것은 내가 추악한 속도 내 현재의 솔루션입니다 시스템 파티션).

  • /proc/partitions에서 파티션 목록을 읽습니다. SCSI 또는 IDE 하드 드라이브의 주요 번호가있는 파티션과 전체 디스크가 아닌 실제 파티션을 식별하는 부 번호 만 가져옵니다.

  • 각각을 ntfs 또는 vfat 파일 시스템으로 마운트하십시오. 마운트 된 파티션에 Windows 응용 프로그램에 저장된 정보가 포함되어 있는지 확인하십시오.

  • Windows 응용 프로그램에서 작성한 필수 정보를 찾으면 실제 일치 항목을 찾습니다./proc/partitions에있는 각 파티션이 HDIO_GET_IDENTITY 시스템 콜을 통한 드라이브 일련 번호,/proc/파티션에서의 블록 수 및 드라이브 오프셋 (/ sys/blocks/drive_path/partition_name/start)을 얻는 경우이를 Windows와 비교하십시오 정보 및 이것이 일치하면 - 리눅스 장치 이름과 함께 Windows 드라이브 문자를 저장하십시오.

는이 계획에 몇 가지 문제가 있습니다

  • 이 못생긴입니다. Windows에서 데이터를 작성한 다음 Linux에서이 데이터를 읽으면 악몽을 테스트 할 수 있습니다.

  • 리눅스 장치의 주요 번호는 IDE 또는 SCSI 장치와 만 비교됩니다. 이는 USB 또는 FireWire 디스크에서 실패 할 수 있습니다. 이러한 종류의 디스크를 추가 할 수는 있지만 가능한 장치의 알려진 하위 집합으로 만 응용 프로그램을 제한하는 것은 다소 잘못된 생각입니다.

  • HDIO_GET_IDENTITY는 IDE 및 SATA 드라이브에서만 작동합니다.

  • /sys/block hack이 (가) IDE 또는 SATA 드라이브 이외에서 작동하지 않을 수 있습니다.

이 스키마를 개선하는 방법에 대한 아이디어가 있으십니까? 아마도 Windows 응용 프로그램의 모든 데이터를 쓰지 않고 Windows 이름을 결정하는 또 다른 방법이 있을까요?

P. 응용 프로그램의 언어는 C++입니다. 나는 이것을 바꿀 수 없다.

1

파티션에 연결된 UUID가 있습니다. 나는 Windows에서 다음을 찾는 방법을 모르지만 리눅스에서 당신은 각 파티션의 UUID 찾을 수 있습니다

sudo는 vol_id -u 장치 (예는/dev/sda1과)

하는 경우가 는 Windows의 equivilent 함수로, 사용자가 선택한 파티션의 UUID를 저장 한 다음 Linux의 모든 알려진 파티션을 반복하고 UUID를 일치시킬 수 있습니다.

편집 : 이것은 리눅스 전용 일이 될 수 있으며, 그 뭔가에서 이러한 생성 util을가 speficially (대신 드라이브에 대한 메타 데이터를 읽는)를 volid 수 있습니다. 말하자면, 당신이 volid를위한 소스를 얻고 그것이 무엇을하는지 체크하는 것을 멈추게하는 것은 아무것도 없습니다.


2

파티션은 그와 관련된 UUID를 가지고

이 내 지식은 매우 얕은입니다,하지만 난 그게 old-보다는, GPT (GUID 파티션 테이블) 파티션을 포맷 된 디스크 만 사실 생각 세계의 99 %가 여전히 고집하는 스타일의 MBR 포맷?


1

이 내 지식, 매우 얕은하지만 난 그 단지의 어느 99 % GPT (GUID 파티션 테이블) 파티션으로 이전 스타일의 MBR 형식보다는 포맷 디스크에 대한 사실 생각 세상은 여전히 ​​붙어 있습니까?

리눅스 사용자 진부한 소리는 아니지만 나를 위해 일합니다. NTFS 파티션과 함께 사용하고 아무런 문제가 없습니다. 내가 편집 할 때 말했듯이, vol_id는 그 자체를 생성 할 수 있습니다. 이 경우 특정 파티션 형식에 의존하지 않아도됩니다.


0

어떤 식 으로든 드라이브를 표시하거나 (예 : 파일 쓰기) 특정 드라이브에만 관련된 식별자를 찾아야합니다.

Windows를 실제로 실행하지 않고 Windows가 특정 드라이브 파티션에 어떤 문자를 할당할지 파악하는 것은 거의 어렵습니다. Windows는 항상 실행되는 드라이브를 C :와 연관시키기 때문입니다. 두 개 이상의 운영 체제가 설치된 경우 어떤 드라이브가 될 수 있습니다. 또한 Windows는 특정 파티션에 대해 먼저 시도 할 드라이브 문자를 선택할 수있게하여 추가 문제를 일으 킵니다.

이 혼합 된 Window/Linux 솔루션을 시도하는 것보다 Linux 내에서 GUI 작업을하는 것이 훨씬 쉽습니다. 나는이 방법으로 시도하지 말라고 말하는 것이 아니며, 내가 말한 것은이 접근법에 많은 함정이 있다는 것입니다. 나는 그들 모두에 대해 알지 못한다고 확신한다.

또 다른 옵션은 실제로 Windows 내부에서 Linux 파트를 수행 할 수 있는지 확인하는 것입니다. 아주 좋은 Windows 프로그래머라면 실제로 원시 파일 시스템에 액세스 할 수 있습니다. 이 모든 작업이 진행되는 동안 Windows가 실행되기 때문에이 접근 방식에는 여러 가지 함정이있을 수 있습니다.

그래서 반복 할 수 있다면 리눅스에서 모든 것을 할 수 있는지 알아볼 것입니다. 장기적으로 볼 때 훨씬 간단합니다.


1

파티션에는 연결된 UUID가 있습니다. 나는 Windows에서 다음을 찾는 방법을 모르지만 리눅스에서 당신은 각 파티션의 UUID 찾을 수 있습니다

sudo는 vol_id -u 장치 (예는/dev/sda1과)

하는 경우가 는 Windows의 equivilent 함수로, 사용자가 선택한 파티션의 UUID를 저장 한 다음 Linux의 모든 알려진 파티션을 반복하고 UUID를 일치시킬 수 있습니다.

그건 좋은 지적입니다. 감사합니다! 필자는 vol_id (udev tarball의 일부) 소스를 살펴 보았습니다. FAT (32) 및 NTFS의 경우 파티션의 미리 정의 된 위치에서 읽은 볼륨 일련 번호를 사용하여 UUUD를 생성합니다. 이후 fat32와 ntfs 이외의 다른 것을 기대하지 않기 때문에이 정보를 파티션 식별자로 사용하는 것을 고려합니다.


0

Windows에서 Linux의 UUID와 일치하는 이음새가있는 "NTFS 볼륨 일련 번호"를 읽을 수 있습니다. XP 이후

  • 명령 행 :

    가능성은 윈도우에서 "직렬 NTFS 볼륨"을 얻을 수 fsutil.exe FSINFO ntfsinfo C : C++

    HANDLE fileHandle = CreateFile(L"\\\\.\\C:", // or use syntax "\\?\Volume{GUID}" 
               GENERIC_READ, 
               FILE_SHARE_READ|FILE_SHARE_WRITE, 
               NULL, 
               OPEN_EXISTING, 
               NULL, 
               NULL); 
    DWORD i; 
    NTFS_VOLUME_DATA_BUFFER ntfsInfo; 
    DeviceIoControl(fileHandle, 
           FSCTL_GET_NTFS_VOLUME_DATA, 
           NULL, 
           0, 
           &ntfsInfo, 
           sizeof(ntfsInfo), 
           &i, 
           NULL)); 
    cout << "UUID is " << std::hex << ntfsInfo.VolumeSerialNumber.HighPart << std::hex << ntfsInfo.VolumeSerialNumber.LowPart << endl; 
    
  • 에서


가능성이 리눅스에서 UUID를 얻을 :

  • LS -l은/dev/디스크 /별로 UUID
  • LS -l은/dev/디스크 /별로 라벨
  • BLKID/dev/sda1