Linux LPI1 – Apuntes III
Vamos a hablar de inodos.
“The relationship between files as expressed in the file system directory files and the data on disk is a construct called an inode. An inode, or index node, represents the ability to associate a file with blocks on the disk. Only one inode is assigned to a file a its creation.”
En un sistema Linux/Unix cada fichero, cada directorio, tiene su inodo. Cada fichero o directorio se identifica por su número de inodo. Los inodos son punteros al disco llamados disk blocks(bloques de disco). Los disk blocks son agrupados en conjuntos de ocho, cada grupo es llamado block group. Cada inodo es por defecto asociado con un disk block que está al comienzo de su block group y ese block group está inicialmente reservado sólo para ese archivo o directorio. Esto da la capacidad a este espacio de crecer sin fragmentarse.
El número identificador de inodo es único dentro del sistema de ficheros. Un inodo contiene la siguiente información:
- Número de inodo
- Tipo de fichero
- Propietario de dicho fichero
- Permisos del fichero
- Fecha de creación del mismo
Toda esta información la vemos cuando ejecutamos
# ls -l
Otro comando que nos informa sobre todo lo referente al inodo de un determinado fichero o directorio, es el comando stat
# stat /etc/
File: «/etc/»
Size: 12288 Blocks: 32 IO Block: 4096 directorio
Device: 803h/2051d Inode: 3401217 Links: 103
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-12-08 10:35:50.000000000 +0100
Modify: 2007-12-08 10:43:35.000000000 +0100
Change: 2007-12-08 10:43:35.000000000 +0100
La tabla de inodos se crea en el arranque del sistema y también saber que el comando find utiliza esta tabla para realizar sus búsquedas. Tenemos un límite físico de inodos, aplicable a particiones ext2/ext3. No se a que se debe esa limitación física, pero quizá tiene que ver con las limitaciones intrínsecas de los propios discos duros(confirmaré posteriormente esta duda). Algo interesante a comentar es que, un determinado usuario podría llegar a “agotar” el espacio físico de la tabla de inodos, creando miles de ficheros vacíos. Al no contener nada, el usuario no agotaría una posible cuota de disco, pero quebraría al sistema porque la tabla de inodos estaría completa.
Al hacer un
#ls /home/usuario
¿Qué ocurre?El ls es un comando que el shell interpreta y ejecuta, de manera estándar, hasta 7 accesos a disco. De manera transparente al usuario, el sistema está comprobando la tabla de inodos, para averiguar donde y que hay en esa dirección que apuntamos en el comando. Vamos a intentar describir el proceso de un “ls /home/usuario” (tengo que repasar esto!):
- 1. Lee del superbloque(BS) y consulta donde está la tabla de i-nodos.
- Lee de la tabla de i-nodos. Es un i-nodo raíz
- El i-nodo raíz apunta a un bloque de disco.
- Este bloque le indica al i-nodo que debe buscar en la tabla de i-nodos
- Entonces busca la información del usuario
- Va a la tabla de i-nodos donde está el i-nodo, /home/usuario
- De la tabla de i-nodos salta al directorio /home/usuario
Otro ejemplo de los inodos, son los conocidos “.” y “..” visibles en todos los directorios del sistema. Ya sabemos que “..” guarda la dirección del directorio contenedor donde nos encontremos en ese momento. Al ejecutar
# cd ..
estamos buscando el inodo “..” del directorio en cuestión, lo que se traduce a la práctica en accesos a disco para buscar la información. Cuando creamos un directorio con mkdir, estamos creando también los . y .. en el árbol de directorios.
Comandos y acciones comúnes
# cp -r -v
Copia recursivamente, ficheros y directorios, y muestra por pantalla la información de lo que está pasando.
# mv -v -f -i
Mueve el directorio o fichero, muestra la información por pantalla, con i pide la autorización del usuario y con f fuerza la acción.
#mkdir -p /home/pepe/documentos/varios
Crea todos los contenedores de una sóla vez.
#rm -r
Borra recursivamente, lo contenido en el directorio y lo que a su vez, contengan otros directorios dentro del mismo.
#touch
Crea un fichero vacío.
Expresión regular
# ls *
Hace un ls de cualquier archivo o directorio con cualquier nombre y extensión(equivalente a ls .*)
? = cualquier carácter.Ej:
# ls a?b
[abc]d = 2 letras. La 1ª o a,b y c y la 2ª sólo d
[a-z]d = 2 letras. 1ª minúscula y 2ª sólo d
[!a-z]d= 2 letras. No minúsculas y la 2ª sólo d
Ejercicio. Copiar /usr a /home. Estando en /home
# cp -r /usr .
Ejercicio. Restaurar copia seguridad
#cp -dprvx / /mnt/backup
d = desreferenciar enlaces simbólicos
p = preserva permisos, fechas(metadatos)
r = recursivo
v = output
x = se salta directorios.
Más comandos
cat, more y less, son comandos similares. Muestran información de manera similar aunque tienen diferencias.
cut. Corta o selecciona información. Ejemplo:
# ps axf | cut -c0-5
Esto mostraría…
PID
2
3
4
5
6
7
8
9
10
11
63
Ejercicio: ¿Cómo “matariamos” todos los procesos de un usuario en concreto, con un sólo comando?
Para saber todos los procesos que pertenecen por credencial a un usuario, ejecutamos
# ps -u usuario
Lo siguiente sería obtener los PIDs de esos procesos pertenecientes a ese usuario. Utilizando el anterior comando comentado,cut, lo podemos obtener de esta manera
# cut -c 1-5
Ahora tenemos los PIDs necesarios y sólo tenemos que pasarlo de alguna manera al comando kill. Recordamos que kill, de manera excepcional, no está conectado a las salidas estándar como la mayoría de comandos. Por lo tanto, la solución sería
# kill -9 $(ps -u usuario | cut -c 1-5)
Otro ejemplo de uso interesante del cut sería el siguiente. Vamos a extraer el nombre de todos los usuarios almacenados en el fichero /etc/passwd usando cut
# cut -d ":" -f 1 /etc/passwd
Con este comando, estamos separando la información por columnas, utilizando el parámetro -d y el valor “:”. Con -f1, estamos obteniendo la primera de esas columnas. Sería como coger de un array[10] el array[0]. Ya que la información en /etc/passwd se separa por “:”.
expand. Convierte espacios tabulados dentro de un fichero en espacios normales, preparados para su salida por la salida estándar. “Convert tabs in each FILE to spaces, writing to standard output”.
fmt. Siglas de simple optimal text formatter. Reformatea el texto adecuándolo a la salida estándar. Homogeniza los espacios o strings vacios.
head. Muestra las primeras líneas de un archivo.
tail. Muestra las últimas lineas de un archivo.
Ejemplo:
# tail -f /var/log/messages
Muestra dinámicamente las últimas entradas en el log messages
Ejercicio: mostrar la fila 7 y 8 de /etc/passwd
#head -8 /etc/passwd | tail -n2
Con head -8 extraemos las 8 primeras filas y con tail -n2, extraemos finalmente las 2 últimas de esas 8 filas. Por tanto, tenemos la fila 8 y 7.
nl. Númera las líneas de un archivo.
od. Información hexadecima, octal. Veámos el output con od:
# [root@localhost ~]# od /etc/passwd
0000000 067562 072157 074072 030072 030072 071072 067557 035164
0000020 071057 067557 035164 061057 067151 061057 071541 005150
paste.
#paste fichero1 fichero 2 > fichero 3.
Envia la informacion de fichero1 y fichero 2 a fichero 3, pero sin ningún orden.
pr. Prepara un fichero para su impresión, formateándolo y paginándolo.
uniq. Reporta u omite lineas repetidas.
sort. Ordena.
Ejemplo:
#sort /etc/passwd
Ordena alfabéticamente el fichero /etc/passwd
du. Disc usage. ” du informa de la cantidad de espacio de disco usada por los ficheros especificados, y por cada directorio en las jerarquías cuyas raíces estén en los ficheros especificados. Aquí, ‘espacio de disco usado’ significa espacio usado por la jerarquía de ficheros por debajo del fichero especificado.”
Ejemplo de du y sort. Ordenamos con orden descendente los directorios y ficheros según su espacio en disco.
# du | sort -nr
Su salida sería algo así:
4760 .
3736 ./.mozilla
3732 ./.mozilla/firefox
3724 ./.mozilla/firefox/dvcizv98.default
424 ./.gnome2
368 ./.gnome2/yelp.d
236 ./.gstreamer-0.10
…
…
split Split trocea la información y la divide en distintas partes. Por ejemplo, si tenemos una ISO de 10 GB podemos dividirla con split en archivos de 3.4 GB y luego volver a unir la información con cat.
1) split archivo.iso
2) cat f1 f2 f3 > archivo.iso
tac. El cat al revés.
tr. Sustituye carácteres. Ejemplo:
#tr a-z A-Z < archivo.txt
Cambiará todos los caracteres a mayúsculas.
wc. Word count. Cuenta líneas, palabras y carácteres.
xargs. Opera sobre los comandos. (Pendiente de completar)
sed. Siglas de Stream Editor. Editor tipo vi que opera sobre la entrada estándar.
sed ‘/root/d’ /etc/passwd
—— – —————
| | |_ argumento
| |_comando
|_ambito
Ejemplos:
# sed '/root/!d' /etc/passwd
Output:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
Busca todo lo que contenga “root”
# sed '/root/d' /etc/passwd
Output:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
….
….
Busca todo lo que NO contenga “root”
# sed 's/root/ruth/g' /etc/passwd
Cambia todos los strings “root” por “ruth”.
# sed 's/root/ruth/' /etc/passwd
Cambia sólo el primer string “root” encontrado.







tengo un problema con mi servidor(CentOS4+Plesk)… tengo los inodos al 99% y el problema es q no sé como puedo liberarlos.
Hola Freddy
no conozco muchas opciones al respecto. Si la tabla de inodos llega al 99%, lo único que podemos hacer es liberar los inodos borrándolos, es decir, eliminándolos lógicamente de la tabla y eso requiere borrar archivos. Formatear. :S
Siendo tu entorno Plesk, yo buscaría consejo directamente en los foros de Plesk o, si tienes licencias, abrir un tiquet de soporte.
Saludos y suerte.