[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Dudas con hardlinks y el espacio que ocupan en disco



On 24/05/13 23:15, fernando sainz wrote:
El día 24 de mayo de 2013 23:07, jors<worbynet@gmail.com>  escribió:
On 24/05/13 23:03, fernando sainz wrote:

El día 24 de mayo de 2013 22:36, jors<worbynet@gmail.com>   escribió:

On 24/05/13 22:24, fernando sainz wrote:


Hola:
Creo que se me ha escapado una respuesta vacía, un desliz del ratón en
gmail...

El día 24 de mayo de 2013 22:04, jors<worbynet@gmail.com>    escribió:


Buenas lista,

Me estoy volviendo un poco tarumba con el tema de los hardlinks y
cuánto
ocupan, a ver si alguien puede arrojarme un poco de luz al tema.

La teoría dice que un hardlink no es más que una referencia a un inodo
de
un
fichero existente. Y por tanto entiendo que sólo debería ocupar el
espacio
necesario para guardar esa referencia.


Y creo que entiendes bien.
Lo que pasa es que para el sistema operativo tanto el fichero como el
hard link son la misma cosa, un fichero.
De hecho el fichero se borra cuando borras el último hard link que
exista para ese fichero.


Pues bien, para calcular el espacio ocupado en disco por lo visto uno
no
se
puede fiar de "ls" porque toma el mismo espacio para los hardlinks que
para
los ficheros que éstos referencian:

user@host:~$ mkdir test
user@host:~$ cd test
user@host:~/test$ mkdir test1 test2
user@host:~/test$ dd if=/dev/zero of=test1/test.dd count=1 bs=1M
user@host:~/test$ ls -lh test1/
total 1,0M
-rw-r--r-- 1 user user 1,0M may 24 21:09 test.dd
user@host:~/test$ ln test1/test.dd test1/test.ddhl1
user@host:~/test$ ls -lh test1/
total 2,0M
-rw-r--r-- 2 user user 1,0M may 24 21:09 test.dd
-rw-r--r-- 2 user user 1,0M may 24 21:09 test.ddhl1

Eso lo tengo asumido. En cambio, el comando "du" de serie parece algo
más
listo porque sabe qué es y qué no un hardlink y a no ser que le
indiques
la
opción -l, no cuenta en espacio ocupado por los hardlinks:

user@host:~/test$ du test1/
1028    test1/
user@host:~/test$ du test1/*
1024    test1/test.dd
user@host:~/test$ du -l test1/*
1024    test1/test.dd
1024    test1/test.ddhl1

Pero ahora creemos sólo 2 hardlinks en el segundo directorio:

user@host:~/test$ ln test1/test.dd test2/test.ddhl2
user@host:~/test$ ln test1/test.dd test2/test.ddhl3
user@host:~/test$ du test2/
1028    test2/
user@host:~/test$ du -hs test1/*
1,0M    test1/test.dd
user@host:~/test$ du -hs test2/*
1,0M    test2/test.ddhl2

¿Qué sucedió en el último paso? Du contó el espacio ocupado por un
hardlink
a pesar de no haberle indicado que los tenga en cuenta para el recuento
de
espacio :(

Todo este rollo viene porque tengo un directorio lleno sólo de
hardlinks
(comprobado con "stat" archivo a archivo) que según "du" ocupa 5.8GB y
la
verdad es que no lo entiendo:


Bueno, no se como funciona du, pero ten en cuenta que si borras los
ficheros, como te digo estos siguen existiendo bajo el hardlink, con
lo cual realmente ocupan ese espacio. Tal vez du cuando encuentra dos
entradas en un directorio que apuntan al mismo sitio es capaz de
descontar una.



Sí y no.

En realidad sólo se ocupa el espacio en disco de ese fichero una vez, y
sus
hardlinks al mismo sólo son referencias al mismo inodo. Por tanto, en
términos de espacio la referencia debe ocupar muy muy poquito (del orden
de
pocos kb's, a lo sumo).

Yo pensaba que "du" era constante en ese aspecto: es decir, que a no ser
que
le indicaras explícitamente que quieres que te cuente el espacio de los
hardlinks como si fueran un fichero más (y no una referencia a uno ya
existente), los saltaba. Y veo que no es siempre así.

Salut,
jors



Es complicado, pero entiendo que cuando se crea un fichero se crea una
entrada con el nombre del fichero y cuando se crea un hardlink se crea
otra entrada igual y se incrementa un contador que mantiene el numero
de entradas que hay sobre un fichero y cuando llega a cero se borra.
Por tanto todas las entradas (hardlinks) son el fichero y si haces un
du sobre una parte de la estructura de directorios te lo cuenta. Solo
en el caso de que se encuentre mas de una vez un enlace lo ignora.
Entiendo que el fichero no pertenece al primer hardlink que se crea al
crearlo sino a todos por igual, no hay diferencia entre el fichero
original y el hardlink salvo el nombre...

NO se si me explico muy bien :-)


Sí, perfectamente! Coincido contigo -no se si realmente será así- en que no
hay diferencia entre fichero original y posteriores hardlinks.

El tema es si existe alguna utilidad/aplicación/modo que me pueda ayudar a
calcular el tamaño de una estructura de directorios SIN tener en cuenta los
hardlinks... pero al mismo tiempo, sí que tengo que contar uno de ellos
porque sería el correspondiente al tamaño del archivo "original" xD


Salut,
jors


No lo sé, entiendo que cuando hagas un du de una estructura de
directorios, tal vez este sea capaz de eliminar el espacio de los hard
links que encuentre debajo, pero si lo haces por partes te saldrá
repetido.

Pues efectivamente tiene pinta de ser como dices: si pones el "path entero" (dónde se encuentran todos los hardlinks a un fichero) sólo tendrá en cuenta uno. Es una buena pista, gracias.

Mira a ver si la wikipedia te aclara algo.
http://en.wikipedia.org/wiki/Hard_link

Lo hice por encima. No creo que me cuente nada nuevo, pero volveré a echarle un vistazo. Gracias de nuevo.

Salut,
jors


Reply to: