¿Cómo hacer coincidir la ruta del dispositivo Linux con el nombre de la unidad de Windows?

StackOverflow https://stackoverflow.com/questions/18959

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una aplicación que en algún momento realiza operaciones de disco de bajo nivel en un entorno Linux.La aplicación en realidad consta de 2 partes, una se ejecuta en Windows e interactúa con un usuario y otra es una parte de Linux que se ejecuta desde un LiveCD.El usuario elige las letras de las unidades de Windows y luego una parte de Linux realiza acciones con las particiones correspondientes.El problema es encontrar una coincidencia entre la letra de una unidad de Windows (como C:) y el nombre de un dispositivo Linux (como /dev/sda1).Esta es mi solución actual que califico como fea:

  • almacenar información de particiones (es decir,letra de unidad, número de bloques, número de serie de la unidad, etc.) en Windows en algún lugar predefinido (es decir,la raíz de la partición del sistema).

  • lea una lista de particiones de /proc/partitions.Obtenga sólo aquellas particiones que tengan un número mayor para discos duros SCSI o IDE y un número menor que las identifique como particiones reales y no como discos completos.

  • Intente montar cada uno de ellos con sistemas de archivos ntfs o vfat.Compruebe si la partición montada contiene la información almacenada por la aplicación de Windows.

  • Al encontrar la información requerida escrita por la aplicación de Windows, realice la coincidencia real.Para cada partición encontrada en /proc/partitions, adquiera el número de serie de la unidad (a través de la llamada al sistema HDIO_GET_IDENTITY), el número de bloques (de /proc/partitions) y el desplazamiento de la unidad (/sys/blocks/drive_path/partition_name/start), compárelo con Windows información y, si coincide, almacene una letra de unidad de Windows junto con el nombre de un dispositivo Linux.

Hay un par de problemas en este esquema:

  • Esto es feo.Escribir datos en Windows y luego leerlos en Linux hace que las pruebas sean una pesadilla.

  • El número principal de dispositivos Linux se compara sólo con dispositivos IDE o SCSI.Esto probablemente fallaría, es deciren discos USB o FireWire.Es posible agregar este tipo de discos, pero limitar la aplicación solo a un subconjunto conocido de posibles dispositivos parece ser una mala idea.

  • Parece que HDIO_GET_IDENTITY solo funciona en unidades IDE y SATA.

  • Es posible que /sys/block hack no funcione en unidades que no sean IDE o SATA.

¿Alguna idea sobre cómo mejorar este esquema?¿Quizás haya otra forma de determinar los nombres de Windows sin escribir todos los datos en la aplicación de Windows?

PDEl lenguaje de la aplicación es C++.No puedo cambiar esto.

¿Fue útil?

Solución

Las particiones tienen UUID asociados.No sé cómo encontrarlos en Windows, pero en Linux puedes encontrar el UUID para cada partición con:

sudo vol_id -u dispositivo (p. ej./dev/sda1)

Si hay una función equivalente en Windows, simplemente puede almacenar los UUID para cualquier partición que elijan y luego recorrer todas las particiones conocidas en Linux y hacer coincidir los UUID.

Editar: Esto puede ser algo exclusivo de Linux, y puede ser específicamente la utilidad volid que los genera a partir de algo (en lugar de leer metadatos para la unidad).Dicho esto, no hay nada que le impida obtener la fuente de volid y comprobar lo que hace.

Otros consejos

Las particiones tienen UUID asociados

Mi conocimiento de esto es muy superficial, pero pensé que eso solo era cierto para los discos formateados con particiones GPT (Tabla de particiones Guid), en lugar del antiguo formato MBR con el que el 99% del mundo todavía está atrapado.

Mi conocimiento de esto es muy superficial, pero pensé que eso solo era cierto para los discos formateados con particiones GPT (Tabla de división GUID), en lugar del formato MBR de estilo antiguo con el que el 99% del mundo todavía está atascado?

No suena como un cliché de usuario de Linux, pero funciona para mí.Lo uso con particiones NTFS y no he tenido problemas.Como dije en mi edición, es posible que vol_id los esté generando él mismo.Si ese fuera el caso, no se dependería de ningún formato de partición en particular, lo cual sería genial.

Las particiones tienen UUID asociados.No sé cómo encontrarlos en Windows, pero en Linux puedes encontrar el UUID para cada partición con:

sudo vol_id -u dispositivo (p. ej./dev/sda1)

Si hay una función equivalente en Windows, simplemente puede almacenar los UUID para cualquier partición que elijan y luego recorrer todas las particiones conocidas en Linux y hacer coincidir los UUID.

Ese es un buen punto, ¡gracias!Miré las fuentes de vol_id (una parte del tarball de udev) y parece que para FAT(32) y NTFS genera UUUD utilizando el número de serie del volumen que se lee desde la ubicación predefinida en la partición.Como no espero nada más que fat32 y ntfs, considero utilizar esta información como identificador de partición.

Debe marcar la unidad de alguna manera (p. ej.escribir un archivo, etc.), o buscar algún identificador que sólo esté asociado con esa unidad en particular.

Es muy difícil, casi imposible, determinar qué letra asignaría Windows a una partición de unidad en particular, sin ejecutar Windows.Esto se debe a que Windows siempre asocia la unidad desde la que se ejecuta con C:.Que podría ser cualquier unidad, si tiene más de un sistema operativo instalado.Windows también le permite elegir qué letra de unidad probará primero, para una partición específica, lo que causará más problemas.

Sería mucho más fácil hacer las cosas de la GUI dentro de Linux que probar esta solución mixta de Windows/Linux.No estoy diciendo que no lo intentes de esta manera, lo que estoy diciendo es que hay muchos posibles errores con este enfoque.Estoy seguro de que ni siquiera los conozco a todos.

Otra opción sería ver si realmente puedes hacer la parte de Linux, dentro de Windows.Si eres un muy buen programador de Windows, puedes obtener acceso al sistema de archivos sin formato.Probablemente haya muchos obstáculos con este enfoque, porque Windows se ejecutará mientras todo esto esté en funcionamiento.

Entonces, para reiterar, vería si se pudiera hacer todo desde Linux, si es posible.Es simplemente mucho más sencillo a largo plazo.

En Windows puede leer el "Número de serie del volumen NTFS", que parece coincidir con el UUID en Linux.

Posibilidades de obtener el "Serie de volumen NTFS" de ventanas:

  • línea de comando desde XP: fsutil.exe fsinfo ntfsinfo C:

  • bajo 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;
    

Posibilidades de obtener el UUID bajo linux:

  • ls -l /dev/disco/por-uuid
  • ls -l /dev/disco/por-etiqueta
  • blkid /dev/sda1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top