Kitabı oku: «Raspberry Pi® a fondo para desarrolladores», sayfa 8

Yazı tipi:

pi@erpi ~ $ who -r

run-level 5 2016-01-02 03:23

En este caso, el RPi presenta un nivel de ejecución 5. Podemos cambiar el nivel de ejecución escribiendo init seguido del número del nivel. Por ejemplo, podemos reiniciar nuestro RPi escribiendo:

pi@erpi ~ $ sudo init 6

Como vemos, systemd conserva cierta compatibilidad hacia atrás con los niveles de ejecución de SysV y sus números, puesto que los antiguos comandos de SysV funcionan correctamente en systemd. No obstante, utilizar niveles de ejecución en systemd es una práctica considerada obsoleta. En su lugar, systemd utiliza objetivos con identificador (named target units), algunos de los cuales se listan en la tabla 3-2, que muestra las equivalencias con los niveles de ejecución SysV. Para identificar el objetivo con identificador predeterminado en cada momento en el RPi, escribimos:

pi@erpi ~ $ systemctl get-default

graphical.target

Indica que la configuración actual exige que el RPi tenga un monitor para interfaz con ventanas. El comando siguiente le permite observar también la lista de unidades que el objetivo carga:

pi@erpi ~ $ systemctl list-units --type=target

UNIT LOAD ACTIVE SUB DESCRIPTION

basic.target loaded active active Basic System

cryptsetup.target loaded active active Encrypted Volumes

getty.target loaded active active Login Prompts

graphical.target loaded active active Graphical Interface

multi-user.target loaded active active Multi-User System

...

Tabla 3-2: Objetivos systemd junto con los niveles de ejecución de SysV.


Nombres de objetivoSysVDescripción y ejemplo de uso
poweroff.target0Detiene el sistema: estado de apagado para todos los servicios.
rescue.target1,SModo monousuario administrador: para funciones administrativas, por ejemplo comprobar el sistema de archivos.
multi-user.target2-4Modos estándar multiusuario sin monitor para interfaz con ventanas.
graphical.target5Modo estándar multiusuario con monitor para interfaz con ventanas.
reboot.target6Reinicia el sistema: estado de reinicio para todos los servicios.
emergency.targetShell de emergencia solo para la consola principal.

Si utilizamos el RPi como dispositivo de red, sin monitor, mantener activos los servicios de interfaz de ventanas parece un derroche de recursos de CPU y memoria. Podemos pasar a un modo objetivo sin monitor usando la llamada siguiente, donde la interfaz gráfica LXDE dejará de estar presente y la entrada graphical.target desaparecerá de la lista de unidades:

pi@erpi ~ $ sudo systemctl isolate multi-user.target

pi@erpi ~ $ systemctl list-units --type=target | grep graphical

Análogamente, podemos reactivar el modo objetivo con monitor e interfaz gráfica de este modo:

pi@erpi ~ $ sudo systemctl isolate graphical.target

Por último, para configurar el RPi de manera que utilice un nivel de ejecución distinto de forma predeterminada durante el arranque, por ejemplo sin monitor, usaremos:

pi@erpi ~ $ sudo systemctl set-default multi-user.target

Created symlink from /etc/systemd/system/default.target to /lib/systemd/sys

tem/multi-user.target.

pi@erpi ~ $ systemctl get-default

multi-user.target

Tras reiniciar, los servicios de interfaz gráfica con ventanas no arrancarán, y el nivel de ejecución SysV equivalente se mostrará con el número 3.

Gestión de sistemas Linux

En esta sección examinaremos más de cerca el sistema de archivos de Linux, a partir de los comandos y herramientas descritas en el capítulo 2. De este modo adquiriremos un control administrativo completo del RPi.

El superusuario

En los sistemas Linux, la cuenta de administrador del sistema tiene el nivel de acceso con la seguridad más alta para todos los comandos y archivos. Esta cuenta se suele conocer como root o superuser, superusuario. En Raspbian/Debian, esta cuenta tiene el nombre de usuario root, pero suele estar deshabilitada de forma predeterminada. Sin embargo, la podemos habilitar escribiendo sudo passwd root desde un intérprete de comandos en el que haya iniciado sesión la cuenta pi (username: pi, password: raspberry):

pi@erpi ~ $ sudo passwd root

Enter new UNIX password: mySuperSecretPassword

Retype new UNIX password: mySuperSecretPassword

passwd: password updated successfully

NOTA Llamar a la cuenta “root” está relacionado con el hecho de que es la única cuenta de usuario con permiso para alterar el directorio raíz (root) de más alto nivel (/). Para más información diríjase a www.linfo.org/root.htm.

Se recomienda no realizar el manejo cotidiano del sistema Linux desde la cuenta de superusuario. Sin embargo, tampoco debemos olvidar que manejar el RPi no es lo mismo que gestionar un servidor con miles de cuentas de usuario. En muchas aplicaciones, una sola cuenta de superusuario con una contraseña no estándar es más que suficiente. Sin embargo, utilizar una cuenta estándar para los trabajos de desarrollo puede protegernos de errores catastróficos, como eliminar accidentalmente el sistema de archivos. La cuenta de usuario pi en Raspbian ha sido configurada cuidadosamente para simplificar la interacción con el hardware. De este modo, está lista para ser usada para la mayoría de las tareas descritas en este libro. Debemos, no obstante, comprender bien cómo está configurada la cuenta y por qué funciona tan bien.

Bajo muchas distribuciones de Linux, incluida Raspbian, se emplea sudo siempre que se hace necesario realizar una labor con privilegios de administrador. Normalmente, la herramienta nos pide la contraseña del administrador y seguidamente nos permite operar con esos privilegios durante un cierto periodo de tiempo. La cuenta de usuario pi de Raspbian se ha configurado de manera que no necesita que escribamos la contraseña para los privilegios de administrador.

La sección siguiente describe la gestión de cuentas de usuario, pero si creamos una nueva cuenta de usuario y deseamos que pueda usar la herramienta sudo, su nombre se debe añadir al archivo sudoers file, /etc/sudoers, utilizando la herramienta visudo. Para ello, inicie sesión como root y escriba visudo, o bien escriba directamente sudo visudo como pi. Las últimas líneas del archivo /etc/sudoers proporcionan la configuración de la cuenta de usuario pi, lo que explica por qué no hace falta contraseña para que este usuario ejecute la herramienta sudo:

#User privilege specification

Root ALL=(ALL:ALL) ALL

#username hostnames=(users permitted to run commands as) permitted commands

pi ALL=(ALL) NOPASSWD: ALL

En esta configuración, el usuario pi recibe privilegios sobre todos (el primer ALL) los nombres de host para ejecutar comandos como cualquier usuario (el segundo ALL), así como para ejecutar todos los comandos del sistema (el tercer ALL) sin tener que escribir contraseña alguna. La herramienta (sudo) funciona bien, pero puede complicar la redirección de la salida de un comando, lo que veremos claramente más adelante en este capítulo.

Existe otro comando en Linux que nos permite ejecutar un intérprete de comandos con un usuario sustituto: su. Escribir su - (lo mismo que su - root) abre un nuevo intérprete de comandos con permisos de acceso de superusuario completos. Asimismo, se puede utilizar como sigue (una vez hayamos habilitado el inicio de sesión de root):

pi@erpi ~ $ su -

Password: mySuperSecretPassword

root@erpi:~# whoami

root

root@erpi:~# exit

logout

pi@erpi ~ $ whoami

pi

El símbolo del sistema, #, indica que hemos iniciado sesión con la cuenta de superusuario. Para volver a deshabilitar el acceso como root en el RPi, podemos escribir sudo passwd -l root.

Administración del sistema

