Conceptos de Unix

Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 59

CONCEPTOS DE UNIX

Consolas Virtuales
• Antiguamente mediante terminales, se controlaban los servidores.
Estos terminales eran un dispositivo de salida para la visualización de
caracteres y un dispositivo de entrada, el teclado.
• Hoy en dia Linux permite emular varios terminales al mismo tiempo
hasta un total de 6, a estos terminales virtuales se le denomina
consola virtual. Hay por defecto 6 consolas virtuales. Para cambiar de
una a otra: Alt+f1, Atl+f2, Alt+f3… Alt+f6
• Nota: En cada consola virtual debe iniciar sesión un usuario para
empezar a usarla, este usuario puede ser distinto en cada consola.
• Existe tener o limitar más consolas de las que disponemos. Pare ello,
en primer lugar abriremos un nuevo terminal y entraremos como
super usuario (root) tecleando “sudo su” (nos permite cambiar de
usuario normal a super usuario.
Recordar que, normalmente la cuenta root está deshabilitada de forma predeterminada, lo que
significa que root no tiene contraseña. Ubuntu está usando sudo – sudo permite a los “usuarios
normales” ejecutar comandos con privilegios de superusuario y “ejecutar” sudo están usando su
propia contraseña.
• Tras este paso escribimos la siguiente línea de código:
getdit /etc/inittab
Con este comando se nos abrirá algo como lo que aparece en la
siguiente diapositiva.
Como se puede ver, aquí aparece cada uno de los terminales disponibles,
como hemos dicho anteriormente aparecen 6 terminales por defecto. En el
caso de querer deshabilitar alguno de ellos escribiremos delante de la línea
el carácter #., por ejemplo, si quiero deshabilitar el terminal 4, la cuarta línea
de esta pantalla debería quedar de la siguiente forma:
#4:23:respaw:/bin/getty 38400 tty4

Ahora, tras guardar el archivo, si un usuario pulsa Alt+f4, simplemente


aparecería una pantalla en negro que no nos permite hacer nada hasta quee
cambiemos a una consola que si esté activada.

Si lo que queremos es añadir un nuevo terminal escribiremos el mismo


formato de las líneas anteriores pero cambiando su índice, por ejemplo:

8:23:respaw:/bin/getty 38400 tty8

Como podemos ver, hemos saltado la 7 ya que esa consola está reservada para
el modo gráfico y por tanto no aparece.
Otro modo de cancelar consolas (es posible que no funcione en
versiones antiguas de Ubuntu) es abriendo un terminal y escribiremos
el comando:
gedit /etc/init/tty4.conf
Aquí estaríamos editando directamente la consola número 4
Como podemos ver las dos últimas líneas del archivo están precedidas por # ya
que antes la hemos deshabilitado. Para volver a habilitar esta consola bastaría
con eliminar las almohadillas y guardar el archivo.

Comando GEDIT.
Hemos visto un nuevo “comando” que no hemos utilizado hasta ahora gedit.  Es
un software, en realidad lo que hacemos es una llamada para abrirlo, que está
en todas las distribuciones que tienen Gnome*, y por tanto en todos los equipos
con Ubuntu, y que es increíblemente potente, aunque no lo parezca.

* GNOME es un entorno gráfico (gestor de ventanas) amigable que permite a los usuarios usar y
configurar sus ordenadores de una forma sencilla. GNOME incluye un panel (para iniciar aplicaciones y
mostrar el estado de funcionamiento), un escritorio ( donde se pueden situar los datos y las
aplicaciones), un conjunto estándar de aplicaciones y herramientas de escritorio, y un conjunto de
convenciones que facilitan la operación y consistencia de las aplicaciones entre sí.
Una de las virtudes de Gedit es que además de tener las funciones del
típico procesador de textos, como el copiar, pegar, imprimir, corrector
ortográfico, etc… posee la opción de desarrollar archivos de
programación en varios lenguajes, también permite la opción de poder
trabajar con varios archivos a la vez mediante pestañas lo que le
convierte en un editor de código bastante potente.
Redirecciones a fichero
A veces, puede ser de mucha utilidad que la salida de un comando o programa sea examinada con detalle, por lo que
podemos guardarla (igual que hacíamos en Windows) en un fichero mediante redireccionamientos.
comando > fichero.
# grub-mkconfig > /boot/grub2/grub.cfg
grub-mkconfig genera el archivo de configuración basado en plantillas ubicadas en /etc/grub.d. para GRUB que es un
programa que habilita al usuario a seleccionar qué sistema operativo instalado o kernel cargar en el momento de
arranque del sistema. Permite también que el usuario transmita argumentos al kernel.
Los procesos tienen 2 salidas, la estándar y la salida de error, por la salida de error los comandos emiten los errores
que encuentren, por defecto las 2 salidas son la misma, el terminal (ventanita que vemos en pantalla) pero podemos
redirigir la salida de error con 2> :
# gcc -o chess -O2 chess.c 2> chess.err
En este caso le estamos diciendo que los errores de compilacion originados por gcc se registren en el archivo chess.err,
de esta forma podemos analizarlos más tranquilamente y deputrar el código.
Los procesos tambien tienen una entrada estándar que también podemos redirigir: comando < fichero.
# read nombre < nombre.txt
• Nota: El símbolo > redirige la salida hacia un chero y sobrescribe el fichero, si en vez > pongo >> se añaden el
contenido al final del chero y no se sobrescribe:
Encadenamientos
A parte de redirecciones a ficheros podemos encadenar la salida
estándar de un comando cmd1 con la entrada estándar de un comando
cmd2, con esto hago que los datos de entrada de cmd2 sean los datos
de salida de cmd1.
Se suele usar mucho para visualizar detenidamente la salida de un
comando al redireccionar la salida del mismo al comando less. La
forma es cmd1 | cmd2. Ejemplo
• # ps -ef | less
• Para examinar la lista de todos los procesos, ya que son tantos que no
caben en las líneas del terminal.
• # useradd --help | less (Examinar la ayuda de useradd).
Búsquedas de cadenas

El comando grep se puede usar para buscar cadenas en ficheros o en la salida


estándar.

# grep myserver /etc/*

Busca la cadena myserver en todos los cheros que hay en /etc.

# ps -ef | grep sshd


para buscar un patrón específico en un archivo o grupo de archivos.

 El comando ps muestra por pantalla un listado de los procesos que se están ejecutando en el sistema.

Muestra todas las líneas de la salida ps -ef que contengan la cadena sshd. Se
puede usar para saber si sshd está en funcionamiento.
Gestionando procesos

Como hemos visto anteriormente, ps muestra los procesos activos, hay diferentes
variantes, cada proceso tiene un numero que lo identifica, este número se llama pid. Al
pid del proceso padre se le llama ppid.
• ps: Muesta los procesos que se ejecuten bajo terminal actual.
• ps x: Muestra los procesos del usuario.
• ps -ef: Muestra todos los procesos del sistema.
• ps xua: Muestra todos los procesos del sistema e información adicional como uso
de CPU y de memoria.
• ps -u nombre_usuario: Muestra todos los procesos del usuario indicado.
El comando kill envía una señal a un proceso, el resultado depende de si los procesos
están preparados para recibir esa señal o no, dependiendo de la señal pueden terminar
o realizar alguna acción.
# ps -ef
# kill 1234
El proceso que quiero terminar tiene pid 1234.
# kill -SIGKILL 1234
El proceso no ha terminado y lo fuerzo a terminar.

El comando pkill funciona como kill, pero en vez de especificar un pid, se especifica un
nombre de proceso y envía la señal a los procesos con ese nombre.

# pkill lxterminal  El proceso lxterminal debe terminar.

Algunas señales se usan para indicarle algo a un proceso como que recargue la confiración
después de haber sido modificada, esta señal SIGHUP.
# kill -SIGHUP 2345  Le digo al servidor WEB(del cual supongo que su pid es el 2345 ) que
recargue la configuración.
Un demonio es un proceso no interactivo (no interactuamos con el) que
realiza o supervisa alguna tarea, normalmente se ejecutan en:

• segundo plano, es decir fuera del terminal dejando este a disposición


de otras tareas (ej barra Windows). Se puede decir que es el nombre
con el que se conocía a los procesos que proporcionaban algún
servicio. Esta denominación se usa menos en la actualidad.

• Hace 15 años se leía un mensaje al iniciar Linux que poníaa \Starting


daemons". En caso de no especificar señal, se envía la señal SIGTERM.
Sólo puedes enviar señales a procesos cuyo propietario tenga el
mismo UID que tu. A menos que 2 cuentas tengan el mismo UID. El
usuario con UID=0 (Usuario root) si que puede a cualquiera.
SESIONES Y TERMINALES
Un terminal es un dispositivo que tiene 2 funciones:

• Visualización de la salida estándar de los procesos.


• Introducción de datos por parte del usuario para los procesos(entrada estándar de los procesos).
Las consolas virtuales son terminales, pero hay más clases de terminales, algunos son virtuales, esto
quiere decir que no existe un dispositivo físico que se le pueda llamar terminal, sino que se emula por
software la existencia de un terminal donde los procesos emiten y leen datos.
Para ello se crear dispositivos virtuales que representan los terminales.

Un ejemplo es cuando se accede a un terminal remoto por red(telnet o


ssh), también las ventanas de líneas de comandos de los entornos
gráficos son terminales virtuales.

Una sesión es una agrupación de procesos que utilizan el mismo


terminal, normalmente se crea un proceso líder que abre el terminal,
luego pregunta un usuario y contraseña y si se acierta ocurre lo
siguiente.
1. Se ejecuta el shell asociado al usuario y este shell se convierte en
líder de la sesión.
2. El shell lee los archivos .profile y /etc/profile y ejecuta los comandos
que contengan.
3. Ya se puede introducir comandos.
4. Una vez que el usuario quiere terminar la sesión, teclea el comando
exit.
5. El shell termina.
6. Como el shell es el líder de la sesión, el núcleo envía la señal
SIGHUP a todos los procesos asociados al terminal y como norma
general estos procesos terminan.
SEGUNDO PLANO
Cuando se lanza un comando, se crea un proceso que lo ejecuta, hasta
que el proceso termina no podemos volver a ejecutar un comando, es
decir el proceso padre(shell) espera a que termine el proceso
hijo(comando).
Es posible lanzar un proceso en segundo plano y seguir con la línea de
comandos, es decir que el proceso padre no espere al proceso hijo.
Para ello añadimos el símbolo & al final de la línea del comando como
en el ejemplo.
Un ejemplo:
# wget http://es.download.nvidia.com/XFree86/Linux-x86 64/319.60/NVIDIA-Linux-x86 64-
319.60.run > /dev/null

En este caso se redirige la salida estándar (el avance de la descarga, el mensaje de fin de descarga,
etc.) al sumidero* para que no se muestre en el terminal y no moleste.
El comando wget realiza descargas por http o ftp.
Como se ha dicho anteriormente cada vez que un usuario abre un terminal y aparece el shell, se
crea una sesión. Cuando se cierra la sesión, todos los procesos lanzados en ella se terminan.
Podemos hacer que cuando salgamos de la sesión el proceso se quede ejecutándose con la orden
nohup.

En algunos sistemas operativos, /dev/null o «null device» ─en castellano «periférico nulo»─, es un archivo especial
que descarta toda la información que se escribe en o se redirige hacia él. A su vez, no proporciona ningún dato a
cualquier proceso que intente leer de él, devolviendo simplemente un EOF o fin de archivo.
# nohup wget http://es.download.nvidia.com/XFree86/Linux-x86 64/319.60/NVIDIA-Linux-x86 64-319.60.run &
# exit
Tras hacer exit se cierra el shell, pero el wget sigue funcionando. Básicamente lo que hace es
protegerlo de la señal SIGHUP mediante un mecanismo que los programadores de UNIX conocen
como “Hacer que la señal se ignore".
Nota: Las aplicaciones interactivas como editores de texto o asistentes no pueden funcionar en
segundo plano.
PROCESOS DE NÚCLEO
Algunos procesos no tienen un fichero ejecutable que representa el
programa que están ejecutando, sino que todo su código forma parte
del núcleo del SO, para poder identificarlos solo hay que observar que
su nombre va entre [nombre].
# ps -ef | less
root 207 2 0 15:21 ? 00:00:00 [iwlwifi]
Este es un ejemplo de proceso de núcleo, no hay ningún chero iwlwi.
Estos procesos no pueden ser matados ni por el administrador de
sistemas.
EL SHELL
El shell es el programa encargado de interactuar con los usuarios, ejecutar los
programas que indique. En los sistemas Linux suele usarse el bash cuyo fichero de
programa es /bin/bash

Autocompletar
El shell bash puede autocompletar los nombres de ficheros y comandos, para
completar un comando como por ejemplo evince, tecleo evi y luego pulso la tecla
TABULADOR y él me completa el nombre, en caso de haber varias opciones, me
muestra todas las opciones para que siga tecleando, pulso n y se queda evin al pulsar
TABULADOR y aparecería evince. Esto también se aplica a nombres de ficheros. A
continuación un ejemplo:
# grub-mkconfig > /boot/grub/grub . Pulso TAB.
# grub-mkconfig > /boot/grub/grub.cfg (Daría como resultado)
PATH Y VARIABLES
La variable de entorno PATH contiene una lista de directorios donde se ubicaran los
comandos si PATH=/bin:/usr/bin:/sbin, se buscará los comandos en /bin, /usr/bin y /sbin,
y en caso de no encontrarse daría un error, también indica la ruta completa de un
comando como en:

# /opt/oracle/db12g/bin/sqlplus

Nota: Cuando asigno un valor a una variable, este tiene efecto sobre el propio shell y no
sobre el resto de los procesos, para que el nuevo valor de la variable se propague de
padres a hijos debo ejecutar el siguiente comando:
# export VARIABLE
# PATH=$fPATHg:/opt/oracle/db12g/bin
# export PATH
DEFINIENDO VARIABLES DE USUARIO Y DE SISTEMA
Las variables pueden ser definidas por el usuario editando el
fichero .profile_profile y añadiendo líneas con el formato export
VARIABLE =VALOR como en el siguiente ejemplo, donde se añade la
variable LIBVIRT_DEFAULT_URI:
Estas variables son definidas por el usuario, y solo se aplican a las
sesiones que inicia dicho usuario. Si el administrador desea definir
variables que se apliquen a todas las cuentas de usuario, tiene que
editar el fichero
/etc/environment y definirlas usando el formato VARIABLE =VALOR:
Los archivos de inicio de sesión

Como se ha comentado anteriormente, en el momento de iniciar sesión


se ejecutan una serie de scripts, estos son:

• /etc/profile
• /etc/profile.d/*.sh
• /etc/bashrc
• .bash profile: Ubicado en el directorio HOME del usuario.
• .bashrc: Ubicado en el directorio HOME del usuario.
El intérprete de comandos usa una colección de ficheros de inicio para ayudar a crear
un entorno en el que ejecutarse. Cada fichero tiene un uso específico y puede afectar
de manera diferente a entornos interactivos y de ingreso. El directorio /etc
proporciona, generalmente, las configuraciones globales.

/etc/profile

• Este fichero establece ciertas funciones auxiliares así como las variables
predeterminadas de todo el sistema como, por ejemplo:
• Variables de exportación
• Máscara de creación de archivos (umask)*
• Tipos de terminal
• Mensajes de correo para indicar cuándo ha llegado nuevo correo

El administrador del sistema configura el archivo /etc/profile para todos los usuarios
del sistema. Únicamente el administrador del sistema puede modificar este archivo.
UMASK en los sistemas Linux y Unix se conoce en realidad como Máscara de usuario o
también se denomina MASCARA de creación de archivos de usuario. Este es un tipo de
permiso básico o permiso predeterminado que se otorga cuando se crea un nuevo archivo o
carpeta en el cuadro de Linux.

La mayor parte de la distribución de Linux ofrece 022 como UMASK predeterminado.


Podemos decir que son permisos predeterminados para el archivo y las carpetas del sistema.
Cuando creamos cualquier archivo o directorio en Linux, se rigen por la configuración de
umask.

En caso de que algún administrador del sistema no establezca, la umask predeterminada


será 0000. Esto significa que los nuevos archivos creados tendrán permisos de lectura y
escritura para cada usuario y los nuevos directorios tendrán permisos de lectura, escritura y
ejecución.
• Valor mínimo de UMASK para directorio: 000 y Máximo: 777
• Valor mínimo de UMASK para el archivo: 000 y máximo: 666
666 para archivos se debe a que los archivos de script y los archivos binarios en
Linux solo deben tener permisos de ejecución. Los archivos normales en Linux
solo deben tener permisos de lectura y escritura. Normalmente, umask se calcula
mediante el operador AND bit a bit.

0 -- Read, Write and Execute


1 – Read and Write
2 – Read and Execute
3 – Read Only
4 –Write and Execute
5 –Write Only
6 –Execute Only
7 –No Permissions
Ahora, podemos hacer uso fácilmente de la tabla mencionada
anteriormente para calcular el permiso para los archivos. Por ejemplo,
si una umask se establece en 077 significa que el permiso generalmente
se calcula de la siguiente manera:

0 – Owner – Read, Write and Execute


7 – Group – No Permissions
7 – Others – No Permissions

Umask, por tanto establece un permiso de archivo predeterminado


para todos los archivos y directorios que cree por lo que para crear la
umask anterior deberemos realizar lo siguiente:
$ umask 077
$ mkdir folder1
$ touch testfile
$ ls –ld folder1 testfile

Salida:

drwx------ 2 demo demo 4096 2013-07-04 01:34 folder1


-rw------- 2 demo demo 0 2013-07-04 01:34 testfile

Hemos utilizado el commando touch para crear un archive vacío


Veremos lo que significan esa serie de letras que aparecen en las dos líneas anteriores.
El primer carácter de los archivos puede ser el siguiente:
Permiso Identifica
– Archivo
d Directorio
b Archivo de bloques especiales (Archivos especiales de dispositivo)
c Archivo de caracteres especiales (Dispositivo tty, impresora…)
l Archivo de vinculo o enlace (soft/symbolic link)
p Archivo especial de cauce (pipe o tubería)
Los siguientes nueve caracteres son los permisos que se les concede a
los usuarios del sistema. Cada tres caracteres, se referencian los
permisos de propietario, grupo y resto de usuarios.
Permiso Identifica
– Sin permiso
r Permiso de lectura
w Permiso de escritura
x Permiso de ejecución
El directorio /etc/profile.d
En este directorio se crean los parámetros individuales de inicialización
como pueden ser:
Utilizar los ficheros ~/.dircolors y /etc/dircolors para controlar el color
de los nombres de ficheros en un listado de directorio. Controla la
salida colorizada de cosas como ls --color. La explicación sobre cómo
inicializar estos ficheros se encuentra al final de este sección.
/etc/profile.d/extrapaths.sh para permitir acciones como lanzar
ejecutables del directorio actual sin especificar ./, ¡¡OJO!! esto se
considera un grave riesgo de seguridad.
/etc/bashrc
nos permiten configurar Bash cuando se inicia una Shell bash (Bourne-
again shell). Configuraciones como puede ser, crear alias de órdenes,
definición de funciones, opciones de la Shell como la configuración del
prompt, etc.
.bash profile
Los archivos BASH_PROFILE se ejecutan automáticamente para los
shells interactivos de inicio de sesión. En otras palabras, se ejecutan
después de que un usuario inicie sesión con sus credenciales de acceso,
o cuando se crea una nueva ventana de terminal. Esto difiere de los
archivos BASHRC, que se ejecutan sólo cuando los scripts del shell Bash
se ejecutan dentro de un terminal que ya está abierto.
Las librerías compartidas
Son archivos con código para hacer tareas internas de los programas y que dichas tareas
sean habituales en los programas, en vez de incluir ese código en cada archivo
ejecutable, estos se encuentran en estas librerías. Aporta algunas ventajas:
• Ahorran espacio al ser los ejecutables más pequeños. Si se mejoran las librerías se
mejora el funcionamiento de los programas que las usan, sin actualizarlos.
• Aisla los programas de los detalles de las tareas que realizan las librerías, por
ejemplo, se puede cambiar el tema de escritorio reconfigurando las librerías gráficas sin
necesidad de modificar los programas.
• Mejor uso de memoria, estas librerías se pueden compartir en memoria de tal manera
que si 2 programas usan una misma librería no se debe cargar en memoria 2 veces.
• La principal desventaja es un aumento en el tiempo de carga del ejecutable, ya que
se debe construir en memoria todo el código ejecutable en tiempo de ejecución y no en
tiempo de compilación.
Para ver que liberías usa un programa ejecutable, debemos usar el comando ldd:
El número en hexadecimal indica la posición de memoria que ocupa la librería dentro del espacio de
memoria virtual del proceso. Esta dirección de memoria ocupa 8 cifras hexadecimales en arquitecturas de
32 bits, y 16 cifras hexadecimales en arquitecturas de 64 bits.
Si falta una librería el programa no puede arrancar y emite un mensaje de error diciendo que librería
Falta.

De esta forma, si estamos en el entorno gráfico, y una aplicación no parece arrancar, podemos a arrancarla
desde un terminal para poder leer el mensaje de error.

Cuando falta una librería, probaremos a instalarla mediante el paquete que la contiene.
El formato de un comando
Los comandos tiene parámetros, algunos de ellos son opcionales, otros son
obligatorios, y otros son incompatibles entre si, es decir que no se puede
poner los 2 a la vez. Para especificar todos esto se suele usar una notación
universa, por ejemplo:
cmd pm1 [pm2] pm3 | pm4 [pm5 | pm6]
pm1: Opción obligatoria.
[pm2]: Entre [] indica que no siempre es obligatorio ponerlo, sólo si lo
necesitas para lo que quieres hacer.
pm3 | pm4: Uno de ellos es obligatorio, pero no se puede poner los 2 a la vez.
[pm4 | pm5]: Combinación de los 2 anteriores, puedes poner pm4 o pm5 o
no poner ninguno, pero no los dos
a la vez.
Los enlaces
En UNIX existe el concepto de enlace, un enlace es un fichero que es un
sobrenombre de otro fichero, que puede incluso estar ubicado en otro
directorio. No es el mismo concepto que acceso directo de Windows.
Un acceso directo es un fichero cuyo contenido es el nombre de otro
fichero, el acceso directo tiene una extensión .lnk. En UNIX un enlace
en un puntero a un archivo y que actúa de la misma forma que los
punteros en programación. Por tanto es una conexión entre un nombre
de archivo y los datos reales en el disco. Hay dos clases de enlaces:
Los enlaces en Unix son esencialmente los punteros que se asocian a
los archivos y directorios.
• ¿Qué son los enlaces duros?
Para entender lo que es un enlace duro, lo primero que tenemos que saber
es que en Linux cada fichero y cada carpeta del sistema operativo tienen
asignado un número entero llamado i-nodo.
Este i-nodo es único para cada uno de los archivos y cada una de las
carpetas. La información que almacena cada uno de los i-nodos de los
distintos archivos y carpetas es la siguiente:
• Los permisos del archivo o carpeta.
• El propietario del fichero y carpeta.
• La posición/ubicación del archivo o de la carpeta dentro de nuestro disco
duro.
• La fecha de creación del archivo o directorio.
• Etc…
• ¿Cómo veo los enlaces en Linux?
Para ver los enlaces simbólicos en un directorio:
Abrimos una terminal y vamos a ese directorio.
Escribimos el comando: ls -la. Esto incluirá una lista larga de todos los
archivos del directorio, incluso si están ocultos.
Los archivos que comienzan con l son sus archivos de enlace.
Recordar que podéis oir hablar de enlaces físicos o duros, ambos términos son lo
mismo.
Un enlace duro es un archivo que apunta al mismo contenido almacenado en
disco que el archivo original.
Por lo tanto los archivos originales y los enlaces duros dispondrán del mismo i-
nodo y consecuentemente ambos estarán apuntando hacia el mismo contenido
almacenado en el disco duro. Un enlace duro no es más que una forma de
identificar un contenido almacenado en el disco duro con un nombre distinto al
del archivo original.
Se podrá realizar un enlace duro de un archivo siempre y cuando el archivo esté
en la misma partición del disco duro que pretendemos crear el enlace. Esto es
forzosamente así porque cada partición de nuestro disco duro dispone de su
propia tabla de inodos, y se tiene que evitar la posibilidad de que un mismo
número de inodo esté apuntado a dos ubicaciones distintas de nuestro disco duro.
¿Cómo podemos crear un enlace duro?
Para comprender bien lo que es un enlace duro crearemos un archivo de por ejemplo con touch. Una vez creado el archivo vamos o consultar su
número de inodo ejecutando el siguiente comando en la terminal:
ls -li archivo.txt
El resultado obtenido en mi caso es el siguiente:
1341693 -rw-r--r-- 1 joan joan 0 nov 17 22:50 archivo.txt
Por lo tanto el inodo del archivo que acabamos de crear es el 1341693. También vemos que actualmente solo hay 1 archivo/entrada en el sistema que
esté apuntando al mismo inodo. Una vez creado el archivo crearemos un enlace duro hacia el archivo que acabamos de crear introduciendo el
siguiente comando en la terminal:
ln archivo.txt enlacearchivo  ln: Es el comando encargado de realizar enlaces entre ficheros. Archivo.txt: Es la ruta o nombre del archivo original
que tenemos en nuestro disco duro enlacearchivo: Corresponde a la ruta o nombre del enlace duro que vamos a crear.
Una vez ejecutado el comando se habrá realizado el enlace duro.
Una vez creado el enlace volveremos a comprobar el número de inodo del archivo original ejecutando de nuevo el siguiente comando en la terminal:
ls -li archivo.txt
Ahora el resultado obtenido es el siguiente: 1341693 -rw-r--r-- 2 joan joan 0 nov 17 22:50 archivo.txt
Como se puede ver el número de inodo sigue siendo el mismo que antes, pero ahora hay 2 archivos/entradas apuntando hacia el mismo inodo. Estos
2 archivos/entradas son el archivo original más el enlace duro que acabamos de crear.
Seguidamente comprobaremos el número de inodo del enlace duro que hemos creado ejecutando el siguiente comando en la terminal:
ls -li enlacearchivo
El resultado obtenido es: 1341693 -rw-r--r-- 2 joan joan 0 nov 17 22:50 enlacearchivo
Por lo tanto se puede observar que tanto el enlace duro como el archivo que hemos creado apuntan al mismo inodo, y consecuentemente apuntan
hacia la misma información almacenada en nuestro disco duro. Además tanto el enlace duro como el archivo original disponen de los mismos
permisos, del mismo propietario y forman parte del mismo grupo.
¿Qué es un enlace simbólico o blando?

Los enlaces simbólicos o blandos son parecidos a los accesos directos en Windows y son los
enlaces que todos los usuarios comunes acostumbran a usar de forma habitual.

Acabamos de ver que los enlaces duros apuntan a un archivo almacenado en nuestro disco
duro. En contraposición, tal y como se puede ver representado en la imagen, los enlaces
simbólicos apuntan al nombre de un archivo y posteriormente el archivo apunta a un
contenido almacenado en nuestro disco duro.

A diferencia del caso anterior, cada enlace simbólico dispone de su propio número de i-nodo y
es diferente al del archivo original. Por lo tanto podremos crear enlaces simbólicos de archivos
y de carpetas aunque estén en discos duros diferentes o en particiones diferentes.

Ejercicio: realizar un enlace simbólico con un archivo llamado simbólico.txt para ello
utilizaremos la opción –s siendo los pasos iguales al ejercicio anterior.
ELIMINAR ENLACES DUROS Y ENLACES SIMBÓLICOS

Si en algún momento precisamos eliminar alguno de los enlaces que hemos


creado lo podemos hacer de forma muy fácil. Así por ejemplo si queremos
eliminar el enlace simbólico que creamos anteriormente tan solo tenemos que
ejecutar el siguiente comando en la terminal:

unlink /home/juan/simbolico.txt

Donde:

unlink: Es la parte del comando encargada de eliminar el enlace.

/home/juan/simbolico.txt: Es la ruta y nombre del enlace a eliminar.


Nodo-i o i-nodo
Es una estructura de datos que contiene toda la información sobre un
fichero(Atributos, tamaño, bloques de disco que utiliza ...), estos nodos-i se
guardan en una tabla que hay en cada sistema de archivos y se identifican
por un número. Lo que se guarda en las entradas de directorio es:
Nombre de fichero  Numero nodo-i.
Así que dos entradas de ficheros que contengan el mismo número de nodo-
i es el mismo fichero. Para ver el número de nodo-i de un fichero.
# ls -i fichero o ficheros
# ls -i /etc/passwd
Creamos un enlace duro o blando:
# ln -s /etc/passwd ./passwd
# ln /etc/passwd ./passwd
Observa cono /etc/passwd y ./passwd.duro tienen el mismo nodo-i y observa la salida
de ls -l ./passwd.*: Observa que el atributo del tipo de archivo empieza por l en el caso
de enlace blando.
Las páginas man
En UNIX es habitual tener que consultar las paginas de ayuda de los comandos,
para ello en el directorio /usr/share/man se encuentra páginas de ayuda para
los comandos, sobre ficheros de configuración y para el API de programación.
Dentro de este directorio se encuentra las distintas secciones: man1, man2,
man3 .... también se encuentran un directorios que contienen las traducciones
de las paginas del inglés a sus respectivos idiomas: es, fr, it ..... Cada sección
contiene páginas que contienen ayuda sobre algún aspecto del sistema:
• man1: Ayuda sobre los comandos.
• man2 : Ayuda sobre las Llamadas al Sistema, esta ayuda es para
programadores.
• man3 : Ayuda sobre las funciones y tipos denidos en las librerías básicas y de
X-Windows.
• man4: Ayuda sobre algunos controladores del núcleo y del sistema gráfico.
• man5: Ayuda sobre cheros de conguracion.
• man6: Ayuda sobre los juegos que vienen con la distribucion de Linux.
• man7, man8, mann: Contiene ayuda para usuario avanzados.
• Para consultar una pagina:
# man [ -S seccion ] pagina
# man printf
# man -S 2 open
Si no especifico sección empieza a buscar por la primera sección, hasta
que lo encuentra, algunas paginas se encuentran en 2 secciones
diferentes, haciendo referencia a conceptos diferentes pero con el
mismo nombre. En ese caso debemos especificar la sección que
queremos ver como en el ultimo ejemplo.
FICHEROS DE DISPOSITIVOS
En UNIX los dispositivos se tratan como ficheros, esto quiere decir que cualquier
proceso que quiera usar un dispositivo como una cámara, tarjeta de TV o para
referirse a una partición o disco duro, hay un fichero que lo representa y por tanto lo
abre para acceder al dispositivo. A nivel interno también se produce en Windows,
pero el usuario no es consciente de ello.
El directorio /dev contiene los ficheros que representan a los dispositivos. Se
clasifican en dos grupos:
• De Bloque: El acceso a los datos de este dispositivo se puede ver como un conjunto
de bloques de información, es decir, no se escribe carácter a carácter si no por
bloques de información. Se puede acceder a cualquier bloque para leer o
modificarlo. Al hacer ls -l /dev, el aparece una b como atributo del archivo.
• De Caracteres: Se puede ver como una cola de datos donde cuando se lee un dato
se pasa al siguiente y el leído ya no se puede volver a leer, se puede ver como un
flujo de bytes. Lo mismo pasa con la escritura. Al hacer ls -l /dev, el aparece una c
como atributo del archivo.
Los principales dispositivos son,
• /dev/sda, /dev/sdb, ..: Representan los discos duros SATA, SAS o SCSI
• /dev/sda: Primer disco duro SATA/SCSI/SAS.
• /dev/sdb: Segundo disco duro SATA/SCSI/SAS.
• /dev/sdc: Tercer disco SATA/SCSI/SAS.

• /dev/hda, /dev/hdb, ..: Representan los discos duros IDE.


• /dev/hda: Primer disco duro IDE.
• /dev/hdb: Segundo disco duro IDE.
• /dev/hdc: Tercer disco.

• /dev/vda, /dev/vdb, ..: Representan los discos duros conectados a una controladora
Virtio. (Para crear disco virtuales, en los apuntes tendréis información más detallada)
• /dev/vda: Primer disco duro virtio.
• /dev/vdb: Segundo disco duro virtio.
• /dev/vdc: Tercer disco virtio.
/dev/sdan: Donde la n representa un número que indica la n-esima partición de /dev/sda.
• /dev/sda1: Primera partición de /dev/sda
/dev/nvidian: la n representa un número que indica la enésima GPU nvidia encontrada.
/dev/ttyn: Representa la n-esima consola virtual.
/dev/ttySn: Representa el n-esimo puerto serie.
/dev/pts/n: Representa el n-esimo terminal virtual.
/dev/srn: Representa la n-esima unidad de CDRW o DVDRW.
/dev/snd/: Es un directorio donde hay dispositivos para controlar el hardware de audio.
/dev/dri/: Es un directorio donde hay dispositivos para controlar los adaptadores gráficos y la aceleración 3D
por medio del núcleo, cuando se instalan los drivers propietarios de NVidia ya no se usan y se utiliza
/dev/nvidian.
/dev/videon: Representa la n-esima cámara de vídeo conectada al equipo.
/dev/dvb/: Similar a /dev/snd/ para capturadoras de vídeo como las sintonizadoras de TV TDT.
/dev/cdrom y /dev/cdrw: En realidad es un enlace a /dev/srn por defecto.
Sustituciones Shell

En la línea de comandos y en los scripts se pueden usar sustituciones,


estas son cadenas que equivalen a otras cadenas. Es algo así como
escribir Saludo Pedro. Y la cadena Saludo equivaliera a decir Hola o
Hello dependiendo de la configuración del sistema. De esta forma:
• Evitar escribir largas cadenas de texto sustituyéndolas por cadenas
más cortas, esto se hace sobretodo en línea de comandos.
• Hacer tareas repetitivas, en las que cambia una pequeña parte de una
a otra, esta pequeña parte se puede meter en una variable y que esta
cambie de valor de una vez a otra. Esto se suele hace en los scripts.
Las variables
Las variables son la forma más simple se sustitución, una variable es
una cadena que contiene letras y (subrayado), y que pueden terminar
en número. Esta cadena se le puede asignar un valor, antes de asignar
valor, esta tiene valor de cadena vacía, para referirse al valor de una
variable se puede hacer de dos maneras:
• $Variable: la forma más sencilla, en ocasiones puede confundir al
shell si después van otros caracteres, que hagan confundir el nombre
de la variable como letras o números.
• ${Variable}: de esta forma nunca habrá confusión, forma
recomendada.
EJEMPLO

• $ echo ${SALUDO}
• No imprime nada porque SALUDO está vacío.
• $ SALUDO="Hola mundo."
• $ echo "La variable SALUDO vale ${SALUDO}"
• La variable SALUDO vale Hola mundo
Algunas variables están predefinidas al iniciar sesión.
• $HOME: Contiene el directorio HOME del usuario.
• $USER: Contiene el nombre o login del usuario.
• $PWD: Contiene el directorio actual o de trabajo.
• $LANG: Contiene el idioma que se está usando por los procesos.
• $SHELL: Contiene la ruta al fichero del ejecutable del shell.
• $1 $2 $3 ...: Se usan en shell scripts y representan el primer, segundo, tercer, y así sucesivamente, parámetro
que se le pasa a un shell script.
• $*: Representa a todos los parámetros de un shell script.
• $$: Equivale al pid(Identicador del proceso) del shell.

Se distingue entre mayúsculas y minúsculas. Las variables se pueden usar en cadenas con o sin comillas
dobles, en cadenas con comillas simples, no tiene efecto la sustitución .

• $ echo '${SALUDO}'
• ${SALUDO}
• $ echo "${SALUDO}"
• Hola mundo.
Salida de comando
La salida de un comando también se puede utilizar como si fuera una variable, para
obtener dicha salida como una cadena de texto cualquiera, y usarla en la línea de
comandos se debe colocar $(comando).
Por ejemplo el comando cut extrae campos de una línea de texto y los muestra por la
salida standard:
$ echo “Juan:Molina:Martínez" | cut -d: -f2
*******

$ echo " Juan:Molina:Martínez" | cut -d: -f1


*******
Si ejecuto el siguiente comando:
$ NOMBRE=$(echo " Juan:Molina:Martínez " | cut -d: -f1)
La variable NOMBRE tendría como valor *******
Los comodines
Los comodines es una forma de referirnos a un listado de ficheros, por su nombre y
ubicación y sin tener que escribir el listado completo. Ejemplo:
• /usr/share/d*: todos los archivos y directorios de /usr/share/ que empiecen por ``d''
• /usr/share/d*c: todos archivo y directorio de /usr/share/ que empiece por ``d'' y
termine por ``c''.
• /usr/*/b*: todos los archivos y directorios que empiecen por ``b'' y estén en algún
directorio ubicado dentro de /usr.
Se debe tener en cuenta que cada fichero aparece como si fuera una cadena distinta y que si
la lista fuera vacía porque no hay un fichero se pone el propio comodín como se ve en los
ejemplos:
• $ echo ./b*: equivale a $ echo ./boo ./bae ./beep que son los ficheros que empiezan por
b.
• $ echo ./bi*: equivale a $ echo './bi*' porque no hay ningún fichero que empiece por bi
Ejecutando comandos como root
Un usuario puede ejecutar comandos como Administrador sin tener que iniciar sesión como usuario root:
Mediante el comando su
Permite a un usuario A ejecutar un comando como otro usuario B, siempre y cuando conozca la contraseña de
B, por ejemplo, el usuario juan:
$ su pedro -c 'ls -l /home/juan'
También puedo convertirme en pedro:
$ su - pedro
O en root:
$ su - root
El único requisito es conocer la contraseña del usuario destino y que para salir debes ejecutar el comando éxit.
La otra manera es usando sudo comando , este comando me permite ejecutar como usuario root otros
comandos. sudo es interesante:
- Permite seleccionar que usuarios pueden usar sudo sin necesidad de que estos sepan la contraseña
de root.
- Permite seleccionar que comandos puede ejecutar un usuario o un grupo, por ejemplo que el grupo
alumnos pueda instalar paquetes mediante el comando yum.
$ sudo yum install qemu-kvm-ev
Este último método es el usado por Ubuntu, ya que este esta distribución no permite entrar como root. Red
Hat Enterprise Linux y sus derivadas, admiten las dos formas.

También podría gustarte