Dada una ruta a un archivo o directorio, ¿cómo puedo determinar el punto de montaje para ese archivo? Por ejemplo, si /tmp
está montado como un sistema de archivos tmpfs
y dado el nombre de archivo /tmp/foo/bar
, quiero saber que está almacenado en tmpfs
con raíz en /tmp
.¿Dónde se monta un archivo?
Esto estará en C++ y me gustaría evitar invocar comandos externos a través de system()
. El código debe ser robusto, no necesariamente en contra de la manipulación deliberada, pero definitivamente frente a los puntos de montaje anidados, enlaces simbólicos, etc.
No he podido encontrar una llamada al sistema simple para hacer esto. Parece que tendré que escribir el cheque yo mismo. Aquí hay un bosquejo de lo que estoy planeando.
- Canonicalize el nombre del archivo a la
readlink
comando de shell. ¿Cómo? - Lea
/etc/mtab
congetmntent()
& co. - Determine la entrada de montaje correspondiente para el archivo. ¿Cómo?
Para # 1 es que hay una simple llamada de sistema o tengo que leer cada componente directorio de la ruta y resolverlos con readlink(2)
si son los links? Y manejar yo mismo .
y ..
? Parece un dolor.
Para # 3 Tengo varias ideas sobre cómo hacer esto. No estoy seguro de cuál es el mejor.
open()
el archivo, su padre, padre de su padre, etc. usandoopenat(fd, "..")
hasta llegar a una de las entradas/etc/mtab
. (¿Cómo sé cuándo?fstat()
y comparo los números de inodo?)- Busque el nombre de directorio más largo en la tabla de montaje que es una subcadena de mi nombre de archivo.
Me estoy inclinando por la primera opción, pero antes de codificarla, quiero asegurarme de que no estoy pasando por alto nada, ¡idealmente una función incorporada que ya lo haga!
¿Por qué votar para cerrar esto? Es una buena pregunta. –
Quien haya votado para cerrarlo probablemente solo haya leído el título y/o las dos primeras líneas. Esta es claramente una pregunta apropiada (e interesante). –
Vea también [Versión de Python] (http://stackoverflow.com/questions/4260116/find-size-and-free-space-of-the-filesystem-containing-a-given-file) y un [comando de shell] (http://stackoverflow.com/questions/3274354/how-to-find-out-mount-partition-a-directory-or-file-is-on-linux-server). –