El sistema de archivos de Linux consiste en una jerarquía de directorios que sirven para organizar los archivos en un sistema Linux. Esta sección examina la propiedad de los archivos, el uso de los enlaces simbólicos y el concepto de permisos de acceso del sistema.

El sistema de archivos de Linux

Linux utiliza estructuras de datos, llamadas "inodos" (inodes, nodos-i o nodos índice) para representar los objetos del sistema de archivos, como archivos y directorios. Cuando se crea un sistema de archivos ampliado (ext) de Linux, como ext3 o ext4, en un disco físico, se configura simultáneamente una tabla de inodos (inode table). Esta tabla comprende los vínculos a la estructura de datos inodo para cada archivo y directorio en un disco físico. La estructura de datos inodo para cada archivo y directorio almacena información como permisos, punteros a sectores físicos de almacenamiento, marcas de tiempo (time stamps) o número de enlaces (link counts). Podemos ver un ejemplo de ello realizando un listado ls -ail del directorio raíz, donde -i haga que ls muestre los índices inodo. Veremos lo siguiente para el directorio /tmp :

pi@erpi ~ $ cd /

pi@erpi / $ ls -ail | grep tmp

269 drwxrwxrwt 7 root root 4096 Jun 18 01:17 tmp

Por lo tanto, 269 es el índice inodo de /tmp. Si pasamos al directorio /tmp usando cd, creamos un archivo temporal (a.txt ) y ejecutamos ls -ail, veremos que el directorio actual (.) tiene exactamente el mismo índice inodo:

pi@erpi / $ cd tmp

pi@erpi /tmp $ touch a.txt

pi@erpi /tmp $ ls -ail

269 drwxrwxrwt 7 root root 4096 Jun 18 01:41 .

2 drwxr-xr-x 22 root root 4096 Jun 16 01:57 ..

4338 -rw-r--r-- 1 pi pi 0 Jun 18 01:41 a.txt

También podemos ver que el directorio raíz (..) tiene un índice inodo de 2, y que un archivo de texto (a.txt) tiene un índice inodo de 4338. Por lo tanto, no podemos cambiar de directorio (con cd) directamente a un índice inodo, porque el índice inodo podría no referirse a un directorio.

La figura 3-3 muestra el listado de un directorio de Linux, con los permisos que nos permiten trabajar con los archivos en Linux. La primera letra indica el tipo de archivo, por ejemplo: un directorio (d), un enlace (l) o un archivo estándar (-). También podemos encontrar tipos de archivos más raros: (c) carácter especial, (b) bloque especial, (p) fifo y (s) socket. Los directorios y los archivos estándar no necesitan más explicación, pero los enlaces sí, como vemos aquí:


Figura 3-3: Listado de un directorio de Linux con los permisos de cada archivo.

Enlaces a archivos y directorios

Hay dos tipos de enlaces en Linux: los enlaces simbólicos (soft links o symbolic links) y los enlaces duros (hard links). Un enlace simbólico es un archivo que hace referencia a la ubicación de otro archivo o directorio. Por contra, los enlaces duros se vinculan directamente con el índice inodo, pero no se pueden vincular con un directorio. Podemos crear un enlace usando ln /path/to/file.txt linkname. Se crea un enlace simbólico añadiendo -s a la llamada. Para ilustrar esto, el ejemplo siguiente creará un enlace simbólico y un enlace duro al archivo /tmp/test.txt:

pi@erpi ~ $ cd /tmp

pi@erpi /tmp $ touch test.txt

pi@erpi /tmp $ ln -s /tmp/test.txt softlink

pi@erpi /tmp $ ln /tmp/test.txt hardlink

pi@erpi /tmp $ ls -al

total 8

drwxrwxrwt 2 root root 4096 Jun 18 01:55 .

drwxr-xr-x 22 root root 4096 Jun 16 01:57 ..

-rw-r--r-- 2 pi pi 0 Jun 18 01:55 hardlink

lrwxrwxrwx 1 pi pi 13 Jun 18 01:55 softlink -> /tmp/test.txt

-rw-r--r-- 2 pi pi 0 Jun 18 01:55 test.txt

Puede observar un número 2 delante del archivo test.txt (después de los permisos del archivo). Este es el número de enlaces duros asociados al archivo. Es una cuenta que se incrementó en 1 cuando se creó el enlace duro, llamado hardlink. Si tuviéramos que eliminar el enlace duro, por ejemplo mediante rm hardlink, esta cuenta volvería al valor 1. Para ilustrar la diferencia entre enlaces simbólicos y enlaces duros, añadimos un fragmento de texto al archivo test.txt:

pi@erpi /tmp $ echo "testing links on the RPi" >> test.txt

pi@erpi /tmp $ more hardlink

testing links on the RPi

pi@erpi /tmp $ more softlink

testing links on the RPi

pi@erpi /tmp $ mkdir subdirectory

pi@erpi /tmp $ mv test.txt subdirectory/

pi@erpi /tmp $ more hardlink

testing links on the RPi

pi@erpi /tmp $ more softlink

softlink: No such file or directory

Podemos observar que cuando el archivo test.txt se mueve al subdirectorio, se rompe el enlace simbólico, pero el enlace duro sigue funcionando perfectamente. Así pues, comprobamos que los enlaces simbólicos no se actualizan cuando se mueve el archivo enlazado, mientras que los enlaces duros siempre hacen referencia al origen, aunque se haya movido o eliminado. Para ilustrar el último punto, podemos eliminar el archivo test.txt escribiendo lo siguiente:

pi@erpi /tmp $ rm subdirectory/test.txt

pi@erpi /tmp $ more hardlink

testing links on the RPi

Mas el archivo todavía existe, y no se borrará hasta que eliminemos el enlace duro llamado hardlink, con lo que la cuenta bajará hasta cero. Así pues, si un archivo tiene una cuenta de enlaces duros igual a cero, y no lo utiliza ningún proceso, será borrado. En efecto, el propio nombre, test.txt, no es más que un enlace duro. Observe que no se pueden establecer enlaces duros a través de distintos sistemas de archivos, puesto que cada sistema posee su propia tabla de índices inodo que empieza en 1. Por lo tanto, el inodo 269, que es el índice inodo del directorio /tmp, seguramente describa una cosa completamente diferente en otro sistema de archivos. Escriba el comando man ln para acceder a una guía especialmente útil sobre los enlaces a archivos.

NOTA Puede escribir history para obtener una lista de todos los comandos escritos anteriormente. Asimismo, puede pulsar Control+R para acceder a una búsqueda interactiva del historial de comandos y localizar uno que haya usado recientemente. Pulsar Intro activa el comando, mientras que pulsar Tab lo sitúa en nuestra línea de comandos para que podamos modificarlo.

Usuarios y grupos

Linux es un sistema operativo multiusuario que utiliza las siguientes tres clases diferenciadas para gestionar los permisos de acceso:

❏Usuario (user): podemos crear diferentes cuentas de usuario en nuestro RPi. Esto resulta útil si deseamos limitar el acceso a determinados procesos y áreas del sistema de archivos. La cuenta de usuario root es el superusuario del RPi y tiene acceso a todos y cada uno de los archivos. Por tanto, no sería seguro ejecutar un servidor web público desde esta cuenta, ni tampoco desde pi, si el servidor soporta scripts locales.

❏Grupo (group): las cuentas de usuario se pueden marcar (flag) para indicar que pertenecen a uno o varios grupos. Grupos que pueden contar con diferentes niveles de acceso a los distintos recursos del sistema, por ejemplo dispositivos UART o buses I2C.

❏Otros (others): todos los usuarios del RPi aparte del propietario del archivo, o de un miembro de un grupo listado en los permisos.

Podemos crear usuarios desde una ventana de terminal de Linux. Podemos ver la lista completa de grupos escribiendo more /etc/group. El ejemplo siguiente demuestra cómo crear una nueva cuenta de usuario en el RPi y modificar sus propiedades según nos convenga.

Ejemplo: crear una nueva cuenta de usuario en el RPI

Este ejemplo muestra cómo crear una cuenta de usuario y, luego, cambiar sus propiedades:

1. Creamos una nueva cuenta de usuario llamada molloyd en el RPi

2. Añadimos la cuenta a un nuevo grupo diseñado por nosotros mismos.

3. Añadimos la cuenta de usuario a los grupos de interfaz estándar del RPi.

4. Cambiamos la contraseña de la nueva cuenta de usuario.

5. Comprobamos que la cuenta funcione correctamente.

Paso 1: Crear el usuario molloyd del siguiente modo:

pi@erpi ~ $ sudo adduser molloyd

Adding user 'molloyd' ...

Adding new group 'molloyd' (1002) ...

Adding new user 'molloyd' (1001) with group 'molloyd' ...

Creating home directory '/home/molloyd' ...

Copying files from '/etc/skel' ...

Enter new UNIX password: ThePassword

Retype new UNIX password: ThePassword

passwd: password updated successfully

Changing the user information for molloyd

Enter the new value, or press ENTER for the default

Full Name []: Derek Molloy

Room Number []: Home

Work Phone []: XXXX

Home Phone []: XXXX

Other []: XXXX

Is the information correct? [Y/n] Y

Paso 2: Añadir el usuario a un nuevo grupo diseñado por nosotros mismos.

pi@erpi ~ $ sudo groupadd newgroup

pi@erpi ~ $ sudo adduser molloyd newgroup

Adding user 'molloyd' to group 'newgroup' ...

Adding user molloyd to group newgroup

Done.

pi@erpi ~ $ groups molloyd

molloyd : molloyd newgroup

Paso 3: Añadir el usuario a los grupos de usuarios estándar y de interfaz del RPi:

pi@erpi ~ $ sudo usermod -a -G pi,adm,dialout,cdrom,sudo,audio,video,

plugdev,users,games,netdev,gpio,i2c,spi,input molloyd

pi@erpi ~ $ groups molloyd

molloyd : molloyd adm dialout cdrom sudo audio video plugdev games users pi

netdev input spi i2c gpio newgroup

Paso 4: Cambiar la contraseña si es preciso:

pi@erpi ~ $ sudo passwd molloyd

Enter new UNIX password: ABetterPassword

Retype new UNIX password: ABetterPassword

passwd: password updated successfully

pi@erpi ~ $ sudo chage -d 0 molloyd


Para practicar los temas presentados hasta ahora en este capítulo, los siguientes ejemplos utilizan la cuenta de usuario molloyd. El primer ejemplo muestra el comando chown (change ownership) para cambiar la propiedad de un archivo, y para cambiar la propiedad de grupo del archivo usamos chgrp (change group).

Para poder invocar correctamente la herramienta sudo en el ejemplo, el usuario molloyd debe figurar en el archivo sudoers, lo que se hace desde el usuario pi ejecutando el comando visudo. Se puede modificar el archivo para que incluya una entrada molloyd del siguiente modo:

pi@erpi ~ $ sudo visudo

pi@erpi ~ $ sudo tail -n 2 /etc/sudoers

pi ALL=(ALL) NOPASSWD: ALL

molloyd ALL=(ALL) ALL

La cuenta de usuario molloyd puede ejecutar a partir de ahora el comando sudo, pero deberá escribir su contraseña para ello.


Permisos del sistema de archivos

Los permisos del sistema de archivos (file system permissions) indican qué niveles de acceso a un archivo o directorio tiene cada una de las clases de permisos. El comando chmod (change mode, cambiar modo) permite a un usuario cambiar los permisos de acceso a los objetos del sistema de archivos. Es posible especificar los permisos de una forma relativa. Por ejemplo, chmod a+w test.txt proporciona a todos los usuarios acceso de escritura al archivo test.txt, pero no cambia ningún otro permiso.

Por otra parte, también es posible especificar los permisos de una forma absoluta. Por ejemplo, chmod a=r test.txt establece que todos los usuarios tendrán únicamente acceso de lectura al archivo test.txt. El ejemplo siguiente muestra cómo modificar los permisos del sistema de archivos para un archivo utilizando el comando chmod.


La tabla 3-3 muestra la estructura de comandos para chown y chgrp. Asimismo, lista algunos comandos de ejemplo para trabajar con usuarios, grupos y permisos.

Tabla 3-3: Comandos para trabajar con usuarios, grupos y permisos.


ComandoDescripción
chown molloyd a.txtchown molloyd:users a.txtchown -Rh molloyd /tmp/testCambia el propietario del archivo.Cambia propietario y grupo al mismo tiempo.Cambia la propiedad del directorio /tmp/test de forma recursiva. -h afecta a los enlaces simbólicos en lugar de a los archivos referenciados.
chgrp users a.txtchgrp -Rh users /tmp/testCambia la propiedad de grupo del archivo.Cambia recursivamente con la misma -h que chown.
chmod 600 a.txtchmod ugo+rw a.txtchmod a-w a.txtCambia permisos, como en la figura 3-3, para que el usuario tenga permisos de lectura/escritura al archivo. Tanto el grupo como otros no tienen acceso.Otorga a los usuarios, grupo y otros permiso de lectura/escritura a a.txt.Elimina el acceso de escritura para todos los usuarios de a, lo que quiere decir todos (usuarios, grupos y otros).
chmod ugo=rw a.txtEstablece los permisos de lectura/escritura para todos.
umaskumask -SLista la configuración de permisos por defecto. Con -S se muestra umask de una forma más legible.
umask 022umask u=rwx,g=rx,o=rxModifica los permisos predeterminados en todos los archivos y directorios de nueva creación. Los dos comandos umask mostrados aquí son equivalentes. Si establecemos este valor de máscara y creamos un archivo o directorio, será drwxr-xr-x para el directorio, y -rw-r--r-- para el archivo. Es posible establecer una umask específica de usuario en el archivo .login de la cuenta.
chmod u+s myexechmod g+s myexeEstablece un bit especial, llamado setuid bit (set user ID on execute, establecer ID de usuario al ejecutar) y setgid bit (set group ID on execute, establecer ID de grupo al ejecutar), que permite que un programa se ejecute como si lo hiciera otro usuario, pero con los permisos del propietario o grupo del archivo. Por ejemplo, esto permitiría que un programa concreto se ejecutase como si fuera el superusuario quien lo iniciase. Si el archivo no es ejecutable, se muestra una S mayúscula, en lugar de una s minúscula.
chmod 6750 myexechmod u=rwxs,g=rxs,o= myexeEstablece el valor del bit setuid de forma absoluta. Ambos otorgarán a myexe los permisos rwsr-s---, con ambos bits, setuid y setgid, configurados (observe el espacio antes de myexe).Por razones de seguridad no se puede aplicar el bit setuid a un script del intérprete de comandos.
stat /tmp/test.txtOfrece información útil sobre el estado del sistema de archivos para un archivo o directorio, por ejemplo el dispositivo físico en que se encuentra, información de su inodo, el último acceso o las últimas modificaciones o cambios.

Veamos un ejemplo de la última entrada de la tabla 3-3, el comando stat:

molloyd@erpi:/tmp$ stat test.txt

File: 'test.txt'

Size: 0 Blocks: 0 IO Block: 4096 regular empty file

Device: b302h/45826d Inode: 6723 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2015-06-19 00:06:28.551326384 +0000

Modify: 2015-06-19 00:06:28.551326384 +0000

Change: 2015-06-19 0:07:13.151016841 +0000

Birth: -

Observe que cada archivo de Linux conserva las marcas de tiempo de acceso, modificación y cambio. Podemos cambiar las marcas temporales de acceso y modificación artificialmente usando touch -a text.txt y touch -m test.txt, respectivamente (el tiempo de cambio se ve afectado en ambos casos). El tiempo de cambio se ve afectado también por las operaciones del sistema como chmod; el tiempo de modificación se ve afectado por una operación de escritura en el archivo, y el tiempo de acceso, en teoría, se ve afectado por una operación de lectura. Sin embargo, este comportamiento operacional significa que la lectura de un archivo ocasiona una escritura. Esta característica de Linux ocasiona un desgaste significativo en la tarjeta SD del RPi y un rendimiento deficiente en las operaciones de E/S. Por tanto, la funcionalidad de marca de tiempo de acceso a los archivos suele estar deshabilitada por defecto en la SD de arranque del RPi, mediante la opción de montaje (mount option) noatime en el archivo de configuración /etc/fstab que veremos en la sección siguiente. Observe que hay una opción similar, nodiratime, específica para directorios. No obstante, la opción noatime impide la actualización de la marca de tiempo para los accesos tanto a archivos como a directorios.

Para finalizar el análisis de la figura 3-3, decir que el ejemplo de la figura tiene 22 enlaces duros al archivo. Para un directorio, esto representa el número de subdirectorios, su directorio padre (..) y a sí mismo (.). El propietario de la entrada es el root y está en el grupo del root. La entrada siguiente, 4096, es el tamaño exigido para guardar los metadatos sobre los archivos contenidos en ese directorio (el tamaño mínimo es un sector, generalmente 4.096 bytes).

Para finalizar: si pedimos un listado de directorios ls -ld en el directorio root, veremos un bit t en los permisos del directorio /tmp. Dicho bit se conoce como sticky bit (literalmente, bit pegajoso), e indica que solo el permiso de escritura no basta para borrar archivos. Así pues, en el directorio /tmp cualquier usuario puede crear archivos, pero nadie puede borrar los archivos de otro usuario.

molloyd@erpi:/tmp$ cd /

molloyd@erpi:/$ ls -dhl tmp

drwxrwxrwt 7 root root 4.0K Jun 19 00:18 tmp

El comando ls -dhl lista los nombres de directorio, el parámetro d, y no su contenido, en formato legible para las personas (al menos para algunas), el parámetro h (de human readable) y en su versión larga, parámetro d.

El directorio raíz (root) de Linux

Explorar el sistema de archivos de Linux resulta aterrador para los principiantes. Si vamos al nivel superior con el comando cd / en el RPi y escribimos ls, veremos un listado del nivel más alto de la estructura de directorios del siguiente modo:

molloyd@erpi:/$ ls

bin boot.bak etc lib media opt root sbin sys usr

boot dev home lost+found mnt proc run srv tmp var

¿Qué significa todo esto? Cada uno de estos directorios tiene su papel y, si los entendemos bien, nos permitirán saber por dónde empezar a buscar archivos de configuración o los archivos binarios que necesitemos. En la tabla 3-4 tenemos una descripción breve de cada subdirectorio de nivel más alto de Linux.

Tabla 3-4: Estructura de directorios de nivel superior en Linux.


DirectorioDescripción
binContiene los binarios ejecutables utilizados por todos los usuarios y está en la variable de entorno PATH de forma predeterminada. Otro directorio, /usr/bin, contiene ejecutables que no resultan básicos para el arranque o reparación del sistema.
bootContiene los archivos para arrancar el RPi.
boot.bakContiene una copia de /boot generada tras una actualización del sistema.
devContiene los nodos de dispositivo, enlazados a sus controladores.
etcArchivos de configuración para el sistema local.
home Contiene los directorios raíz (home) de las cuentas de usuario (/home/pi es el directorio raíz de la cuenta de usuario pi).
lib Contiene las librerías estándar del sistema.
lost+foundAquí figuran los archivos sin vínculos que aparezcan tras ejecutar fsck (file system check and repair, comprobación y reparación del sistema de archivos). El comando mklost+found vuelve a crear el directorio lost+found si se ha eliminado.
mediaUtilizado para montar dispositivos removibles, como tarjetas micro-SD.
mntSu uso típico es para montar sistemas de archivos temporales.
optUn buen lugar para instalar software opcional de terceros.
procUn archivo virtual que representa los procesos en ejecución en el RPi. Por ejemplo, si pasamos al directorio cd /proc y escribimos cat iomem, veremos algunos mapeos de asignaciones de memoria.
rootEl directorio raíz de la cuenta root (superusuario) en las distribuciones Raspbian y Debian Linux. En muchas otras distribuciones, es el directorio /home/root.
runProporciona información acerca de la ejecución del sistema desde la última vez que arrancó.
sbinContiene ejecutables para la gestión del root.
srvAlmacena datos relacionados con ftp, servidores web, rsync, etc.
sysContiene un sistema de archivos virtual que describe el sistema.
tmpContiene archivos temporales.
usrContiene programas para todos los usuarios, junto con muchos subdirectorios como: /usr/include (archivos de cabecera C/C++), /usr/lib (librerías C/C++), /usr/src (código fuente del núcleo de Linux), /usr/bin (ejecutables del usuario), /usr/local (similar a /usr, pero para usuarios locales) y /usr/share (archivos compartidos entre los usuarios).
varContiene archivos variables como los log del sistema.

Comandos para sistemas de archivos

Además de los comandos para trabajar con archivos y directorios en los sistemas de archivos, existen comandos para trabajar con el propio sistema de archivos. Los primeros comandos que deberíamos examinar son: df (disk free) y mount. El comando df ofrece un resumen de los sistemas de archivos en el RPi. El parámetro -T lista los tipos de sistemas de archivos:

pi@erpi / $ df -T

Filesystem Type 1K-blocks Used Available Use% Mounted on

/dev/root ext4 15186900 3353712 11165852 24% /

devtmpfs devtmpfs 470400 0 470400 0% /dev

tmpfs tmpfs 474688 0 474688 0% /dev/shm

tmpfs tmpfs 474688 0 474688 0% /sys/fs/cgroup

/dev/mmcblk0p1 vfat 57288 19824 37464 35% /boot

...

El comando df resulta útil para determinar si nos estamos quedando sin espacio en disco. Observamos que el sistema de archivos del root, /dev/root, está ocupado al 24% en este caso, con 11,2 GB de un tarjeta SD de 16 disponibles para instalar nuevo software. Asimismo, se listan las entradas de varios sistemas de archivos temporales (tmpfs) que en realidad se refieren a sistemas de archivos virtuales y que están mapeados en la DDR RAM del RPi. Las entradas /sys/fs/* se discuten con detalle en el capítulo 8. Además, la entrada /dev/mmcblk0p1 cuenta con un sistema de archivos vfat (virtual file allocation table, tabla de asignación de archivos virtuales), que se presentó con Windows 95, en una partición de 57 MB en la tarjeta SD. Esta partición vfat es un requisito de los gestores de arranque y para las actualizaciones de firmware.

NOTA Si nos estamos quedando sin espacio en el sistema de archivos root de la tarjeta SD del RPi, comprobaremos los log del sistema: /var/log. Unos archivos de log (o simplemente "logs") excesivamente grandes suelen ser sinónimo de problemas en el sistema, así que debemos revisarlos. Cuando hayamos resuelto cualquier problema, nos libraremos de ellos escribiendo: cat /dev/null > /var/log/messages con privilegios de root (véase también kern.log, dpkg.log y syslog). Por ejemplo, para vaciar el log dpkg.log desde la cuenta pi, sin eliminar el archivo ni reiniciar sus permisos, escribimos: