Conceptos de Unix
Conceptos de Unix
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
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 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.
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:
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
• /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.
Salida:
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
unlink /home/juan/simbolico.txt
Donde:
• /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
• $ 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
*******