NDG Linux Essentials 0322 cga part 2

El Hardware

Una de las muchas ventajas de tener tantas distribuciones distintas de Linux es que algunos de ellas están diseñados para funcionar en plataformas de hardware específicas. De hecho, hay una distribución de Linux diseñada para casi todas las plataformas de hardware modernas.

Cada una de estas plataformas de hardware tiene una gran cantidad de variedad en los componentes de hardware que están disponibles. Además de diferentes tipos de unidades de disco duros, hay muchos diferentes monitores e impresoras. Con la popularidad de los dispositivos USB, tales como dispositivos de almacenamiento USB, cámaras y teléfonos celulares, el número de dispositivos disponibles llega a calcularse en miles.

En algunos casos, esto plantea problemas, ya que estos dispositivos típicamente necesitan algún tipo de software (llamados controladores («drivers» en inglés) o módulos) que les permite comunicarse con el sistema operativo instalado. Los fabricantes de hardware a menudo proporcionan este software, pero típicamente para Microsoft Windows, no para Linux. La mascota de Linux, Tux, sin embargo está empezando a aparecer más a menudo en los productos de hardware, indicando el soporte de Linux.

Además del apoyo de los proveedores, hay una gran cantidad de apoyo de la comunidad que se esfuerza por proporcionar controladores para los sistemas Linux. Aunque no todo el hardware tiene los controladores necesarios, hay una buena cantidad que sí los tiene, lo que supone un reto para los usuarios y administradores Linux para encontrar los controladores correctos o elegir el hardware que tiene cierto nivel de soporte en Linux.

A continuación aprenderás acerca de los dispositivos de core hardware, incluyendo la manera de utilizar los comandos de Linux para mostrar la información vital de hardware del dispositivo.

Los Procesadores

La Unidad Central de Procesamiento (CPU, «Central Processing Unit» en inglés o procesador) es uno de los componentes más importantes de hardware en una computadora. Realiza la toma de decisiones, así como los cálculos que deben realizarse para ejecutar correctamente un sistema operativo. El procesador es esencialmente un chip de computadora.

El procesador está conectado con otro hardware a través de una placa base (o «motherboard» en inglés), también conocida como la placa del sistema. Las placas base están diseñadas para funcionar con determinados tipos de procesadores.

Si un sistema tiene más de un procesador, el sistema se denomina multiprocesador. Si se combina más de un procesador en un único chip del procesador, entonces se llama multi-core (o «multi-núcleo» en español).

Aunque el apoyo está disponible para más tipos de procesadores en Linux que en cualquier otro sistema operativo, principalmente hay dos tipos de procesadores utilizados en las computadoras de escritorio y en los servidores: x86 y x86_64. En un x86, el sistema procesa los datos de 32 bits a la vez; en un x86_64 el sistema procesa datos de 64 bits a la vez. Un sistema x86_64 también es capaz de procesar los datos de 32 bits a la vez en un modo compatible con las versiones anteriores. Una de las ventajas principales de un sistema de 64 bits es que el sistema es capaz de trabajar con más memoria.

La familia de procesadores de x86 fue creada por Intel en 1978 con el lanzamiento del procesador 8086. Desde entonces, Intel ha producido muchos otros procesadores que son las mejoras del 8086 original; se conocen genéricamente como los procesadores x86. Estos procesadores incluyen el 80386 (también conocido como el i386), 80486 (i486), Pentium (i586) y la serie del Pentium Pro (i686). Además de Intel, hay otras empresas como AMD y Cyrix que también han producido procesadores compatibles con los x86. Si bien Linux es capaz de soportar procesadores de la generación del i386, muchas distribuciones limitan su soporte al i686 o posteriores.

La familia de los procesadores x86_64, incluyendo los procesadores de 64 bits de Intel y AMD, ha estado en la producción desde alrededor del año 2000. Como resultado, la mayoría de los procesadores modernos construidos hoy en día son de x86_64. Mientras que el hardware ha estado disponible por más de una década hasta ahora, el software de soporte para esta familia de procesadores se ha estado desarrollando mucho más lento. Incluso en el 2013 ya había muchos paquetes de software que estaban disponibles para la arquitectura x86, pero no para x86_64.

Puedes ver a qué familia pertenece tu CPU usando el comando arch:

sysadmin@localhost:~$ arch                                                    
x86_64                                                                        
sysadmin@localhost:~$

Otro comando que puedes utilizar para identificar el tipo de CPU en el sistema es el comando lscpu:

sysadmin@localhost:~$  lscpu                                                  
Architecture:          x86_64                                              
CPU op-mode(s):        32-bit, 64-bit                                       
Byte Order:            Little Endian                                          
CPU(s):                4                                                      
On-line CPU(s) list:   0-3                                                    
Thread(s) per core:    1                                                      
Core(s) per socket:    4                                                      
Socket(s):             1                                                      
NUMA node(s):          1                                                      
Vendor ID:             GenuineIntel                                           
CPU family:            6                                                      
Model:                 44                                                     
Stepping:              2                                                      
CPU MHz:               2394.000                                               
BogoMIPS:              4788.00                                              
Virtualization:        VT-x                                                   
Hypervisor vendor:     VMware                                                 
Virtualization type:   full                                                   
L1d cache:             32K                  
L1i cache:             32K                                                    
L2 cache:              256K                                                   
L3 cache:              12288K                                                 
NUMA node0 CPU(s):     0-3                                                    
sysadmin@localhost:~$ 

La primera línea de esta salida muestra que se está utilizando la CPU en modo de 32 bits, ya que la arquitectura reportada es x86_64. La segunda línea de la salida muestra que la CPU es capaz de operar en modo ya sea de 32 o 64 bits, por lo tanto realmente es un CPU de 64 bits.

La manera más detallada de obtener la información acerca de tu CPU es visualizando el archivo /proc/cpuinfo con el comando cat:

sysadmin@localhost:~$ cat /proc/cpuinfo                                       
processor       : 0                                                           
vendor_id       : GenuineIntel                                                
cpu family      : 6                                                           
model           : 44                                                          
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz             
stepping        : 2                                                           
microcode       : 0x15                                                        
cpu MHz         : 2394.000                                                    
cache size      : 12288 KB                                                    
physical id     : 0                                                           
siblings        : 4                                                           
core id         : 0                                                           
cpu cores       : 4                                                           
apicid          : 0                                                           
initial apicid  : 0                                                           
fpu             : yes                                                         
fpu_exception   : yes                                                         
cpuid level     : 11                                                          
wp              : yes                                                         
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_ts
arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pcl mulqdq vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor lahf_lm ida arat dtherm tpr_shadow vnmi ept vpid

Mientras que la gran parte de la salida del comando lscpu y del contenido del archivo /proc/cpuinfo parece ser la misma, una de las ventajas de visualizar el archivo /proc/cpuinfo es que aparecen flags (o «indicadores» en español) de la CPU. Los flags de una CPU son un componentes muy importantes, ya que señalan qué características soporta la CPU y las capacidades de la CPU.

Por ejemplo, la salida del ejemplo anterior contiene el flag lm (long mode, o «modo largo» en español), indicando que esta CPU es de 64-bit. También hay flags que indican si la CPU es capaz de soportar máquinas virtuales (la capacidad de tener varios sistemas operativos en un único equipo).

Tarjetas Madre y los Buses

La tarjeta madre o «motherboard» en inglés, es el tablero principal del hardware en la computadora a través de la cuál se conectan la CPU, la Memoria de Acceso Aleatorio (RAM) y otros componentes. Algunos dispositivos se conectan directamente a la tarjeta madre, mientras que otros dispositivos se conectan a la tarjeta madre mediante un bus.

dmidecode

La tarjeta madre de muchas computadoras contiene lo que se conoce como Basic Input and Output System (BIOS) (o «BIOS de Administración del Sistema» en español). System Management BIOS (SMBIOS) (o «El Sistema de Gestión o Administración de BIOS» en español) es el estándar que define las estructuras de datos y cómo se comunica la información acerca del hardware de la computadora. El comando dmidecode es capaz de leer y mostrar la información del SMBIOS.

Un administrador puede utilizar el comando dmidecode para ver los dispositivos conectados directamente a la tarjeta madre. Hay una gran cantidad de información proporcionada por la salida de este comando. Los ejemplos siguientes te proporcionan algunas ideas de lo que se puede saber de la salida del comando dmidecode.

En el primer ejemplo, se puede ver que el BIOS soporta el arranque directamente desde el CD-ROM. Esto es importante ya que los sistemas operativos a menudo se instalan arrancando directamente desde el CD de instalación:

# dmidecode 2.11
SMBIOS 2.4 present.
364 structures occupying 16040 bytes.
Table at 0x000E0010

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
	Vendor: Phoenix Technologies LTD
	Version: 6.00
	Release Date: 06/22/2012
	Address: 0xEA0C0
	Runtime Size: 89920 bytes
	ROM Size: 64 kB
	Characteristics: 
		ISA is supported
		PCI is supported
		PC Card (PCMCIA) is supported
		PNP is supported
		APM is supported
		BIOS is upgradeable
		BIOS shadowing is allowed
		ESCD support is available
		Boot from CD is supported
--More--

En el siguiente ejemplo puedes ver que un total de 2048 (aproximadamente 2GB) de RAM está instalado en el sistema:

Socket Designation: RAM socket #0
Bank Connections: None
Current Speed: Unknown
Type: EDO DIMM
Installed Size: 2048 MB (Single-bank Connection)
Enabled Size: 2048 MB (Single-bank Connection)
Error Status: OK

Memoria de Acceso Aleatorio (RAM)

La tarjeta madre normalmente tiene ranuras donde la Memoria de Acceso Aleatorio (RAM o «Random Access Memory» en inglés) puede conectarse al sistema. Los sistemas de arquitectura de 32 bits pueden utilizar hasta 4 gigabytes (GB) de RAM, mientras que las arquitecturas de 64 bits son capaces de abordar y usar mucha más RAM.

En algunos casos, la RAM que tiene tu sistema podría no ser suficiente para manejar todos los requisitos del sistema operativo. Cada programa necesita almacenar datos en la RAM y los programas mismos se cargan en la RAM cuando se ejecutan.

Para evitar que el sistema falle por falta de RAM, se utiliza una RAM virtual (o espacio de intercambio «swap space» en inglés). La RAM virtual es un espacio en el disco duro que se utiliza para almacenar temporalmente los datos de RAM cuando el sistema se está quedando sin la RAM. Los datos que se almacenan en la RAM y que no se han utilizado recientemente se copian al disco duro los programas utilizados recientemente puedan utilizar la RAM. Si es necesario, los datos intercambiados pueden almacenarse en la RAM en un momento posterior.

Para ver la cantidad de la RAM en tu sistema, incluyendo la RAM virtual, ejecuta el comando free. El comando free tiene la opción -m para forzar la salida a ser redondeada al megabyte más cercano y una opción -g para forzar la salida a ser redondeada al gigabyte más cercano:

sysadmin@localhost:~$ free -m                                                
             total        used       free     shared     buffers     cached     
Mem:          1894        356       1537          0          25       177     
-/+ buffers/cache:        153        1741                                      
Swap:         4063          0       4063                                      
sysadmin@localhost:~$

La salida al ejecutar este comando free muestra que el sistema fue ejecutado en un sistema que tiene un total de 1.894 megabytes y está utilizando actualmente 356 megabytes.

La cantidad de swap aparece ser aproximadamente 4 gigabytes, aunque nada de esto parece estar en uso. Esto tiene sentido porque la gran parte de la RAM física está libre, así que en este momento no se necesita utilizar la RAM virtual.

Los Dispositivos Periféricos

La tarjeta madre tiene buses que permiten conectar múltiples dispositivos al sistema, incluyendo la Interconexión de los Componentes Periféricos (PCI) y Bus Serie Universal (USB). La tarjeta madre tiene también conectores para monitores, teclados y ratones.

Para ver todos los dispositivos conectados por un bus PCI ejecuta el comando lspci. El siguiente ejemplo muestra una salida de este comando. Como se puede ver a continuación en las secciones destacadas, este sistema tiene un controlador VGA (conector de un monitor), un controlador de almacenamiento SCSI (un tipo de disco duro) y un controlador de Ethernet (un conector de red): Los gráficos a continuación ofrecen ejemplos de uso del comando lspci.

sysadmin@localhost:~$ lspci                                                   
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)                                                                      
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)                                                                        
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)        
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)     
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)           
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)                                                                           
00:0f.0 VGA compatible controller: VMware SVGA II Adapter     
03:00.0 Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02
0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)

Ejecutar el comando lspci con la opción -nn muestra un identificador numérico para cada dispositivo, así como la descripción del texto original:

sysadmin@localhost:~$ lspci -nn                                             
00:00.0 Host bridge [0600]: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge [8086:7190] (rev 01)                                               
00:01.0 PCI bridge [0604]: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge [8086:7191] (rev 01)                                                 
00:07.0 ISA bridge [0601]: Intel Corporation 82371AB/EB/MB PIIX4 ISA [8086:7110](rev 08)                                                                 
00:07.1 IDE interface [0101]: Intel Corporation 82371AB/EB/MB PIIX4 IDE [8086:7111] (rev 01)                                                             
00:07.3 Bridge [0680]: Intel Corporation 82371AB/EB/MB PIIX4 ACPI [8086:7113](rev 08)                                                                   
00:07.7 System peripheral [0880]: VMware Virtual Machine Communication Interface [15ad:0740] (rev 10)                                                    
00:0f.0 VGA compatible controller [0300]: VMware SVGA II Adapter [15ad:0405]
03:00.0 Serial Attached SCSI controller [0107]: VMware PVSCSI SCSI Controller
[15ad:07c0] (rev 02)                                                        
0b:00.0 Ethernet controller [0200]: VMware VMXNET3 Ethernet Controller 
[15ad:07b0] (rev 01)

La selección resaltada, [15ad:07b0], se refiere a la sección [vendor:device] (o «vendedor:dispositivo» en español).

Utilizar la información [vendor:device] puede ser útil para mostrar la información detallada acerca de un dispositivo específico. Utilizar al la opción -d vendor:device, puedes seleccionar ver la información sobre un sólo dispositivo.

También puedes ver información más detallada mediante cualquiera de las dos opciones, la -v,-vv o la -vvv. Cuántos más caracteres v, más detallada será la salida. Por ejemplo:

sysadmin@localhost:~$ lspci -d 15ad:07b0 -vvv                                
0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)    
        Subsystem: VMware VMXNET3 Ethernet Controller                       
        Physical Slot: 192                                                   
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Step
ping- SERR- FastB2B- DisINTx+                                                   
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- 
<MAbort- >SERR- <PERR- INTx-                                                    
        Latency: 0, Cache Line Size: 32 bytes                                   
        Interrupt: pin A routed to IRQ 19                                       
        Region 0: Memory at fd4fb000 (32-bit, non-prefetchable) [size=4K]       
        Region 1: Memory at fd4fc000 (32-bit, non-prefetchable) [size=4K]       
        Region 2: Memory at fd4fe000 (32-bit, non-prefetchable) [size=8K]       
        Region 3: I/O ports at 5000 [size=16]                                   
        [virtual] Expansion ROM at fd400000 [disabled] [size=64K]               
        Capabilities: <access denied>                                           
        Kernel driver in use: vmxnet3     
        Kernel modules: vmxnet3
sysadmin@localhost:~$

El comando lspci muestra información detallada sobre los dispositivos conectados al sistema a través del bus PCI. Esta información puede ser útil para determinar si el dispositivo es compatible con el sistema, tal como se indica por un Kernel driver o un Kernel module en uso, como se muestra en el último par de líneas de la salida anterior.

Los Dispositivos de Bus Serie Universal (USB)

Mientras que el bus PCI se utiliza para muchos dispositivos internos tales como las tarjetas de sonido y red, muchos dispositivos externos (o periféricos) están conectados a la computadora vía USB. Los dispositivos conectados internamente son generalmente de cold-plug (o «conectables en frío» en español), lo que significa que el sistema debe ser apagado para conectar o desconectar un dispositivo. Los dispositivos USB son hot-plug (o «conectables en caliente» en español), lo que significa se conectan o desconectan mientras el sistema está funcionando.Nota: Los gráficos a continuación ofrecen ejemplos de uso del comando lsusb.

Para mostrar los dispositivos conectados al sistema vía USB, ejecuta el comando lsusb:

sysadmin@localhost:~$ lsusb
Bus 001 Device 001: ID 1d6b:0001  Linux Foundation 1.1 root hub
sysadmin@localhost:~$

La opción detallada, -v, del comando lsusb muestra una gran cantidad de detalles acerca de cada dispositivo:

sysadmin@localhost:~$ lsusb -v

Bus 001 Device 001: ID 1d6b:0001  Linux Foundation 1.1 root hub
Couldn’t open device, some information will be missing 
Device Descriptor:
        bLength		       18
	bDescriptorType	 	1
	bcdUSB		     1.10
	bDeviceClass		9 Hub
	bDeviceSubClass		0 Unused
	bDeviceProtocol		0 Full speed (or root) hub
	bMaxPacketSize0	       64
	idVendor	   0x1d6b Linux Foundation
	idProduct	   0x0001 1.1 Linux Foundation
	bcDevice	     2.06
	iManufacturer		3
	iProduct		2
	iSerial			1
	…

La Capa de Abstracción de Hardware

HAL o «Hardware Abstraction Layer» en inglés, es la Capa de Abstracción de Hardware. El demonio o programa vigilante (o «daemon» en inglés) de la HAL es hald, un proceso que recoge información sobre todos los dispositivos conectados al sistema. Cuando se producen eventos que cambian el estado de los dispositivos conectados, tales como un dispositivo USB es conectado al sistema, el hald emite esta nueva información a los procesos que se hayan registrado para ser notificados sobre nuevos eventos.Nota: El gráfico siguiente proporciona un ejemplo de uso del comando lshal.

El comando lshal te permite ver los dispositivos detectados por HAL. Este comando produce una gran cantidad de salidas; a continuación se ofrece una pequeña muestra.

Los Dispositivos de Disco

Los Dispositivos de Disco (también conocidos como discos duros) se pueden conectar al sistema de varias maneras; el controlador puede integrarse a la tarjeta madre, a una tarjeta PCI (Interconexión de Componente Periférico) o a un dispositivo USB.

Los discos duros se dividen en particiones. Una partición es una división lógica de un disco duro, diseñada para tomar una gran cantidad de espacio de almacenamiento disponible y dividirlo en «trozos» más pequeños. Si bien en Microsoft Windows es común tener una única partición para cada disco duro, en las distribuciones de Linux lo común es tener varias particiones por disco duro.

Algunos discos duros hacen uso de una partición llamada Registro de Arranque Maestro (MBR o «Master Boot Record» en inglés), mientras que otros hacen uso de un tipo de partición llamada Tabla de Particiones GUID (GPT o «GUID Partitioning Table» en inglés). El tipo MBR de la partición se ha utilizado desde los días tempranos de la computadora personal (PC o Personal Computer) y el tipo GPT ha estado disponible desde el año 2000.

Un viejo término usado para describir un disco duro interno es «disco fijo», ya que el disco es fijo (no extraíble). Este término dio lugar a varios nombres de comando: los comandos fdisk, cfdisk y sfdisk son herramientas para trabajar con las particiones discos MBR.

Los discos GPT usan un tipo de particionado más nuevo, que permite al usuario dividir el disco en más particiones de lo que soporta una MBR. La GPT también permite tener particiones que pueden ser más grandes que dos terabytes (MBR no lo permite). Las herramientas para gestionar los discos GPT se llaman de manera similar a las contrapartes de fdisk: gdisk, cgdisk y sgdisk.

También existe una familia de herramientas que intenta apoyar ambos tipos de disco MBR y GPT. Este conjunto de herramientas incluye al comando parted y la herramienta gráfica gparted.

Las unidades de disco duro están asociadas a los nombres de archivos (llamados archivos de dispositivo) que se almacenan en el directorio /dev. Diferentes tipos de unidades de disco duros reciben nombres ligeramente diferentes: hd para los discos duros IDE (Intelligent Drive Electronics o «Unidad Electrónica Inteligente» en español) y sd para USB, SATA (Serial Advanced Technology Attachment o «Aditamento de Tecnología Serial Avanzada» en español) y los discos duros SCSI (Small Computer System Interface o «Interfaz Estándar de Equipos Pequeños» en español).

A cada disco se le asigna una letra, por ejemplo, el primer disco duro IDE tendría un nombre de archivo de dispositivo /dev/hda y el segundo disco duro IDE se asociaría al archivo de dispositivo /dev/hdb.

Las particiones reciben números únicos para cada dispositivo. Por ejemplo, si un disco duro USB tenía dos particiones, éstas pueden asociarse a los archivos de dispositivo /dev/sda1 y /dev/sda2.

En la salida siguiente puedes ver que este sistema tiene tres dispositivos sd: /dev/sda, /dev/sdb y /dev/sdc. También puedes ver que hay dos particiones en el primer dispositivo (como lo demuestran los archivos /dev/sda1 y /dev/sda2) y una partición en el segundo dispositivo (según lo visualiza el archivo /dev/sdb1):

root@localhost:~$  ls /dev/sd*                                               
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdc              
root@localhost:~$

En el ejemplo siguiente se utiliza el comando fdisk para mostrar la información de la partición en el primer dispositivo de sd.

Nota: El siguiente comando requiere acceso root

root@localhost:~# fdisk -l /dev/sda                                             
Disk /dev/sda: 21.5 GB, 21474836480 bytes                                       
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors             
Units = sectors of 1 * 512 = 512 bytes                                          
Sector size (logical/physical): 512 bytes / 512 bytes                           
I/O size (minimum/optimal): 512 bytes / 512 bytes                               
Disk identifier: 0x000571a2                                                     
                                                                                
   Device Boot      Start         End      Blocks   Id  System                  
/dev/sda1   *        2048    39845887    19921920   83  Linux                   
/dev/sda2        39847934    41940991     1046529    5  Extended                
/dev/sda5        39847936    41940991     1046528   82  Linux swap / Solaris    
root@localhost:~#

Los Discos Ópticos

Los discos ópticos, referidos a menudo como CD-ROM, DVD o Blue-Ray son medios de almacenamiento extraíbles. Mientras que algunos dispositivos usados con discos ópticos son de sólo lectura, otros pueden ser grabados (escritos), cuando se utiliza un tipo de disco grabable. Hay varios estándares para los discos grabables y regrabables, como CD-R, CD+R, DVD+RW y DVD-RW.

La ubicación de estos discos extraíbles en el sistema de archivos es una consideración importante para un administrador de Linux. Las distribuciones modernas a menudo montan los discos bajo la carpeta /media, mientras que las distribuciones antiguas suelen montarlos en la carpeta /mnt.

Al insertar los discos, la mayoría de las interfaces GUI piden al usuario que tome una acción, así como abrir el contenido del disco en un explorador de archivos o iniciar un programa de multimedia. Cuando el usuario termina de usar el disco, conviene expulsarlo mediante el menú o con el comando eject (o «expulsar» en español). Mientras que presionar el botón de expulsar se abrirá la bandeja de disco, algunos programas no se darán cuenta que el disco ya no está en el sistema de archivos.

Dispositivos de Visualización de Video

Para visualizar un video (salida al monitor) la computadora debe tener un dispositivo de visualización de vídeo (también conocido como la tarjeta de video) y un monitor. Los dispositivos de visualización de video a menudo vienen unidos directamente a la tarjeta madre, aunque también pueden ser conectados a través de las ranuras de bus PCI en la tarjeta madre.

Lamentablemente, desde los primeros días de la PC, los principales proveedores no han aprobado estándares de video, por lo que cada dispositivo de visualización de video generalmente requiere un controlador propietario suministrado por el proveedor. Los drivers o controladores son programas de software que permiten al sistema operativo comunicarse con el dispositivo.

Los drivers deben estar escritos para el sistema operativo específico, algo que se hace comúnmente para Microsoft Windows, pero no siempre para Linux. Afortunadamente, los tres proveedores de visualización de video más grande ahora proporcionan al menos cierto nivel de soporte para Linux.

Hay dos tipos de cables de vídeo de uso general: el cable analógico de 15 pines Video Graphics Array (VGA) y el de 29 pines Digital Visual Interface (DVI).

Para que los monitores trabajen correctamente con las tarjetas de video, deben ser capaces de soportar la misma resolución que la tarjeta de video. Normalmente, el software de la tarjeta de video (comúnmente el servidor X.org) normalmente será capaz de detectar automáticamente la máxima resolución que la tarjeta de vídeo y el monitor pueden soportar y establecer la resolución de pantalla a ese valor.

Las herramientas gráficas normalmente sirven para cambiar tu resolución, así como el número máximo de colores que se pueden mostrar (conocido como la profundidad de color) con tu distribución de Linux. Para las distribuciones que utilizan el servidor X.org, se puede utilizar el archivo /etc/X11/xorg.conf para cambiar la resolución, profundidad de color y otros ajustes.

Gestionar los Dispositivos

Para poder utilizar un dispositivo en Linux puede haber varios tipos de software que se requieren. El primero es el software de driver. El driver puede compilarse como parte del kernel de Linux, cargado al kernel como un módulo o cargado por un comando de usuario o una aplicación. La mayoría de los dispositivos tienen el driver incorporado en el kernel o lo tienen cargado al kernel, ya que el driver puede requerir una clase de acceso de nivel bajo que tiene el kernel con los dispositivos.

Los dispositivos externos, como las impresoras y los escáneres normalmente tienen sus drivers cargados por una aplicación y estos drivers a su vez se comunican a través del dispositivo vía el kernel por una interfaz como USB.

Para activar los dispositivos en Linux con éxito, es mejor consultar la distribución de Linux para ver si el dispositivo está certificado para trabajar con esa distribución. Las distribuciones comerciales como Red Hat y SUSE tienen páginas web con una lista de hardware certificado o aprobado para trabajar con su software.

Consejos adicionales para conectar tus dispositivos de manera exitosa: evitar dispositivos nuevos o altamente especializados y consultar con el proveedor del dispositivo para ver si soportan Linux antes de hacer cualquier compra.

Fuentes de Poder

Las fuentes de poder son los dispositivos que convierten la corriente alterna (120v, 240v) a corriente directa la cual la computadora utiliza en varios voltajes (3.3v, 5v, 12v, etc.). Las fuentes de poder generalmente no son programables, sin embargo su funcionamiento tiene un impacto importante en el resto del sistema.

Aunque no son supresores de picos, estos dispositivos a menudo protegen la computadora de las fluctuaciones en el voltaje que provienen del origen. Es aconsejable que el administrador de red elija una fuente de poder basada en la calidad más que en el precio, ya que una falla de la fuente de poder puede resultar en la destrucción de la computadora.

Administración de Paquetes

Administración de Paquetes es un sistema que instala, actualiza, consulta o elimina software dentro de un sistema de archivos. En Linux hay muchos sistemas de administración de paquetes de software diferentes, pero los dos más populares son Debian y Red Hat.

Administración de Paquetes Debian

La distribución Debian y sus derivados como Ubuntu y Mint utilizan el sistema de gestión de paquetes Debian. En el centro de administración de paquetes de distribuciones derivadas de Debian están los paquetes de software que se distribuyen como archivos con terminación «.deb».

La herramienta de nivel más bajo para administrar estos archivos es el comando dpkg. Este comando puede ser complicado para los usuarios de Linux principiantes, por lo que una herramienta de paquetes avanzada, apt-get, un programa front-end para la herramienta dpkg, facilita más la administración de los paquetes. Existen otras herramientas de la línea de comandos que sirven como front-end de dpkg, tales como aptitude, así como front-ends de GUI como synaptic y software-center

Debian – Agregando paquetes

Los repositorios de Debian contienen más de 65,000 diferentes paquetes de software. Para obtener una lista actualizada de estos repositorios de Internet, puedes ejecutar el comando de sudo apt-get update.

Para buscar palabras clave dentro de estos paquetes, puedes utilizar el comando sudo apt-cache search keyword.

Cuando hayas encontrado el paquete que quieres instalar, puedes instalarlo con el comando sudo apt-get install package.Importante: Para ejecutar estos comandos tu sistema necesitará acceso a Internet. El comando apt-cache busca repositorios de estos programas de software en Internet.

Debian – Actualización de Paquetes

Si quieres actualizar un paquete individual vas a utilizar un comando que instala tal paquete: sudo apt-get install package.

Si ya tienes instalada una versión anterior del paquete, entonces se actualizará. De lo contrario se ejecuta una nueva instalación.

Si quieres actualizar todos los paquetes posibles, tienes que ejecutar el comando sudo apt-get upgrade.

Los usuarios que inicien sesión con una interfaz gráfica pueden ver en el área de las notificaciones un mensaje del update-manager («administrador de actualizaciones» en español) que indica que las actualizaciones están disponibles.

Debian – Eliminación de Paquetes

Ten cuidado cuando elimines una paquete de software puede resultar en la eliminación de otros paquetes. Debido a las dependencias entre paquetes, si eliminas un paquete, entonces todos los paquetes que necesitan o dependen de ese paquete se eliminarán también.

Si quieres eliminar todos los archivos de un paquete de software, excepto los archivos de configuración, puedes ejecutar el comando sudo apt-get remove package.

Si quieres eliminar todos los archivos de un paquete de software, incluyendo los archivos de configuración, puedes ejecutar el comando sudo apt-get --purge remove package. Puede que quieras guardar los archivos de configuración en caso de que vuelvas a instalar el paquete de software en un momento posterior.

Debian – Consultar Paquetes

Hay varios tipos de consultas que los administradores necesitan utilizar. Para obtener una lista de todos los paquetes que están instalados actualmente en el sistema ejecuta el comando dpkg -l.

Para listar los archivos que componen un paquete especial, puedes ejecutar el comando de dpkg -L package.

Para consultar un paquete y obtener información o su estado usa el comando de dpkg - s package.

Para determinar si un determinado archivo fue puesto en el sistema de archivos como el resultado de la instalación de un paquete utiliza el comando dpkg -S /path/to/file. Si el archivo era parte de un paquete, podría proporcionarse el nombre del paquete. Por ejemplo:

sysadmin@localhost:~$ dpkg -S /usr/bin/who
coreutils: /usr/bin/who

En el ejemplo anterior se muestra que el archivo /usr/bin/who es parte del paquete coreutils.

Administración de Paquetes RPM

Linux Standards Base (o «La Base de Estándares de Linux» en español) es un proyecto de Linux Foundation y está diseñada para especificar (a través de un consenso) un conjunto de normas que aumentan la compatibilidad entre los sistemas conformes de Linux. Según Linux Standards Base el administrador de paquetes estándar es RPM.

RPM utiliza un archivo .rpm para cada paquete de software. Este sistema es el que usan las distribuciones derivadas de Red Hat (como Red Hat, Centos y Fedora) para administrar software. Además, varias otras distribuciones que no son derivadas de Red Hat (como SUSE, OpenSUSE y Mandriva) también utilizan RPM.

Al igual que el sistema Debian, los sistemas de administración de paquetes RPM rastrean dependencias entre paquetes. Las dependencias rastreadas aseguran que cuando se instala un paquete, el sistema también instalará los paquetes que el paquete necesita para funcionar correctamente. Las dependencias también garantizan que las actualizaciones de software y las eliminaciones se realicen correctamente.

La herramienta de back-end más comúnmente utilizada para la administración de paquetes RPM es el comando rpm. Mientras que el comando rpm puede instalar, actualizar, consultar y eliminar paquetes, las herramientas front-end de línea de comandos como yum y up2date automatizan el proceso de resolución de los problemas con las dependencias.

Además, existen herramientas de front-end basadas en GUI tales como yumex y gpk-application (ver abajo) que también facilitan la administración de paquetes RPM.

Debes tener en cuenta que muchos de los comandos siguientes requieren privilegios de root. La regla es que si un comando afecta el estado de un paquete, necesitarás tener acceso administrativo. En otras palabras, un usuario normal puede realizar una consulta o una búsqueda, pero agregar, actualizar o eliminar un paquete requiere que el comando lo ejecute un usuario root.

Agregando paquetes

Para buscar un paquete desde los repositorios configurados, ejecuta el comando yum search keyword.

Para instalar un paquete, junto con sus dependencias, ejecuta el comando yum install package.

Actualización de Paquetes

Si quieres actualizar un paquete de software individual, puedes ejecutar el comando yum update package.

Si quieres actualizar todos los paquetes, puedes ejecutar el comando yum update.

Si las actualizaciones están disponibles y el usuario está utilizando una GUI, entonces el gpk-update-viewer puede mostrar un mensaje en el área de las notificaciones de la pantalla indicando que las actualizaciones están disponibles.

Eliminación de los Paquetes

Igual que en el caso de cualquier sistema de administración de paquetes que rastrea dependencias, si quieres eliminar un paquete, puedes terminar quitando más de uno debido a las dependencias. La forma más fácil de resolver automáticamente los problemas con las dependencias es utilizar el comando yum:

yum remove package

Mientras que puedes quitar los paquetes de software con el comando rpm, éste no eliminará automáticamente los paquetes de dependencia.

RPM – Consultar Paquetes

La administración de paquetes de Red Hat es similar a la administración de paquetes de Debian a la hora de realizar consultas. Es mejor utilizar la herramienta de back-end, rpm, en lugar de la herramienta front-end, yum. Mientras que las herramientas de front-end pueden realizar algunas de estas consultas, el rendimiento sufre porque normalmente estos comandos se conectan a múltiples repositorios en toda la red al ejecutar cualquier comando. El comando rpm realiza sus consultas mediante la conexión a una base de datos local de la máquina y no se conecta por la red a los repositorios.

Para obtener una lista de todos los paquetes que están instalados actualmente en el sistema ejecuta el comando rpm -qa.

Para listar los archivos que componen un paquete especial, puedes ejecutar el comando de rpm -ql package. El carácter después de q en la opción -ql es la letra l y no el número 1.

Para consultar un paquete y obtener información o su estado ejecuta el comando rpm -qi package.

Para determinar si un archivo en particular fue puesto en el sistema de archivos como el resultado de la instalación de un paquete utiliza el comando rpm -qf /path/to/file.

Kernel de Linux

Cuando la mayoría de la gente se refiere a Linux, realmente se refiere al GNU/Linux, que define el sistema operativo. La parte de Gnu’s Not Unix (GNU)de esta combinación viene proporcionada por un proyecto de la Free Software Foundation. GNU es lo que proporciona los equivalentes de código abierto de muchos comandos comunes del UNIX, la mayor parte de los comandos de línea de comandos esenciales. La parte de Linux de esta combinación es el Kernel de Linux que es el núcleo del sistema operativo. El kernel se carga al arrancar y se queda cargado para gestionar todos los aspectos del sistema en ejecución.

La implementación del kernel de Linux incluye muchos subsistemas que forman parte del kernel y otros que se pueden cargar de manera modular cuando sea necesario. Algunas de las funciones principales del kernel de Linux incluyen una interfaz de invocación del sistema, administración de procesos, administración de memoria, sistema de archivos virtual, redes y controladores de dispositivos.

En resumen, el kernel acepta comandos del usuario y gestiona los procesos que llevan a cabo los comandos, dándoles acceso a los dispositivos como memoria, discos, interfaces de red, teclados, ratones, monitores y mucho más.

El kernel proporciona acceso a la información sobre la ejecución de los procesos a través de un pseudo-sistema de archivos que es visible bajo el directorio /proc. Los dispositivos de hardware están a disposición a través de unos archivos especiales bajo el directorio /dev, mientras que la información sobre tales dispositivos se encuentra en otro pseudo-sistema de archivos bajo el directorio /sys.

El directorio /proc no sólo contiene la información sobre la ejecución de los procesos, como su nombre sugiere (proceso), sino también contiene la información sobre el hardware del sistema y la configuración actual del kernel. A continuación puedes ver un ejemplo de salida:

La salida de la ejecución de ls /proc muestra más de cien directorios numerados. Hay un directorio numerado por cada proceso en ejecución en el sistema, donde el nombre del directorio coincide con el PID (ID del proceso) del proceso en ejecución.

Como el proceso de /sbin/init siempre es el primer proceso, tiene un PID de 1 y la información del proceso /sbin/init se puede encontrar en el directorio /proc/1 .Como verás después en este capítulo, hay varios comandos que te permiten ver información sobre procesos en ejecución, por lo que raramente es necesario para los usuarios tener que ver los archivos para cada proceso en ejecución directamente.

Quizá también veas que hay un número de archivos regulares en el directorio /proc, como /proc/cmdline, /proc/meminfo y /proc/modules. Estos archivos proporcionan información sobre el kernel en ejecución:

  • El archivo /proc/cmdline puede ser importante porque contiene toda la información que le fue pasada al kernel cuando fué iniciado.
  • El archivo /proc/meminfo contiene información sobre el uso de memoria por el kernel.
  • El archivo /proc/modules contiene una lista de módulos que están cargados actualmente en el kernel para agregar funcionalidad extra.

De nuevo, raramente es necesario ver estos archivos directamente, ya que otros comandos ofrecen una salida más amigable para el usuario y una manera alternativa de ver esta información.

Mientras que la mayoría de los “archivos” bajo el directorio /proc no se pueden modificar, incluso por el usuario root, los “archivos” bajo el directorio /proc/sys pueden modificarse por el usuario root. Modificar estos archivos cambiarán el comportamiento del kernel de Linux.

Una modificación directa a estos archivos solo causa cambios temporales al kernel. Para hacer cambios permanentes, se le pueden agregar entradas al archivo /etc/sysctl.conf.

Por ejemplo, el directorio /proc/sys/net/ipv4 contiene un archivo llamado icmp_echo_ignore_all. Si ese archivo contiene un cero 0 , como lo hace normalmente, entonces el sistema responderá a solicitudes icmp. Si ese archivo contiene un uno 1 , entonces el sistema no responderá a solicitudes icmp: ”

Jerarquía de Procesos

Cuando el kernel termina de cargarse durante el proceso de arranque, se inicia el proceso /sbin/init y le asigna un Id de proceso (PID) 1. Este proceso entonces arranca otros procesos del sistema y a cada proceso se le asigna un PID en orden secuencial.

Como el proceso /sbin/init inicia otros procesos, a su vez éstos pueden iniciar procesos, que pueden poner en marcha otros procesos, y así sucesivamente. Cuando un proceso inicia otro proceso, el proceso que lleva a cabo la puesta en marcha se llama proceso padre y el proceso que se inicia se denomina el proceso hijo. Al visualizar los procesos, el padre será marcado como PPID.

Cuando el sistema ha estado funcionando durante mucho tiempo, eventualmente alcanzará el máximo valor de PID, que puedes ver y configurar a través del archivo /proc/sys/kernel/pid_max. Una vez que se ha utilizado el PID más grande, el sistema se «volteará» y reanudará asignando valores de PID que están disponibles en la parte inferior de la gama. Los gráficos siguientes proporcionan un ejemplo y la explicación del comando pstree. La salida variará de los resultados que verás si introduces el comando en el entorno de la máquina virtual de este curso.

Puedes acomodar los procesos en un árbol familiar de las parejas de padre e hijo. Si quieres ver este árbol, el comando pstree lo mostrará:

Si quieres examinar la relación de procesos padre e hijo, usando la salida del comando anterior, podrías considerar que es como:

init -> login -> bash -> pstree

El Comando ps (proceso)

Otra forma de visualizar los procesos es con el comando ps. De forma predeterminada, el comando ps sólo mostrará los procesos actuales en el shell actual. Irónicamente, verás el ps ejecutándose cuando quieras ver qué otra cosa se está ejecutando en el shell:

sysadmin@localhost:~$ ps                                                        
  PID TTY          TIME CMD                                                     
 6054 ?        00:00:00 bash  
 6070 ?        00:00:01 xeyes
 6090 ?        00:00:01 firefox
 6146 ?        00:00:00 ps
sysadmin@localhost:~$

De manera similar al comando pstree, si ejecutas ps con la opción --forest, verás las líneas indicando la relación de padre e hijo:

sysadmin@localhost:~$ ps --forest                                               
  PID TTY          TIME CMD                                                     
 6054 ?        00:00:00 bash  
 6090 ?        00:00:02   \_ firefox 
 6180 ?        00:00:00   \_ dash
 6181 ?        00:00:00        \_ xeyes
 6188 ?        00:00:00        \_ ps
sysadmin@localhost:~$

Para poder ver todos los procesos del sistema, puedes ejecutar el comando ps aux o ps -ef:

sysadmin@localhost:~$ ps aux | head                                          
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND     
root         1  0.0  0.0  17872  2892 ?        Ss   08:06   0:00 /sbin?? /ini
syslog      17  0.0  0.0 175744  2768 ?        Sl   08:06   0:00 /usr/sbin/rsyslogd -c5                                                                       
root        21  0.0  0.0  19124  2092 ?        Ss   08:06   0:00 /usr/sbin/cron
root        23  0.0  0.0  50048  3460 ?        Ss   08:06   0:00 /usr/sbin/sshd
bind        39  0.0  0.0 385988 19888 ?        Ssl  08:06   0:00 /usr/sbin/named -u bind                                                                     
root        48  0.0  0.0  54464  2680 ?        S    08:06   0:00 /bin/login -f
sysadmin    60  0.0  0.0  18088  3260 ?        S    08:06   0:00 -bash        
sysadmin   122  0.0  0.0  15288  2164 ?        R+   16:26   0:00 ps aux       
sysadmin   123  0.0  0.0  18088   496 ?        D+   16:26   0:00 -bash        
sysadmin@localhost:~$ ps -ef | head                                           
UID        PID  PPID  C STIME TTY          TIME CMD                           
root         1     0  0 08:06 ?        00:00:00 /sbin?? /init                 
syslog      17     1  0 08:06 ?        00:00:00 /usr/sbin/rsyslogd -c5        
root        21     1  0 08:06 ?        00:00:00 /usr/sbin/cron                
root        23     1  0 08:06 ?        00:00:00 /usr/sbin/sshd                
bind        39     1  0 08:06 ?        00:00:00 /usr/sbin/named -u bind       
root        48     1  0 08:06 ?        00:00:00 /bin/login -f                 
sysadmin    60    48  0 08:06 ?        00:00:00 -bash                         
sysadmin   124    60  0 16:46 ?        00:00:00 ps -ef                        
sysadmin   125    60  0 16:46 ?        00:00:00 head                     
sysadmin@localhost:~$

La salida de todos los procesos ejecutándose en un sistema sin duda puede ser abrumador. En el ejemplo la salida del comando ps se filtró por el comando head, por lo que se ven sólo los diez primeros procesos. Si no filtras la salida del comando ps, es probable que tengas que recorrer cientos de procesos para encontrar lo que te interesa.

Una forma común de ejecutar el comando ps es utilizando el comando grep para filtrar la salida que muestre las líneas que coincidan con una palabra clave, como el nombre del proceso. Por ejemplo, si quieres ver la información sobre el proceso de firefox, puede ejecutar un comando como:

sysadmin@localhost:~$ ps -e | grep firefox
 6090 pts/0    00:00:07 firefox

Como usuario root te pueden interesar más los procesos de otro usuario que tus propios procesos. Debido a los varios estilos de opciones que soporta el comando ps, hay diferentes formas de ver los procesos de un usuario individual. Utilizando la opción tradicional de UNIX, para ver los procesos del sysadmin (o «administrador del sistema» en español), ejecuta el siguiente comando:

[root@localhost ~]# ps -u username

O utilice las opciones de estilo BSD y ejecute:

[root@localhost ~]# ps u U username

El Command top

El comando ps ofrece una «foto» de los procesos que se ejecutan en el momento de introducir el comando, el comando top actualizará periódicamente la salida de los procesos en ejecución. El comando top se ejecuta de la siguiente manera:

sysadmin@localhost:~$ top

De forma predeterminada, la salida del comando top se ordena por el % del tiempo de CPU que cada proceso está utilizando actualmente, con los valores más altos en primer lugar. Esto significa los procesos que son los «CPU hogs» aparecen primero:

top - 16:58:13 up 26 days, 19:15,  1 user,  load average: 0.60, 0.74, 0.60      
Tasks:   8 total,   1 running,   7 sleeping,   0 stopped,   0 zombie            
Cpu(s):  6.0%us,  2.5%sy,  0.0%ni, 90.2%id,  0.0%wa,  1.1%hi,  0.2%si,  0.0%st  
Mem:  32953528k total, 28126272k used,  4827256k free,     4136k buffers        
Swap:        0k total,        0k used,        0k free, 22941192k cached         
                                                                                
  PID USER      PR   NI VIRT RES  SHR  S %CPU %MEM     TIME+ COMMAND            
    1 root      20   0 17872 2892 2640 S    0  0.0   0:00.02 init               
   17 syslog    20   0  171m 2768 2392 S    0  0.0   0:00.20 rsyslogd           
   21 root      20   0 19124 2092 1884 S    0  0.0   0:00.02 cron               
   23 root      20   0 50048 3460 2852 S    0  0.0   0:00.00 sshd               
   39 bind      20   0  376m  19m 6100 S    0  0.1   0:00.12 named              
   48 root      20   0 54464 2680 2268 S    0  0.0   0:00.00 login              
   60 sysadmin  20   0 18088 3260 2764 S    0  0.0   0:00.01 bash               
  127 sysadmin  20   0 17216 2308 2072 R    0  0.0   0:00.01 top

Hay una extensa lista de comandos que se pueden ejecutar dentro del top:

TeclasSignificado
h o ?Ayuda
lAlternar entre las estadísticas de carga
tAlternar entre las estadísticas de tiempo
mAlternar entre las estadísticas del uso de la memoria
<Mover la columna ordenada hacia la izquierda
>Mover la columna ordenada hacia la derecha
FElegir un campo ordenado
RAlternar entre la dirección de la clasificación
POrdenar por % CPU
MOrdenar por % de la memoria usada
kTerminar un proceso (o enviarle una señal)
rCambiar la prioridad de un proceso con el comando renice

Una de las ventajas del comando top es que se puede dejar correr para permanecer al «pendiente» de los procesos para propósitos de monitoreo. Si un proceso comienza a dominar o «huye» con el sistema, entonces por defecto aparecerá en la parte superior de la lista presentada por el comando top. Un administrador que está ejecutando el comando top puede entonces tomar una de dos acciones:

  1. Terminar el proceso «corrido»: Apretando la tecla k mientras se ejecuta el comando top pedirá al usuario que proporcione el PID y un número señal. Enviar la señal predeterminada le pedirá al proceso que termine, pero enviando el número 9 de la señal, la señal KILL, forzará el cierre del proceso.
  2. Ajustar la prioridad del proceso: Apretando la tecla r mientras se ejecuta el comando top pedirá al usuario que ejecute el renice del proceso seguido por el valor del discernimiento (o «niceness» en inglés). Los valores de niceness pueden ser del -20 al 19 y afectan la prioridad. Sólo el usuario root puede utilizar un «niceness» menor que el valor actual de niceness o un valor de niceness negativo, que hace que el proceso se ejecute con una prioridad mayor. Cualquier usuario puede proporcionar un valor de niceness que es mayor que el valor actual de niceness y hará que el proceso se ejecute con una prioridad baja.

Otra ventaja del comando top es que puede darte una representación general de lo ocupado que está el sistema actualmente y la tendencia en el tiempo. Los promedios de carga se muestran en la primera línea de la salida del comando top e indican que tan ocupado ha estado el sistema durante los últimos uno, cinco y quince minutos. Esta información también puede verse ejecutando el comando uptime o directamente mostrando el contenido del archivo /proc/loadavg:

sysadmin@localhost:~$ cat /proc/loadavg
0.12 0.46 0.25 1/254 3052

Los tres primeros números de este archivo indican la carga media sobre los intervalos pasados uno, cinco y quince minutos. El cuarto valor es una fracción que muestra el número de los procesos ejecutando código actualmente en la CPU 1 y el número total de los procesos 254. El quinto valor es el último valor de PID que ejecutó código en la CPU.

El número reportado como un promedio de carga es proporcional al número de los núcleos de CPU capaces de ejecutar procesos. En una CPU de un solo núcleo un valor de uno significaría que el sistema está totalmente cargado. En una CPU de cuatro núcleos un valor de uno significaría que 1/4 o el 25% del sistema está cargado.

Otra razón por la que los administradores mantienen ejecutado el comando top es la capacidad para monitorear el uso de la memoria en tiempo real. Ambos comandos el top y el free muestran las estadísticas del uso general de la memoria.

El comando top también puede mostrar el porcentaje de memoria utilizado por cada proceso, así pues, se puede identificar rápidamente un proceso que está consumiendo una cantidad excesiva de memoria.

El Comando free

Ejecutando el comando free sin opciones proporciona una foto de la memoria utilizada en ese momento.

Si quieres supervisar el uso de la memoria en el tiempo con el comando free, puedes ejecutarlo con la opción -s y especificar el número de segundos. Por ejemplo, ejecutando free -s 10 actualizaría la salida cada 10 segundos.

Para hacer más fácil la interpretación de la salida del comando free, las opciones -m o -g pueden ser útiles para mostrar la salida en megabytes o gigabytes, respectivamente. Sin estas opciones, se muestra la salida en bytes:

sysadmin@localhost:~$ free                                                      
             total       used       free     shared    buffers     cached       
Mem:      32953528   26171772    6781756          0       4136   22660364       
-/+ buffers/cache:    3507272   29446256                                        
Swap:            0          0          0                                        
sysadmin@localhost:~$

Cuando lees la salida del comando free:

  • La primera línea es un encabezado descriptivo.
  • La segunda línea con la etiqueta Mem: son las estadísticas de la memoria física del sistema.
  • La tercera línea representa la cantidad de memoria física después de ajustar esos valores sin tener en cuenta cualquier memoria utilizada por el kernel para los buffers y caché. Técnicamente, esta memoria «utilizada» podría ser «reclamada» si es necesario.
  • La cuarta línea de la salida se refiere a la memoria Swap, también conocida como la memoria virtual. Éste es el espacio en el disco duro que se utiliza como memoria física cuando se baja la cantidad de memoria física. De hecho, puede parecer que el sistema tiene más memoria de lo que realmente tiene, pero el uso del espacio swap puede también ralentizar el sistema.

Si la cantidad de memoria y swap que está disponible es muy baja, el sistema comenzará automáticamente a cerrar los procesos. Esta es una razón por la que es importante supervisar el uso de la memoria del sistema. Un administrador que se da cuenta que el sistema se va quedando sin memoria libre, puede utilizar el comando top o kill para cerrar los procesos que quiere, en lugar de dejar que el sistema elija por él.

Los Archivos de Registro

A medida que el kernel y varios procesos se ejecutan en el sistema, producen una salida que describe cómo se están ejecutando. Parte de esta salida se muestra en la ventana de la terminal donde se ejecuta el proceso, algunos de estos datos no se envían a la pantalla, pero en cambio se escribe en varios archivos. Esto se llama «datos de registro» o «mensajes de registro».

Estos archivos de registro son muy importantes por un número de razones; pueden ser útiles en la solución de los problemas y pueden ser utilizados para la determinación de si o no ha habido intentos de acceso no autorizado.

Algunos procesos son capaces de «registrar» sus propios datos en estos archivos, otros procesos dependen de otro proceso (un demonio) para manejar estos archivos de registro de datos.

Estos demonios de registro pueden variar de una distribución a otra. Por ejemplo, en algunas distribuciones, los demonios que se ejecutan en segundo plano para realizar el registro se llaman syslogd y klogd. En otras distribuciones, un demonio como el rsyslogd en Red Hat y Centos o systemd journald en Fedora puede servir para esta función de registro.

Independientemente del nombre del proceso de demonio, los archivos de registro se colocan casi siempre en la estructura del directorio /var/log. Aunque algunos de los nombres de archivo pueden variar, aquí están algunos de los archivos más comunes en este directorio:

ArchivoContenido
boot.logMensajes generados cuando servicios se inician durante el arranque del sistema.
cronMensajes generados por el demonio crond para las tareas que se deben ejecutar en forma recurrente.
dmesgMensajes generados por el kernel durante el arranque del sistema.
maillogMensajes producidos por el demonio de correo para mensajes de correo electrónico enviados o recibidos
messagesMensajes del kernel y otros procesos que no pertenecen a ninguna otra parte. A veces se denomina dsyslog en lugar de messages cuando el demonio haya grabado este archivo.
secureMensajes de los procesos que requieren autorización o autenticación (por ejemplo, el proceso de inicio de sesión).
Xorg.0.logMensajes del servidor de ventanas X (GUI).

Los archivos de registro se rotan, lo que significa que los archivos de registro antiguos cambiaron de nombre y fueron reemplazados por nuevos archivos de registro. Los nombres de archivo que aparecen en la tabla anterior pueden tener un sufijo numérico o fecha añadida al nombre, por ejemplo: secure.0 o secure-20131103

La rotación de un archivo de registro por lo general se ocurre en forma programada, por ejemplo, una vez por semana. Cuando se rota un archivo de registro, el sistema deja de escribir en el archivo de registro y agrega un sufijo. Entonces se crea un nuevo archivo con el nombre original y el proceso de registro sigue usando este nuevo archivo.

Con los demonios modernos normalmente se utiliza un sufijo de fecha.

Aunque la mayoría de los archivos de registro contienen texto como su contenido, que puede verse de forma segura con muchas herramientas, otros archivos como /var/log/btmp y /var/log/wtmp contienen un binario. Mediante el comando file (o «archivo» en español), puedes comprobar si el tipo de contenido del archivo es seguro para ver.

Para los archivos que contienen datos binarios, normalmente hay comandos disponibles que leen los archivos, interpretan su contenido y luego muestran texto. Por ejemplo, los comandos lastb y last se pueden usar para ver los archivos /var/log/btmp y /var/log/wtmp respectivamente.

Por razones de seguridad, la mayoría de los archivos encontrados no son legibles por los usuarios normales, así que asegúrate de ejecutar los comandos que interactúan con estos archivos teniendo los privilegios de root.

El Comando dmesg

El archivo /var/log/dmesg contiene los mensajes del kernel que se produjeron durante el arranque del sistema. El archivo /var/log/messages contiene mensajes del kernel que se producen mientras el sistema está corriendo, pero los mensajes se mezclarán con otros mensajes de demonios o procesos.

Aunque el kernel normalmente no tiene su propio archivo de registro, se puede configurar uno para ellos por lo general mediante la modificación de los archivos /etc/syslog.conf o /etc/rsyslog.conf. Además, el comando dmesg puede utilizarse para ver el kernel ring buffer, que contendrá un gran número de mensajes generados por el kernel.

En un sistema activo, o en uno que tiene muchos errores de kernel, es posible que se haya sobrepasado la capacidad de este búfer y podrían perderse algunos mensajes. El tamaño de este búfer se establece en el momento que el kernel es compilado, por lo que no es sencillo cambiarlo.

Ejecutar el comando dmesg puede producir hasta 512 kilobytes de texto, así que se recomienda filtrar el comando con una barra vertical a otro comando como less o grep. Por ejemplo, si estuvieras resolviendo problemas con tu dispositivo USB, entonces buscando el texto «USB» con el comando grep siendo sensible a mayúsculas y minúsculas, puede ser de ayuda:

sysadmin@localhost:~$ dmesg | grep -i usb 
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ohci_hcd 0000:00:06.0: new USB bus registered, assigned bus number 1
usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1

La Terminología Básica de la Red

Antes de configurar una red o acceder a una red existente, es importante conocer algunos términos que están relacionados con las redes. Algunos de los términos son básicos y probablemente ya los conoces, sin embargo otros son más avanzados.

Host: Un host es básicamente una computadora. Sin embargo, muchas personas tienen una idea más limitada de lo que es una computadora (como una computadora de escritorio o una portátil). En realidad, muchos otros dispositivos también son computadoras, tales como teléfonos celulares, reproductores de música digitales y muchas televisiones modernas. En términos de redes, un host es cualquier dispositivo que se comunica con otro dispositivo.

Red: Una red es una colección de dos o más hosts (computadoras) que son capaces de comunicarse entre sí. Esta comunicación puede ser a través de una conexión cableada o inalámbrica.

Internet: El Internet es un ejemplo de una red. Consiste de una red accesible públicamente que conecta millones de hosts en todo el mundo. Mucha gente utiliza el Internet para navegar por páginas web y enviar y recibir correo electrónico, pero el Internet tiene muchas funciones adicionales además de estas actividades.

Wi-Fi: El término Wi-Fi se refiere a las redes inalámbricas.

Servidor: Un host que proporciona un servicio a otro host o cliente se denomina servidor. Por ejemplo, un servidor web almacena, procesa y entrega páginas web. Un servidor de correo recibe correo entrante y entrega correo saliente.

Servicio: Una característica que se presta desde un host es un servicio. Un ejemplo de un servicio sería cuando un host proporciona páginas web a otro host.

Cliente: Un cliente es un host que está accediendo a un servidor. Cuando se trabaja en un equipo navegando por Internet, eres un host cliente.

Router: También llamado gateway (o «puerta de enlace» en español), un router o «enrutador» en español, es una máquina que conecta hosts de una red a otra red. Por ejemplo, si trabajas en un entorno de oficina, las computadoras dentro de la empresa pueden todos comunicarse vía la red local (o «local network» en inglés) creada por los administradores. Para acceder al Internet, los equipos tienen que comunicarse con un router que se utiliza para reenviar las comunicaciones de red al Internet. Normalmente cuando te comunicas en una red amplia (como el Internet), hay varios routers que se utilizan antes de que tu comunicación llegue a su destino final.

Terminología de las Funciones de Redes

Además de los términos de redes mencionados en la sección anterior, hay algunos términos adicionales que debes conocer. Estos términos se centran más en los diferentes tipos de servicios de redes que se utilizan, así como algunas de las técnicas que se utilizan para la comunicación entre las máquinas.

Paquete de red: Un paquete de red se utiliza para enviar la comunicación de red entre los hosts. Rompiendo la comunicación en trozos más pequeños (paquetes), el método de entrega de datos es mucho más eficiente.

Dirección IP: Una Dirección de Protocolo de Internet (IP) o «Internet Protocol» en inglés es un número único asignado a un host en una red. Los hosts utilizan estos números para «dirigir» una comunicación de red. Sobre las direcciones IP hablaremos más adelante en este capítulo.

Máscara de red: También llamada una netmask o máscara, una máscara de red es un sistema numérico que puede utilizarse para definir cuáles de las direcciones IP se consideran dentro de una única red. Debido a cómo los routers desempeñan sus funciones, las redes tienen que ser definidas claramente.

Nombre de host: Cada host en una red puede tener su propio nombre de host. Esto le facilita a los usuarios dirigir los paquetes de red a otro host, ya que para los usuarios es más fácil recordar nombres que números. Los nombres de host se traducen a direcciones IP antes de enviar el paquete de red en la red.

DHCP: A los hosts se le puede asignar nombres de hosts, direcciones IP y otra información relacionada con la red por un Servidor DHCP (Dynamic Host Configuration Protocol o «Protocolo de Configuración Dinámica de Host» en español). En el mundo de la informática, un protocolo es un conjunto de reglas bien definido. DHCP define cómo se asigna la información de red a los clientes host y el servidor DHCP es la máquina que proporciona esta información.

DNS: Como ya hemos mencionado anteriormente, los nombres de host se traducen a direcciones IP antes de enviar el paquete en la red. Esto significa que tu host necesita conocer la dirección IP de todos los otros hosts con los cuáles te comunicas. Cuando trabajas en una red amplia (como Internet), esto puede plantear un desafío ya que hay muchos hosts. Un Servidor DNS (Domain Name Server) proporciona el servicio de traducción de los nombres de dominio en direcciones IP.

Ethernet: En un entorno de red por cable, Ethernet es la forma más común para conectar físicamente los hosts en una red. Los cables de Ethernet están conectados a las tarjetas de red que soportan las conexiones Ethernet. Los cables de Ethernet y los dispositivos (como routers) están diseñados para soportar diferentes velocidades de comunicación, siendo el más bajo de 10 Mbps (10 Megabits por segundo) y la máxima 100 Gbps (100 gigabits por segundo). Las velocidades más comunes son de 100 Mbps y 1 Gbps.

TCP/IP: Transmission Control Protocol/Internet Protocol (TCP/IP) (o «Protocolo de Control de Transmisión/Protocolo de Internet» en español) es un nombre de adorno para una colección de protocolos (recuerda, protocolo = conjunto de reglas) que se utilizan para definir cómo la comunicación de la red debe ocurrir entre los hosts. Aunque no es la única colección de protocolos utilizados para definir la comunicación de la red, pero es la más utilizada. Por ejemplo, TCP/IP incluye la definición de cómo las direcciones IP y máscaras de red funcionan.

Las Direcciones IP

Como se mencionó anteriormente, los hosts «dirijen» paquetes de red usando la dirección IP de la máquina de destino. El paquete de red también incluye un «remitente», la dirección IP de la máquina origen.

De hecho, hay dos tipos de direcciones IP: IPv4 e IPv6. Para entender por qué hay dos tipos diferentes, es necesario entender un poco la breve historia del direccionamiento IP.

Durante muchos años, la tecnología de las direcciones IP utilizada por todas las computadoras era IPv4 (IP versión 4). En una dirección IPv4, un total de cuatro números de 8 bits (8 bits = números del 0 al 255) se utilizan para definir la dirección. Por ejemplo: 192.168.10.120. Ten en cuenta que esto se considera una dirección de 32 bits (4 x 8 bits = 32).

Cada host en Internet debe tener una dirección IP única. En un entorno IPv4, existe un límite técnico de unos 4.3 billones de direcciones IP. Sin embargo, muchas de estas direcciones IP no son realmente utilizables por varias razones. También, se han asignado direcciones IP a las organizaciones que no han hecho uso completo de todas las direcciones IP que tenían disponibles.

Mientras que parece que debe haber un montón de direcciones IP para ser utilizadas, varios factores (el creciente número de hosts en Internet, direcciones IP privadas reservadas, etc.) han causado un problema: El Internet comenzó a quedarse sin direcciones IP.

Esto, en parte, animó el desarrollo de IPv6. IPv6 fue «creada» oficialmente en 1998. En una red IPv6 las direcciones son mucho más grandes, direcciones de 128 bits que se ven así: 2001:0db8:85a3:0042:1000:8a2e:0370:7334. Esencialmente esto proporciona un grupo de direcciones mucho más grande, tan grande que quedarse sin direcciones en cualquier momento en un futuro cercano es muy poco probable.

Es importante tener en cuenta que la diferencia entre IPv4 e IPv6 no es sólo «más direcciones de IP». IPv6 tiene muchas otras características avanzadas que abordan algunas de las limitaciones de IPv4, como mayor velocidad, administración de paquetes más avanzada y transporte de datos más eficiente.

Teniendo en cuenta todas las ventajas, podrías pensar que ahora todos los hosts estarían usando IPv6. Este no es el caso en absoluto. La mayoría de los dispositivos conectados a la red en el mundo todavía utilizan IPv4 (algo así como 98-99% de todos los dispositivos). Así que, ¿por qué el mundo no ha adoptado la tecnología superior de IPv6?

Principalmente, hay dos razones:

  • La invención de NAT: Inventado para superar la posibilidad de quedarse sin direcciones IP en un entorno IPv4, la Network Address Translation (NAT) (o «Traducción de Direcciones de Red» en español) utiliza una técnica para proporcionar más hosts de acceso a Internet. En resumen, un grupo de hosts se coloca en una red privada sin acceso directo a Internet; un router especial proporciona acceso a Internet y solamente este router necesita una dirección IP para comunicarse en Internet. En otras palabras, un grupo de hosts comparte una única dirección IP, lo que significa que muchas más computadoras se pueden conectar a Internet. Gracias a esta característica la necesidad de pasar a IPv6 es menos crítica que antes de la invención de NAT.
  • Cuestiones de Portabilidad: La Portabilidad es el cambio de una tecnología a otra. IPv6 tiene muchas grandes novedades, pero todos los hosts tienen que ser capaces de utilizar estas características. Conseguir que todos en Internet (o incluso sólo algunos) hagan estos cambios supone un reto.

La mayoría de los expertos están de acuerdo en que IPv6 reemplazará IPv4, así que entender los fundamentos de ambos es importante para las personas que trabajan en la industria de TI.

Configurar la Red usando el Archivo de Configuración

Habrá momentos cuando no haya herramienta gráfica disponible. En esos casos, es útil conocer los archivos de configuración que se utilizan para almacenar y modificar los datos de la red.

Estos archivos pueden variar según la distribución que estés utilizando.

El Archivo Primario de Configuración de IPv4

El archivo primario de configuración para una interfaz de red IPv4 es el archivo /etc/sysconfig/network-scripts/ifcfg-eth0 . El siguiente ejemplo muestra como se ve un archivo cuando se configura para una dirección IP estática, esto es en CENTOS:

root@localhost:~# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
UUID="98cf38bf-d91c-49b3-bb1b-f48ae7f2d3b5"
DEFROUTE=yes
IPV4 _FAILURE_FATAL=yes
IPV6INOT=no
NAME="System eth0"
IPADDR=192.168.1.1
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.2
HWADDR=00:50:56:90:18:18
LAST_CONNECT=1376319928
root@localhost:~#

Si el dispositivo estuviera configurado para ser un cliente DHCP, entonces los valores IPADDR, GATEWAY y DNS1 no se establecerían. Además, el valor BOOTPROTO se establecería a dhcp.

El Archivo Primario de Configuración de IPv6

En un sistema CentOS, el archivo primario de configuración de IPv6 es el mismo archivo donde se almacena la configuración de IPv4: /etc/sysconfig/network-scripts/ifcfg-eth0. Si quieres que tu sistema tenga una dirección IPv6 estática, agrega lo siguiente al archivo de configuración:

IPV6INIT=yes
IPV6ADDR=<IPv6 IP Address>
IPV6_DEFAULTGW=<IPv6 IP Gateway Address>

Si quieres que tu sistema sea un cliente DHCP IPv6, agrega la siguiente configuración.

DHCPV6C=yes

También tienes que ajustar el archivo /etc/sysconfig/network de la siguiente manera:

NETWORKING_IPV6=yes

Domain Name Service (DNS) (o «Servicio de Nombres de Dominio» en español)

Cuando a una computadora se le pide que acceda a una página web, como www.example.com, no necesariamente sabe qué dirección IP utilizar. Para que la computadora asocie una dirección IP con la solicitud de URL o nombre de host, la computadora depende del servicio DNS de otro equipo. A menudo, la dirección IP del servidor DNS se hace visible durante la solicitud de DHCP, mientras que una computadora recibe información importante para comunicar en la red.

La dirección del servidor DNS se almacena en el archivo /etc/resolv.conf. Un archivo /etc/resolv.conf típico se genera automáticamente y se ve así.

sysadmin@localhost:~$ cat /etc/resolv.conf                     
nameserver 127.0.0.1                                           
sysadmin@localhost:~$ 

La configuración del servidor de nombres se establece a menudo en la dirección IP del servidor DNS. En el ejemplo siguiente se utiliza el comando host. Ten en cuenta que el servidor de ejemplo se asocia con la dirección IP 192.168.1.2 por el servidor DNS:

sysadmin@localhost:~$ host example.com                         
example.com has address 192.168.1.2                           
sysadmin@localhost:~$

También es común tener varias opciones de servidor de nombres, si un servidor DNS no responde.

Los Archivos Adicionales de Configuración de Red

La tabla siguiente describe los archivos de configuración de red adicionales que debes conocer. Aunque no figuran específicamente en los objetivos del examen, los objetivos incluyen el término general de Configuración de Red, por lo que estos archivos pueden aparecer en el examen:

ComandoExplicación
/etc/hostsEste archivo contiene una tabla de nombres de host para las direcciones IP. Puede utilizarse para complementar un servidor DNS.
/etc/sysconfig/networkEste archivo tiene dos configuraciones. La configuración de NETWORK (o «red» en español) puede determinar si la red está activada (yes) o desactivada (no). La configuración de HOSTNAME (O «nombre de host» en español) define un nombre de host de la máquina local.
/etc/nsswitch.confEste archivo se puede utilizar para modificar dónde se producen las búsquedas de nombre de host. Por ejemplo, la configuración hosts : files dns buscaría los nombres de host primero en el archivo /etc/hosts y después en el servidor DNS. Si cambias a hosts: dns files, la búsqueda se lleva a cabo primero en el servidor DNS.

Reiniciar la Red

Después de cambiar un archivo de configuración de red (por ejemplo, el archivo /etc/sysconfig/network-scripts/ifcfg-eth0 o el archivo /etc/resolv.conf ), necesitarás reiniciar la máquina o ejecutar un comando como administrador para que los cambios tomen efecto. A continuación se muestra el comando que tienes que ejecutar en un sistema CentOS:

su - root
service network restart

El Comando route

Hay que recordar que un router (o puerta de enlace) es una máquina que permitirá que los hosts de una red se comuniquen con otra red. Para ver una tabla que describe donde se envían los paquetes de red utiliza el comando route:

root@localhost:~# route                                             
Kernel IP routing table                                             
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface   
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0  
default         192.168.1.1     0.0.0.0        UG     0      0        0 eth0 
root@localhost:~#

El primer cuadro de negrita en el ejemplo anterior indica que cualquier paquete de red enviado a una máquina en la red 192.168.1 no se envía a una puerta de enlace (el * indica «no hay puerta de enlace»). El segundo cuadro amarillo indica que todos los otros paquetes de red se envían al host con la dirección IP de 192.168.1.1 (el router).

Algunos usuarios prefieren visualizar esta información con sólo datos numéricos, usando la opción -n para el comando route. Por ejemplo, mira el siguiente ejemplo y enfócate en dónde la salida mostraba default:

root@localhost:~# route -n                                                      
Kernel IP routing table                                                         
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface   
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0  
0.0.0.0        192.168.1.1     0.0.0.0         UG    0      0        0 eth0  
root@localhost:~#

El 0.0.0.0 se refiere a «todas las otras máquinas», o lo mismo que «default».

El comando route se está volviendo obsoleto en algunas distribuciones de Linux (en desuso) y está siendo reemplazado por una forma del comando ip, específicamente ip route show. Observa que también puedes encontrar la misma información destacada anteriormente utilizando este comando:

root@localhost:~# ip route show
default via 192.168.1.254 dev eth0 proto static                                
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.2              
root@localhost:~#

El Comando ping

El comando ping se puede utilizar para determinar si otra máquina es «accesible». Si el comando ping puede enviar un paquete de red a otra máquina y recibir una respuesta, entonces te deberías poder conectar a esa máquina.

De forma predeterminada, el comando ping continuará enviando paquetes una y otra vez. Para limitar cuántos pings se deben enviar, utiliza la opción -c.

Si el comando ping falla, recibirás un mensaje que dice Destination Host Unreachable (o «Host de destino inalcanzable» en español).

Es importante tener en cuenta que sólo porque el comando ping falle, no significa que el sistema remoto sea realmente inalcanzable. Algunos administradores configuran sus máquinas para no responder a las solicitudes de ping.

Esto suele pasar, porque un servidor puede ser atacado por algo que se llama ataque por denegación de servicio. En este tipo de ataque, un servidor es saturado con un número masivo de paquetes de red. Al ignorar las peticiones de ping, el servidor es menos vulnerable.

Como resultado, el comando ping puede ser útil para comprobar la disponibilidad de máquinas locales, pero no siempre para máquinas fuera de tu propia red.

El Comando netstat

El comando netstat es una poderosa herramienta que proporciona una gran cantidad de información de la red. Puede utilizarse para mostrar información acerca de conexiones de red, así como para mostrar la tabla de enrutamiento similar al comando route.

Por ejemplo, puedes querer mostrar estadísticas acerca del tráfico de red. Esto puede lograrse mediante el uso de la opción -i del comando netstat:

root@localhost:~# netstat -i                                                  
Kernel Interface table                                                        
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0       137      0      4 0        12      0      0      0 BMRU
lo        65536 0        18      0      0 0        18      0      0      0 LRU
root@localhost:~#

Las estadísticas más importantes de la salida anterior son TX-OK y TX-ERR. Un alto porcentaje de TX-ERR puede indicar un problema en la red, tal como mucho tráfico de red.

Si quieres utilizar el comando netstat para mostrar la información de enrutamiento, utiliza la opción -r:

root@localhost:~# netstat -r                                                  
Kernel IP routing table                                                       
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     *               255.255.255.0   U         0 0          0 eth0 
default         192.168.1.1     0.0.0.0        UG         0 0          0 eth0 
root@localhost:~#

El comando netstat se utiliza comúnmente para mostrar puertos abiertos. Un puerto es un número único que está asociado con un servicio proporcionado por un host. Si el puerto está abierto, el servicio está disponible para otros hosts.

Por ejemplo, puedes iniciar sesión en un host desde otro host utilizando un servicio llamado SSH. El servicio SSH tiene asignado el puerto #22. Si el puerto #22 está abierto, el servicio está disponible para otros hosts.

Es importante tener en cuenta que el host mismo también debe tener los servicios en ejecución; esto significa que debe iniciarse el programa que permite a los usuarios remotos conectarse (que por lo general está iniciado en la mayoría de las distribuciones de Linux).

Para ver una lista de todos los puertos actualmente abiertos, puedes utilizar el siguiente comando:

root@localhost:~# netstat -tln                                                
Active Internet connections (only servers)                                    
Proto Recv-Q Send-Q Local Address           Foreign Address         State     
tcp        0      0 192.168.1.2:53          0.0.0.0:*               LISTEN    
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN    
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN    
tcp6       0      0 :::53                   :::*                    LISTEN    
tcp6       0      0 :::22                  :::*                    LISTEN   
tcp6       0      0 ::1:953                 :::*                    LISTEN    
root@localhost:~#

Como se puede ver en la salida anterior, el puerto #22 está «escuchando (LISTEN)», los que significa que está abierto.

En el ejemplo anterior, la -t se refiere a TCP (recuerda que este protocolo lo vimos de anteriormente en este capítulo), -l significa «listening» (o «escuchando» en español) (cuáles de los puertos están escuchando) y -n significa «mostrar números, no nombres».

A veces, mostrar los nombres puede ser más útil. Sólo elimina la opción -n:

root@localhost:~# netstat -tl                                                   
Active Internet connections (only servers)                                      
Proto Recv-Q Send-Q Local Address           Foreign Address          State     
tcp        0      0 cserver.example.:domain *:*                     LISTEN    
tcp        0      0 localhost:domain        *:*                     LISTEN    
tcp        0      0 *:ssh                   *:*                     LISTEN    
tcp        0      0 localhost:953           *:*                     LISTEN    
tcp6       0      0 [::]:domain             [::]:*                  LISTEN    
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN    
tcp6       0      0 localhost:953           [::]:*                  LISTEN    
root@localhost:~#

En algunas distribuciones se puede ver el siguiente mensaje en la página man del comando netstat:

NOTE
     This program is obsolete. Replacement for netstat is ss. Replacement for 
     netstat -r is ip route. Replacement for netstat -i is ip -s link. 
     Replacement for netstat -g is ip maddr.

Aunque el comando netstat no se sigue desarrollando, sigue siendo una excelente herramienta para visualizar información de la red. El objetivo es eventualmente reemplazar el comando netstat por comandos como ss e ip. Sin embargo, es importante tener en cuenta que esto puede tomar algún tiempo.

El comando netstat viene en este curso ya que está disponible en todas las distribuciones de Linux, todavía es ampliamente utilizado y es un objetivo del examen de Linux Essentials (los comandos ss e ip no lo son).

El Comando dig

Puede haber ocasiones cuando necesites probar la funcionalidad del servidor DNS que tu host está utilizando. Una forma de hacerlo es utilizar el comando dig. Este comando realizará consultas en el servidor DNS para determinar si la información necesaria está disponible en el servidor.

En el ejemplo siguiente, se utiliza el comando dig para determinar la dirección IP del host example.com:

root@localhost:~# dig example.com                                              
; <<>> DiG 9.8.1-P1 <<>> example.com                                          
;; global options: +cmd                                                       
;; Got answer:                                                                
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45155                     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0       
                                                                              
;; QUESTION SECTION:                                                          
;example.com.                   IN      A                                     
                                                                              
;; ANSWER SECTION:                                                            
example.com.            86400   IN      A       192.168.1.2                  
;; AUTHORITY SECTION:                                                         
example.com.            86400   IN      NS      example.com.                  
                                                                              
;; Query time: 0 msec                                                         
;; SERVER: 127.0.0.1#53(127.0.0.1)                                            
;; WHEN: Tue Dec  8 17:54:41 2015                                             
;; MSG SIZE  rcvd: 59                                                          
root@localhost:~#

Observa que la respuesta incluye la dirección IP de 192.168.1.2, lo que significa que el servidor DNS tiene la dirección IP asociada a la información de traducción del nombre de host en su base de datos.

Si el servidor DNS no tiene la información solicitada, está configurado para mandar solicitud a otros servidores DNS. Si ninguno de ellos tiene la información solicitada, recibirás un mensaje de error:

root@localhost:~# dig sample.com                                            

; <<>> DiG 9.8.1-P1 <<>> sample.com                                           
;; global options: +cmd 
;; connection timed out; no servers could be reached
root@localhost:~#

El Comando host

En su forma más simple, el comando host trabaja con DNS para asociar un nombre de host a una dirección IP. Tal como en el ejemplo anterior, ejemplo.com se asocia a la dirección IP 192.168.1.2:

root@localhost:~# host example.com                                            
example.com has address 192.168.1.2                                           
root@localhost:~#

El comando host se puede utilizar también en sentido inverso si se conoce una dirección IP, pero no el nombre del dominio.

root@localhost:~# host 192.168.1.2                                            
2.1.168.192.in-addr.arpa domain name pointer example.com.                     
2.1.168.192.in-addr.arpa domain name pointer cserver.example.com.             
root@localhost:~#

Existen otras opciones para consultar los diferentes aspectos de un DNS, así como la CNAME (nombre canónico -alias):

root@localhost:~# host -t CNAME example.com                                   
example.com has no CNAME record                                               
root@localhost:~#

Puesto que muchos servidores DNS guardan una copia de example.com, los registros SOA (Start of Authority) indican el servidor principal para el dominio:

root@localhost:~# host -t SOA example.com                                     
example.com has SOA record example.com. cserver.example.com. 2 604800 86400 2419200 604800                                                                   
root@localhost:~#

Puedes encontrar una lista completa de información sobre DNS en relación con el example.com usando la opción -a («all» o «todo» en español):

root@localhost:~# host -a example.com                                         
Trying "example.com"                                                          
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3549                      
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1       
                                                                              
;; QUESTION SECTION:                                                          
;example.com.                   IN      ANY                                   
                                                                              
;; ANSWER SECTION:                                                            
example.com.            86400   IN      SOA     example.com. cserver.example.com. 2 604800 86400 2419200 604800                                              
example.com.            86400   IN      NS      example.com.                  
example.com.            86400   IN      A       192.168.1.2                   
                                                                              
;; ADDITIONAL SECTION:                                                        
example.com.            86400   IN      A       192.168.1.2                   
                                                                              
Received 119 bytes from 127.0.0.1#53 in 0 ms                                  
root@localhost:~#

El Comando ssh

El comando ssh te permitirá conectarte a otra máquina a través de la red, iniciar sesión y luego realizar tareas en el equipo remoto.

Si utilizas el comando ssh y sólo proporcionas el nombre de la máquina o la dirección IP para iniciar la sesión, el comando asumirá que quieres iniciar la sesión con el mismo nombre con el que actualmente estás registrado. Si quieres utilizar un nombre de usuario distinto, utiliza la sintaxis:

username@hostname (o «NombreDeUsuario@NombreDelHostlocal» en español)
root@localhost:~# ssh bob@test                                                
The authenticity of host ‘test (127.0.0.1)’ can’t be established.
RSA key fingerprint is c2:0d:ff:27:4c:f8:69:a9:c6:3e:13:da:2f:47:e4:c9.
Are you sure you want to continue connection (yes/no)? yes
Warning: Permanently added ‘test’ (RSA) to the list of known hosts.
bob@test’s password:
bob@test:~$
Fri Oct   4 16:14:43 CDT 2013                                            
bob@test:~$

Algoritmo RSA de Clave Pública

El primer prompt te pide que verifiques la identidad de la máquina en la que inicias sesión. En la mayoría de los casos vas a responder yes (o «sí» en español). Aunque puedas validar con administrador de la máquina remota para asegurarte de que la clave RSA es correcta, este no es realmente el propósito de esta consulta. Realmente está diseñado para futuros inicios de sesión.

Después de que respondas yes, la clave RSA de la máquina remota se almacena en tu sistema local. Cuando intentes hacer un ssh a esta misma máquina en el futuro, la clave RSA proporcionada por el equipo remoto se compara con la copia almacenada en el equipo local. Si coinciden, entonces aparece el prompt del nombre de usuario. Si no coinciden, verás un error similar al siguiente:

sysadmin@localhost:~$ ssh bob@test
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@   WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!   @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
c2:0d:ff:27:4c:f8:69:a9:c6:3e:13:da:2f:47:e4:c9.
Please contact your system administrator.
Add correct host key in /home/sysadmin/.ssh/known_hosts to get rid of this message.
Offending key in /home/sysadmin/.ssh/known_hosts:1
RSA host key for test has changed and you have requested strict checking.
Host key verification failed.
sysadmin@localhost:~$

Este error puede indicar que un host no autorizado ha reemplazado al host correcto. Consulta con el administrador del sistema remoto. Si el sistema fuese recientemente reinstalado, tendría una nueva clave RSA, lo podría estar causando este error.

En caso de que este mensaje de error es debido a que una máquina remota fue reinstalada, puedes eliminar el archivo ~/.ssh/known_hosts de tu sistema local (o solo quitar la entrada para esa máquina en específico) e intentar a conectarte de nuevo:

sysadmin@localhost:~$ cat ~/.ssh/known_hosts
test ssh-rsa AAAAB3NzaC1yc2EAAAAmIwAAAQEAklOUpkDHrfHY17SbrmTIp/RZ0V4DTxgq9wzd+ohy006SWDSGPA+nafzlHDPOW7vdI4mZ5ew18KL4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSrg0cda3Pbv7kOdJ/MTyBlWXFCRH+Cv3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7BA
t5FaiKoAfncM1Q8x3+2V0Ww71/eIFmb1zuUFljHYTprrX88XypNDvjYNby6vw/Pb0rwprz/Tn
mZAW3UX+PnTPI89ZPmNBLuxyrD2cE86Z/il8b+gw3r3+1nJotmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+ghw==
sysadmin@localhost:~$ rm ~/.ssh/known_hosts
sysadmin@localhost:~$ ssh bob@test
The authenticity of host ‘test (127.0.0.1)’ can’t be established.
RSA key fingerprint is c2:0d:ff:27:4c:f8:69:a9:c6:3e:13:da:2f:47:e4:c9.
Are you sure you want to continue connection (yes/no)? yes
Warning: Permanently added ‘test’ (RSA) to the list of known hosts.
bob@test’s password:
Last login: Fri Oct   4 16:14:39 CDT 2013  from localhost                      
bob@test:~$

Las Cuentas de Usuario

Hay varios archivos de texto en el directorio /etc que contienen los datos de la cuenta de los usuarios y grupos definidos en el sistema. Por ejemplo, si quisieras ver si está definida una cuenta de usuario específica en el sistema, el lugar para comprobar es el archivo /etc/passwd.

El archivo /etc/passwd define parte de la información de la cuenta para las cuentas de usuario. Curiosamente, las contraseñas para las cuentas no se almacenan en el archivo /etc/passwd, tal como lo indica el nombre del archivo, sino más bien el archivo /etc/shadow.

El Archivo /etc/passwd

Cada línea del archivo /etc/passwd se refiere a una cuenta de usuario. El siguiente gráfico muestra las diez primeras líneas de un archivo /etc/passwd típico:

sysadmin@localhost:~$ head /etc/passwd                                        
root:x:0:0:root:/root:/bin/bash                                               
daemon:x:1:1:daemon:/usr/sbin:/bin/sh                                         
bin:x:2:2:bin:/bin:/bin/sh                                                    
sys:x:3:3:sys:/dev:/bin/sh                                                    
sync:x:4:65534:sync:/bin:/bin/sync                                            
games:x:5:60:games:/usr/games:/bin/sh                                         
man:x:6:12:man:/var/cache/man:/bin/sh                                         
lp:x:7:7:lp:/var/spool/lpd:/bin/sh                                            
mail:x:8:8:mail:/var/mail:/bin/sh                                             
news:x:9:9:news:/var/spool/news:/bin/sh                                       
sysadmin@localhost:~$

Cada línea está dividida en campos por dos puntos. Los campos de izquierda a derecha son los siguientes:

name:password placeholder:user id:primary group id:comment:home directory:shell

La siguiente tabla describe cada uno de estos campos en detalle, usando la primera línea de la salida en el ejemplo anterior (root:x:0:0:root:/root:/bin/bash):

CampoEjemploDescripción
namerootEs el nombre de la cuenta. Este nombre lo utiliza una persona cuando inicia sesión en el sistema y cuando la propiedad del archivo viene proporcionada por el comando ls -l. Por lo general, el sistema utiliza el ID de usuario (véase abajo) internamente y se proporciona el nombre de cuenta para que a los usuarios regulares se les haga más fácil referirse a la cuenta. Normalmente, la cuenta root es una cuenta administrativa especial. Sin embargo, es importante tener en cuenta que no todos los sistemas tienen una cuenta root, y en realidad, el ID de usuario 0 (cero) proporciona los privilegios administrativos en el sistema.
password placeholderxAntes, la contraseña se guardaba en esta ubicación, ahora se almacena en el archivo /etc/shadow. La x en el campo del marcador de posición de la contraseña indica al sistema que la contraseña no se almacena aquí, sino más bien en el archivo /etc/shadow.
user id0Cada cuenta tiene asignado un Id. de usuario (UID «User ID» en inglés). El UID es lo que realmente define la cuenta, ya que el nombre de usuario normalmente no es utilizado directamente por el sistema. Por ejemplo, los archivos son propiedad de los UID, no de los nombres de usuario. Algunos UID son especiales. Por ejemplo, el UID 0 le da a la cuenta de usuario privilegios administrativos. Los UID por debajo de 500 (en algunas distribuciones de Linux 1.000) están reservados para las cuentas del sistema.
primary group id0Cada archivo y directorio es propiedad de una cuenta de usuario. Normalmente la persona que crea la cuenta posee el archivo. Además, cada archivo es propiedad de un grupo, normalmente del grupo primario del usuario. A los grupos se les asignan identificadores numéricos al igual que a los usuarios. Cuando un usuario crea un archivo, el archivo es propiedad del UID del usuario y también de un id de grupo (GID «Group ID» en inglés), el GID primario del usuario. Este campo define que GID es el GID primario del usuario. Además, al proporcionar la propiedad del grupo por defecto en un archivo, este campo también indica que el usuario es un miembro del grupo, lo que significa que el usuario tendrá permisos especiales en cualquier archivo que pertenece a este grupo. Los permisos se cubrirán en detalle en un capítulo posterior.
commentrootEste campo puede contener cualquier información sobre el usuario, incluyendo su nombre real (completo) y otra información útil. Este campo también se llama el campo GECOS (General Electric Comprehensive Operating System). El GECOS es un formato predefinido usado raramente para este campo que define una lista de elementos separada por comas, incluyendo el nombre completo del usuario, ubicación de la oficina, número de teléfono e información adicional. El administrador puede modificar la información GECOS con el comando chfn y los usuarios pueden ver esta información con el comando finger.
home directory/rootEste campo define la ubicación del directorio home del usuario. Para los usuarios regulares, esto sería normalmente /home/username donde username se reemplaza con el nombre de usuario del usuario. Por ejemplo, un nombre de usuario bob tendría un directorio home /home/bob. El usuario root tiene normalmente una ubicación diferente para el directorio home: /root. Las cuentas del sistema raramente tienen directorios, ya que normalmente no se utilizan para crear o guardar los archivos.
shell/bin/bashAquí está ubicado el shell del inicio de la sesión del usuario. De forma predeterminada, el usuario se «ubica en» este shell siempre que el usuario inicia la sesión en un entorno de línea de comandos o abre una ventana de terminal. El usuario luego puede pasar a un shell diferente escribiendo el nombre del shell, por ejemplo: /bin/tcsh. El shell bash (/bin/bash) es el más común para los usuarios de Linux.

El Archivo /etc/shadow

El archivo /etc/shadow contiene información de la cuenta relacionada con la contraseña del usuario. Un archivo /etc/shadow típico sería como el siguiente gráfico:

root@localhost:~# head /etc/shadow                                           
root:$6$4Yga95H9$8HbxqsMEIBTZ0YomlMffYCV9VE1SQ4T2H3SHXw41M02SQtfAdDVE9mqGp2hr20q
.ZuncJpLyWkYwQdKlSJyS8.:16464:0:99999:7:::                                    
daemon:*:16463:0:99999:7:::                                                   
bin:*:16463:0:99999:7:::                                                      
sys:*:16463:0:99999:7:::                                                      
sync:*:16463:0:99999:7:::                                                     
games:*:16463:0:99999:7:::                                                    
man:*:16463:0:99999:7:::                                                      
lp:*:16463:0:99999:7:::                                                       
mail:*:16463:0:99999:7:::                                                     
news:*:16463:0:99999:7:::                                                     
root@localhost:~#

Los campos del archivo /etc/shadow son:

name:password:last change:min:max:warn:inactive:expire:reserved

La siguiente tabla describe los campos del archivo /etc/shadow con más detalle, utilizando la siguiente cuenta la cuál describe a una cuenta de usuario típica:

sysadmin:$6$lS6WJ9O/fNmEzrIi$kO9NKRBjLJJTlZD.L1Dc2xwcuUYaYwCTS.gt4elijSQW8ZDp6GLYAx.TRNNpUdAgUXUrzDuAPsYs5YHZNAorI1:15020:5:30:7:60:15050:
CampoEjemploDescripción
namesysadminEste es el nombre de la cuenta, que coincide con el nombre de cuenta en el archivo /etc/passwd.
password$6$.........rI1El campo passwd contiene la contraseña cifrada de la cuenta. Esta cadena muy larga (que está truncada en el ejemplo a la izquierda de esta celda) es un cifrado unidireccional, lo que significa que no puede «revertirse» para determinar la contraseña original. Mientras que los usuarios habituales tienen contraseñas encriptadas en este campo, las cuentas del sistema tendrán un carácter de * en este campo.
last change15020Este campo contiene un número que representa la última vez que la contraseña fue cambiada. El número 15020 es el número de días desde el 01 de enero de 1970 (llamada la Época) y el último día en el que la contraseña de la cuenta fue cambiada. Este valor se genera automáticamente cuando se modifica la contraseña del usuario. Este valor es importante ya que se utiliza por característica de envejecimiento de la contraseña proporcionado por el resto de los campos de este archivo.
min5Este es uno de los campos del envejecimiento de la contraseña; un valor distinto de cero en este campo indica que después de que un usuario cambiara su contraseña, la contraseña no se puede cambiar otra vez por un número específico de días (5 en este ejemplo). Este campo es importante cuando se utiliza el campo max (véase abajo). Un valor de cero en este campo significa que el usuario siempre puede cambiar su contraseña.
max5Este campo se utiliza para obligar a los usuarios a cambiar regularmente sus contraseñas. Un valor de 30 en este campo significa que el usuario debe cambiar su contraseña al menos cada 30 días para evitar que su cuenta quede «bloqueada» Ten en cuenta que si el campo min se establece en 0, el usuario puede restablecer inmediatamente su contraseña al valor original, anulando el propósito de obligar al usuario a cambiar su contraseña cada 30 días. Así que, si se establece el campo max, normalmente se establece también el campo min. Por ejemplo, un min:max de 5:60 se refiere a que el usuario debe cambiar su contraseña cada 60 días y, después de cambiarla, el usuario debe esperar 5 días antes de que pueda cambiar su contraseña otra vez. Si el campo max se establece a 99999, el valor máximo posible, entonces el usuario esencialmente nunca debe cambiar su contraseña (porque 99999 días son aproximadamente 274 años).
warn7Si se establece el campo max, el campo warn indica que al usuario se le «advertirá» cuando se acerca el plazo máximo max. Por ejemplo, si se establece warn a 7, entonces en cualquier momento durante los 7 días anteriores al plazo max se le advertirá al usuario que cambie su contraseña durante el proceso del inicio de sesión. El usuario sólo se advierte en el inicio de sesión, por lo que algunos administradores prefieren establecer el campo de advertencia a un valor alto para proporcionar una mayor probabilidad de tener una advertencia emitida. Si el plazo máximo max se establece al valor de 99999, entonces el campo warn es esencialmente inútil
inactive60Si el usuario hace caso omiso a las advertencias y se excede el plazo max para la contraseña, se bloqueará su cuenta. En tal caso, el campo inactive proporciona al usuario un período de «gracia» en el que puede cambiar su contraseña, pero sólo durante el proceso del inicio de sesión. Si el campo inactive viene establecido a un valor de 60, el usuario tiene 60 días de gracia para cambiar la contraseña a una nueva. Si no lo hace, entonces necesitará que el administrador restablezca la contraseña para el usuario.
expire15050Este campo representa el número de días a partir del 01 de enero del 1970 y el día en el que la cuenta «vencerá». Una cuenta vencida se bloqueará, no se borra, lo que significa que el administrador puede restablecer la contraseña para desbloquear la cuenta. Las cuentas con fechas de vencimiento normalmente se ofrecen a los empleados temporales o contratistas. La cuenta caducará automáticamente después del último día laboral del usuario. Cuando un administrador establece este campo, se utiliza una herramienta para convertir una fecha real en una fecha de «Época». En Internet hay varios convertidores disponibles.
reservedActualmente este campo no se utiliza y está reservado para su uso futuro.

Los usuarios regulares no pueden ver el contenido del archivo /etc/shadow por razones de seguridad. Para ver el contenido de este archivo, debes iniciar la sesión como administrador (la cuenta root).

Visualizar la Información de la Cuenta

Una buena manera de visualizar la información de la cuenta del archivo /etc/passwd es usar el comando grep para dar salida solamente a la línea que contiene la cuenta que te interesa ver. Por ejemplo, para ver la información de la cuenta del nombre de usuario llamado sysadmin, utiliza el comando grep sysadmin /etc/passwd:

sysadmin@localhost:~$ grep sysadmin /etc/passwd                               
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash        
sysadmin@localhost:~$

Otra técnica para recuperar la información del usuario que se encuentra normalmente en los archivos /etc/passwd y /etc/shadow es utilizar el comando getent. Una ventaja de usar el comando getent es que puede recuperar la información de la cuenta definida localmente (/etc/passwd y /etc/shadow) o en un servidor de directorio en la red.

La sintaxis general de un comando getent es: getent database record «o getent registro de base de datos» . Por ejemplo, el comando getent passwd sysadmin recuperaría la información passwd de la cuenta para el usuario sysadmin:

sysadmin@localhost:~$ getent passwd sysadmin                                  
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash        
sysadmin@localhost:~$

Visualización de la Información del Inicio de sesión

Si inicias sesión con diferentes cuentas, puede ser confuso saber cómo quién estás conectado. Para verificar tu identidad (ver qué cuenta estás usando actualmente) puedes ejecutar el comando id.

El comando id informará la identidad actual, tanto por nombre del usuario como por el identificador de usuario. Además de proporcionar la información de la cuenta de usuario, también se muestra la pertenencia a un grupo. Sin argumentos, el comando id mostrará tu identidad. Cuando un nombre de usuario viene como argumento, tal como id root, el comando muestra otra información de cuenta:

sysadmin@localhost:~$ id                                                      
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo) context=unconfined_u:unconfined_r:unconfined t:s0-s0:c0.c1023 
sysadmin@localhost:~$                                                         
sysadmin@localhost:~$ id  root                                                
uid=0(root) gid=0(root) groups=0(root)                                        
sysadmin@localhost:~$

La salida incluye un contexto Linux mejorado de seguridad (SELinux), la parte context= de la salida, un tema que está fuera del alcance de esta lectura.

Las Cuentas de Sistema

Los usuarios iniciarán sesión en el sistema utilizando cuentas de usuario regulares. Normalmente, estas cuentas tienen valores UID superiores a 500 (en algunos sistemas 1000).

El usuario root tiene acceso especial al sistema, este acceso especial en realidad se proporciona a la cuenta con el UID de 0.

Hay cuentas adicionales que no están diseñadas para que los usuarios inicien sesión. Estas cuentas, normalmente de UID 1 al UID 499 se llaman cuentas del sistema y están diseñadas para proporcionar cuentas para los servicios que se ejecutan en el sistema.

Las cuentas del sistema tienen algunos campos en los archivos /etc/passwd y /etc/shadow que son diferentes a otras cuentas. Por ejemplo, en el archivo /etc/passwd, las cuentas de sistema tendrán un programa de no iniciar sesión en el campo del «login shell»:

bin:x:1:1:bin:/bin:/sbin:/sbin/nologin

En el archivo /etc/shadow, las cuentas del sistema tendrán típicamente el carácter * en lugar del campo de contraseña:

bin:*:15513:0:99999:7:::

Hay algunas cosas importantes que debes recordar sobre las cuentas de sistema:

  • La mayoría son necesarias para que el sistema funcione correctamente.
  • No debes eliminar una cuenta del sistema a menos que estés absolutamente seguro de que eliminando la cuenta no causará problemas.
  • Según vayas teniendo más experiencia, debes aprender lo que hace cada cuenta del sistema. Los administradores del sistema tienen la tarea de garantizar la seguridad en el sistema esto incluye correctamente asegurar las cuentas del sistema.

Cuentas de Grupo

Tu nivel de acceso a un sistema no está determinado únicamente por tu cuenta de usuario. Cada usuario puede ser miembro de uno o más grupos, lo que también puede afectar tu nivel de acceso al sistema.

Tradicionalmente, los sistemas UNIX limitaban a los usuarios para que pertenecieran a no más de un total de dieciséis grupos, pero los últimos núcleos de Linux soportan usuarios con más de sesenta y cinco mil membresías .

El archivo /etc/passwd define la pertenencia al grupo primario de un usuario. La pertenencia a un grupo suplementario (o pertenencia a un grupo secundario), así como los propios grupos, se definen en el archivo /etc/group.

Para ver la información sobre un grupo específico, puede utilizarse el comando grep o getent. Por ejemplo, los siguientes comandos mostrarán la información de cuenta de grupo mail:

sysadmin@localhost:~$ grep mail /etc/group
mail:x:12:mail,postfix
sysadmin@localhost:~$ getent group mail
mail:x:12:mail,postfix

El Archivo /etc/group

El archivo /etc/group es un archivo delimitado por dos puntos con los siguientes campos:

group_name:password_placeholder:GID:user_list

La siguiente tabla describe los campos del archivo /etc/group con más detalle, utilizando una línea que describe a una cuenta de grupo típica:

mail:x:12:mail,postfix
CampoEjemploDescripción
group_namemailEste campo contiene el nombre del grupo. Igual que en el caso de los nombres de usuario, para las personas es más fácil recordar los nombres de grupo. El sistema utiliza típicamente IDs de grupos (GID) en lugar de nombres de grupo.
password_placeholderxAunque hay contraseñas para grupos, raramente se utilizan en Linux. Si el administrador creará una contraseña de grupo, se almacenaría en un archivo diferente (/etc/gshadow) ya que la contraseña de grupo ya no se almacena en el archivo /etc/group. La x en este campo se utiliza para indicar que la contraseña no se almacena en este archivo. Las contraseñas de grupo están más allá del alcance de este curso.
GID12Cada grupo está asociado con un ID de grupo único (GID) que se coloca en este campo.
user_listmail,postfixEste último campo se utiliza para indicar quién es un miembro del grupo. Mientras que la pertenencia a un grupo primario se define en el archivo /etc/passwd, los usuarios que se asignan a los grupos adicionales tendrían su nombre de usuario en este campo del archivo /etc/group. En este caso, los usuarios mail y postfix son miembros secundarios del grupo mail. Es muy común para un nombre de usuario aparecer también como un nombre del grupo. También es común que un usuario pertenezca a un grupo con el mismo nombre.

Visualizando la Información del Grupo

Los grupos se utilizan principalmente para controlar el acceso a los archivos. De forma predeterminada, cualquier nuevo archivo que un usuario crea, será propiedad del grupo primario del usuario. El comando id se puede utilizar para verificar el grupo primario del usuario:

sysadmin@localhost:~$ id -g                                                   
1001

Los usuarios también pueden acceder a los archivos y dispositivos si son miembros de los grupos secundarios. El comando id se puede utilizar también para verificar la pertenencia a los grupos secundarios del usuario:

sysadmin@localhost:~$ id -G                                                   
1001 4 27

Sin pasar opciones al comando, id listará tanto la pertenencia a los grupos primarios como a los grupos secundarios:

sysadmin@localhost:~$ id                                                      
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo)

Se puede agregar un nombre de usuario para determinar los grupos de un usuario específico:

sysadmin@localhost:~$ id sysadmin                                             
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo)

Esto se alinea con el contenido del archivo /etc/group, cuando se revela la búsqueda para el sysadmin:

sysadmin@localhost:~$ id sysadmin                                             
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo)

Cambiando la Propiedad de Grupo de un Archivo Existente

Para cambiar al grupo propietario de un archivo existente se puede utilizar el comando chgrp group_name file «o chgrp nombre_de_grupo archivo». Los usuarios sólo pueden cambiar la propiedad de los archivos que poseen. El nuevo grupo propietario del archivo también debe ser un grupo al que pertenece el usuario:

sysadmin@localhost:~$ touch sample                                            
sysadmin@localhost:~$ ls -l sample                                            
-rw-rw-r-- 1 sysadmin sysadmin 0 Dec 10 00:44 sample                          
sysadmin@localhost:~$ chgrp games sample                                      
-rw-rw-r--. 1 sysadmin games 0 Oct 23 22:12 sample
sysadmin@localhost:~$

Para cambiar el grupo propietario de todos los archivos en una estructura de directorios, utiliza la opción -R para el comando chgrp. Por ejemplo, el comando chgrp -R games test_dir cambiaría la propiedad del grupo en el directorio test_dir y de todos los archivos y subdirectorios del directorio test_dir.

También existe un comando chown que se puede utilizar para cambiar al usuario propietario de un archivo o directorio. Sin embargo, este comando lo puede utilizar solamente el usuario root. Los usuarios normales no pueden «dar» sus archivos a otro usuario.

Configurar el Comando sudo

Si el comando sudo no es configurado automáticamente durante la instalación, se puede configurar manualmente después de la instalación. Inicialmente, esto requerirá iniciar sesión como usuario root (o usando el comando su para cambiar a la cuenta de root), pero después de su configuración, los usuarios especificados podrán ejecutar los comandos sudo. Puedes configurar el acceso al comando sudo ejecutando el comando visudo.

El comando visudo te pasa al programa editor, por defecto el editor vi (o vim) en la mayoría de los sistemas, el que puede ser un reto para los usuarios principiantes Linux. Para configurar otro editor, exporta la variable EDITOR con el valor del editor que prefieres. Por ejemplo, para usar el editor gedit en vez de vi/vim, ejecutarías el comando export EDITOR=gedit antes de ejecutar el comando visudo.

Utilizando el comando visudo se abrirá el archivo de configuración /etc/sudoers para editar. Configuraciones avanzadas del comando sudo se pueden realizar a través de este archivo. Básicamente, en este archivo se realizan las entradas para especificar qué usuario (usuarios) y en cuáles de las máquinas pueden utilizar el comando sudo para ejecutar los comandos como otro usuario.

Esta entrada predeterminada…

root	ALL=(ALL) 	ALL

…se puede leer como, «el usuario root puede actuar como TODOS los usuarios en TODAS las máquina para ejecutar TODOS los comandos.» Para que un usuario como el sysadmin ejecute todos los comandos como todos los usuarios utilizando el comando sudo, podría añadirse una entrada similar a la siguiente:

sysadmin ALL=(ALL) ALL

Utilizando el Comando who

El comando who muestra una lista de usuarios que están conectados actualmente en el sistema, desde dónde están conectados y cuándo iniciaron sesión. Mediante el uso de opciones este comando puede mostrar información como el nivel de ejecución actual (un estado funcional de la computadora) y la hora del arranque del sistema.

Por ejemplo:

sysadmin@localhost:~$ who
root     	tty2        2013-10-11 10:00
sysadmin	tty1        2013-10-11 09:58 (:0)
sysadmin 	pts/0       2013-10-11 09:59 (:0.0)
sysadmin 	pts/1       2013-10-11 10:00 (example.com)

La tabla siguiente describe la salida del comando who:

ColumnaEjemploDescripción
usernamerootEsta columna indica el nombre del usuario que inició la sesión. Ten en cuenta que por «sesión» nos referimos a «cualquier proceso de inicio de sesión y cualquier ventana de la terminal abierta».
terminaltty2Esta columna indica en qué ventana de terminal está trabajando el usuario. Si el nombre de la terminal inicia con tty , entonces esto es una indicación de un inicio de sesión local, está es una terminal de línea de comandos regular. Si el nombre de la terminal inicia con pts, entonces esto indica que el usuario está usando una pseudo terminal o corriendo un proceso que actúa como la terminal. Esto puede significar que el usuario tiene una aplicación de terminal corriendo en X Windows, como gnome-terminal o xterm o pueden haber usado un protocolo de red para conectarse al sistema, como ssh o telnet.
date2013-10-11 10:00 (example.com)l Esto indica cuándo inició sesión el usuario. Después de la fecha y la hora en que el usuario inició sesión en el sistema, puede aparecer alguna información de localización. Si la información de localización contiene un nombre de host, nombre de dominio o dirección IP, entonces el usuario inició sesión remotamente. Si hay dos puntos y un número, entonces esto indica que han hecho un inicio de sesión gráfico local. Si no se muestra información de localización en la última columna, entonces esto significa que el usuario inició sesión mediante un proceso de línea de comandos local.

Si quieres visualizar la información sobre el estado del sistema, el comando who puede hacerlo utilizando varias opciones. Por ejemplo, la opción -b mostrará la última vez que el sistema se inició (fue arrancado) y la opción -r mostrará el tiempo en el cual el sistema haya alcanzado un cierto nivel ejecución:

Usando el Comando w

El comando w proporciona una lista más detallada sobre los usuarios que actualmente están en el sistema que el comando who. También proporciona un resumen del estado del sistema. Por ejemplo:

sysadmin@localhost:~$ w
 10:44:03 up 50 min,  4 users,  load average: 0.78, 0.44, 0.19
USER     	TTY     FROM	    LOGIN@   IDLE  	JCPU   	PCPU    WHAT
root     	tty2    -           10:00    43:44 	0.01s  	0.01s   -bash
sysadmin 	tty1    :0          09:58    50:02	5.68s 	0.16s   pam: gdm-password
sysadmin	pts/0   :0.0        09:59    0.00s      0.14s  	0.13s   ssh 192.168.1.2
sysadmin 	pts/1   example.com 10:00    0.00s  	0.03s  	0.01s   w

La primera línea de la salida del comando w es idéntica a la comando uptime. Muestra la hora actual, cuánto tiempo el sistema ha estado funcionando, el número total de inicios de sesión actuales (usuarios) y el promedio de la carga en el sistema en los últimos 1, 5 y 15 minutos. El promedio de carga es el uso de la CPU donde un valor de 100 significaría un uso completo de la CPU durante ese periodo de tiempo.

La tabla siguiente describe el resto de la salida del comando w:


Column
EjemploDescipción
USERrootEsta columna indica el nombre del usuario que inició la sesión.
TTYtty2Esta columna indica en qué ventana de terminal el usuario está trabajando.
FROMexample.comDesde dónde inició sesión el usuario.
LOGIN@10:00Cuándo inició sesión el usuario.
IDLE43:44Cuánto tiempo el usuario ha estado inactivo desde la ejecución del último comando.
JCPU0.01sEl tiempo total de cpu (s=segundos) utilizado por todos los procesos (programas) ejecutados desde el inicio de sesión.
PCPU0.01sEl tiempo total de cpu para el proceso actual.
WHAT-bashEl proceso actual que está ejecutando el usuario.

Crear un Grupo

La razón más común para crear un grupo es que los usuarios puedan compartir archivos. Un ejemplo de esto podría ser cuando hay varias personas trabajando juntas en el mismo proyecto y necesitan colaborar en documentos almacenados en archivos para el proyecto. En este escenario, el administrador puede hacer a estas personas miembros de un grupo común, cambiar la propiedad del directorio al nuevo grupo y establecer permisos en el directorio que sólo permitirá a los miembros del grupo acceder a los archivos.

Después de crear o modificar un grupo, puedes verificar los cambios mediante la visualización de la información de configuración del grupo en el archivo /etc/group con el comando grep. Si trabajas con los servicios de autenticación de red, entonces el comando getent puede mostrar los grupos locales y en la red. Para uso local, estos comandos muestran el mismo resultado, en este caso para el grupo de root:

root@localhost:~# grep root /etc/group
root:x:0:
root@localhost:~# getent group root
root:x:0:

El comando groupadd puede ser ejecutado por el usuario root para crear un nuevo grupo. El comando requiere solamente el nombre del grupo que se creará. La opción -g puede utilizarse para especificar un id de grupo para el grupo nuevo:

root@localhost:~# groupadd -g 506 research
root@localhost:~# grep research /etc/group
research:x:506:

Si no se proporciona la opción -g, el comando groupadd proporcionará automáticamente un GID para el grupo nuevo. Para lograr esto, el comando groupadd ve el archivo /etc/group y utiliza un número que es de un valor mayor que el mayor número GID actual. La ejecución de los comandos siguientes ilustra esto:

root@localhost:~# grep research /etc/group
research:x:506:
root@localhost:~# groupadd development
root@localhost:~# grep development /etc/group
development:x:507:

Consideraciones para el ID de Grupo

En algunas distribuciones de Linux, particularmente las basadas en Red Hat, cuando se crea un ID de usuario (UID), también se crea un grupo privado de usuario (UPG) con ese usuario como único miembro. En estas distribuciones, el UID del usuario y el id de grupo privado deben coincidir (tener el mismo número).

Por lo tanto, no debes crear los GIDs en los mismos rangos numéricos donde se espera crear identificadores de usuario (UIDs), con el fin de evitar un conflicto entre un GID creado frente a un número UPG que se crea para que coincida con un UID.

Recuerda que los GID bajo 500 están reservados para uso del sistema. Puede haber ocasiones en las que quieras asignar un GID menor de 500. Para lograr esto, utiliza -r. La opción -r asignará un GID al nuevo grupo que será menor que el estándar más bajo de UID:

root@localhost:~# groupadd -r sales
root@localhost:~# getent group sales 
sales:x:491:

Consideraciones para Nombrar un Grupo

Seguir estas directrices para los nombres de grupo te ayudará a seleccionar un nombre de grupo que sea portable (funcione correctamente con otros sistemas o servicios):

  • El primer carácter del nombre debe ser un guión bajo _ o un carácter alfabético en minúsculas a-z.
  • En la mayoría de las distribuciones de Linux se permite hasta 32 caracteres, pero usar más de 16 puede ser problemático, ya que algunas distribuciones no pueden aceptar más de 16.
  • Después del primer carácter, los caracteres restantes pueden ser alfanuméricos, un guión - o un guión bajo _.
  • El último carácter no debe ser un guión -.

Lamentablemente estas pautas no se aplican siempre. El problema no es que el comando groupadd fracase, sino que otros comandos o servicios del sistema no funcionen correctamente.

Modificar un Grupo

El comando groupmod se puede utilizar para cambiar el nombre del grupo (con la opción -n) o cambiar el GID (con la opción -g) para el grupo.ADVERTENCIA: Cambiar el nombre del grupo puede causar confusión para los usuarios que estaban familiarizados con el antiguo nombre y no hayan sido informados del nombre nuevo. Sin embargo, cambiar el nombre del grupo no causará problemas con el acceso a los archivos, ya que los archivos son propiedad del GID, no de los nombres de grupo. Por ejemplo:

root@localhost:~# ls -l index.html
-rw-r-----. 1 root sales 0 Aug  1 13:21 index.html
root@localhost:~# groupmod -n clerks sales
root@localhost:~# ls -l index.html
-rw-r-----. 1 root clerks 0 Aug  1 13:21 index.html

Después del comando groupmod anterior, el archivo index.html tiene un nombre de propietario de grupo diferente. Sin embargo, todos los usuarios que estaban en el grupo sales están ahora en el grupo clerks, así pues, todos los usuarios aún pueden acceder el archivo index.html. Una vez más, esto es porque el grupo se define por el GID, no por el nombre del grupo.

Por otro lado, si cambias el GID para un grupo, entonces todos los archivos que fueron asociados a ese grupo ya no estarán asociados a ese grupo. De hecho, todos los archivos que fueron asociados a ese grupo ya no estarán asociados con ningún nombre de grupo. Por el contrario, estos archivos serán propiedad de un GID solamente tal como se muestra a continuación:

root@localhost:~# groupmod -g 10003 clerks
root@localhost:~# ls -l index.html
-rw-r-----. 1 root 491 13370 Aug  1 13:21 index.html

Estos archivos sin nombre de grupo se denominan archivos «huérfanos». Como usuario root, probablemente quieras buscar todos los archivos que son propiedad de solamente un GID (no asociado con un nombre de grupo). Esto puede lograrse con la opción -nogroup para el comando find:

root@localhost:~# find / -nogroup 
/root/index.html

Eliminando un Grupo

Si quieres eliminar un grupo con el comando groupdel, ten en cuenta que los archivos que pertenecen a ese grupo se convertirán en «huérfanos».

Sólo se puede eliminar a los grupos suplementarios, por lo que si un grupo es el grupo primario para cualquier usuario, no se puede eliminar. El administrador puede modificar qué grupo es el grupo primario del usuario, por lo que un grupo que estaba siendo utilizado como un grupo primario se puede transformar en un grupo suplementario y luego se puede eliminar.

Mientras que el grupo que se vaya a eliminar no sea el grupo principal del usuario, eliminar el grupo se logra mediante el comando groupdel junto con el nombre del grupo:

 root@localhost:~# groupdel clerks

Archivo /etc/default/useradd

Antes de empezar a crear los usuarios para el sistema, debes verificar o establecer los valores prácticos que se utilizarán por defecto con el comando useradd. Esto se puede lograr modificando la configuración en los archivos de configuración utilizados por el comando useradd.

Asegurarse de que los valores en estos archivos de configuración sean razonables antes de agregar usuarios puede ayudarte a ahorrar tiempo y la molestia de tener que corregir la configuración de la cuenta de usuario después de agregar los usuarios.

La opción -D del comando useradd te permitirá visualizar o modificar algunos de los valores por defecto utilizados por el comando useradd. Los valores indicados por useradd -D también pueden visualizarse o actualizar mediante la manipulación del archivo /etc/default/useradd:

root@localhost:~# useradd -D 
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

La siguiente tabla describe cada uno de estos valores:

CampoEjamploDescripción
GROUP100En las distribuciones que no usan UPG, este será el grupo principal de forma predeterminada para un usuario nuevo, si no se ha especificado uno con el comando useradd. Este normalmente es el grupo de «users» («usuarios» en español) con un GID de 100. Esta configuración afecta a la configuración por defecto del archivo /etc/passwd resaltado abajo: bob:x:600:600:bob:/home/bob:/bin/bash La opción -g para el comando useradd permite utilizar un grupo principal diferente al predeterminado, cuando se crea una nueva cuenta de usuario.
HOME/homeEl directorio /home es el directorio base predeterminado, en el cuál se creará un nuevo directorio home del usuario. Esto significa que un usuario con un nombre de cuenta de bob tendría un directorio de /home/bob. Esta configuración afecta a la configuración por defecto del archivo /etc/passwd resaltado abajo: bob:x:600:600:bob:/home/bob:/bin/bash La opción -b para el comando useradd permite utilizar un directorio base diferente al predeterminado, cuando se crea una nueva cuenta de usuario.
INACTIVE-1Este valor representa el número de días después de que caduca la contraseña hasta que la cuenta será deshabilitada. Un valor de -1 significa que esta función no está habilitada por defecto y no se proporciona ningún valor «inactivo» para las nuevas cuentas por defecto. Esta configuración afecta a la configuración por defecto del archivo /etc/shadow resaltado abajo: bob:pw:15020:5:30:7:60:15050: La opción -f para el comando useradd permite utilizar un valor INACTIVE diferente al predeterminado, cuando se crea una nueva cuenta de usuario.
EXPIREPor defecto, no hay ningún valor para la fecha de caducidad. Generalmente, una fecha de vencimiento se configura para una cuenta individual, no a todas las cuentas. Por ejemplo, si tuvieras un contratista que fuese contratado para trabajar hasta el final del día 01 de noviembre de 2013, podrías asegurarte de que no pueda iniciar sesión después de esa fecha, utilizando el campo de EXPIRE. Esta configuración afecta a la configuración por defecto del archivo /etc/shadow resaltado abajo: bob:pw:15020:5:30:7:60:15050: La opción -e para el comando useradd permite utilizar un valor EXPIRE diferente al predeterminado, cuando se crea una nueva cuenta de usuario.
SHELL/bin/bashEl valor de SHELL indica el shell por defecto para los usuarios cuando inician sesión en el sistema. Esta configuración afecta a la configuración por defecto del archivo /etc/passwd resaltado abajo: bob:x:600:600:bob:/home/bob:/bin/bash La opción -s para el comando useradd permite utilizar un shell de inicio de sesión diferente al predeterminado, cuando se crea una nueva cuenta de usuario.
SKEL/etc/skelEl valor SKEL determina qué directorio «esqueleto» tendrá su contenido copiado en el directorio home de los usuarios nuevos. El contenido de este directorio se copia en el directorio home del usuario nuevo y el nuevo usuario recibe la propiedad de los nuevos archivos. Esto proporciona a los administradores una manera fácil de «rellenar» una nueva cuenta de usuario con los archivos de configuración clave. La opción -k para el comando useradd permite utilizar un directorio SKEL diferente al predeterminado, cuando se crea una nueva cuenta de usuario.
CREATE_MAIL_SPOOLyesEl «mail spool» («carrete de correo» en español) es un archivo donde se coloca el correo entrante. Actualmente el valor para crear un mail spool es yes, lo que significa que los usuarios por defecto están configurados con la capacidad de recibir y guardar correo local. Si no piensas usar el correo local, este valor puede cambiarse a no.

Para modificar uno de los valores por defecto del useradd, el archivo /etc/default/useradd puede editarse con un editor de texto. Otra técnica (más segura) es usar el comando useradd -D.

Por ejemplo, si quieres permitir a los usuarios con una contraseña caducada seguir iniciando la sesión con un máximo de treinta días, puedes ejecutar lo siguiente:

root@localhost:~# useradd -D -f 30
root@localhost:~# useradd -D
GROUP=100
HOME=/home
INACTIVE=30
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

Archivo /etc/login.defs

El archivo /etc/login.defs también contiene valores que se aplicarán por defecto a los nuevos usuarios que vayas a crear con el comando useradd. A diferencia del /etc/default/useradd, que puede ser actualizado con el comando useradd -D, el archivo /etc/login.defs generalmente lo edita directamente el administrador para modificar sus valores.

Este archivo contiene muchos comentarios y líneas en blanco, así que si quieres ver las líneas que no son comentarios o líneas en blanco (la configuración actual), puede utilizar el siguiente comando grep:

root@localhost:~#  grep -Ev '^#|^$' /etc/login.defs
MAIL_DIR	/var/spool/mail
PASS_MAX_DAYS	99999
PASS_MIN_DAYS	0
PASS_MIN_LEN	5
PASS_WARN_AGE	7
UID_MIN			  500
UID_MAX			60000
GID_MIN			  500
GID_MAX			60000
CREATE_HOME	yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
MD5_CRYPT_ENAB no

El ejemplo anterior representa un típico archivo /etc/login.defs de la distribución CentOS 6 con sus valores. La siguiente tabla describe cada uno de estos valores:

CampoEjemploDescripción
MAIL_DIR/var/mail/spoolEl directorio en el que se crea el archivo mail spool del usuario.
PASS_MAX_DAYS99999Esta configuración determina el número máximo de días en los que un usuario podrá utilizar la misma contraseña. Puesto que por defecto viene configurado el valor de 99999 días o más de 200 años, significa que los usuarios nunca tienen que cambiar su contraseña. Las organizaciones con políticas eficaces para el mantenimiento de contraseñas seguras comúnmente cambian este valor a 60 o 30 días. Esta configuración afecta a la configuración por defecto del archivo /etc/shadow resaltado abajo: bob:pw:15020:5:30:7:60:15050:
PASS_MIN_DAYS0Con esto configurado a un valor predeterminado de 0 (cero), el tiempo más corto que un usuario tiene que mantener una contraseña es de cero días, lo que significa que inmediatamente después de configurar la contraseña, se puede cambiar. Si el valor PASS_MIN_DAYS se estableció en 3 días, después de establecer una nueva contraseña, el usuario tendría que esperar tres días antes de que pueda cambiarla otra vez. Esta configuración afecta a la configuración por defecto del archivo /etc/shadow resaltado abajo: bob:pw:15020:3:30:7:60:15050:
PASS_MIN_LEN5Esto indica el número mínimo de caracteres que debe contener una contraseña.
PASS_WARN_AGE7Este es el valor predeterminado para el campo de advertencia. Cuando un usuario se acerca al número máximo de días durante los que puede usar su contraseña, el sistema comprobará si es hora de empezar a avisar al usuario sobre cambiar su contraseña durante el inicio de sesión. Esta configuración afecta a la configuración por defecto del archivo /etc/shadow resaltado abajo: bob:pw:15020:3:30:7:60:15050:
UID_MIN500El UID_MIN determina el primer UID que se asignará a un usuario ordinario. Cualquier usuario con un UID menor que este valor, ya sea para una cuenta del sistema o bien para la cuenta de root.
UID_MAX60000Un UID técnicamente podría tener un valor de más de 4 billones. Para la máxima compatibilidad se recomienda dejarlo en su valor predeterminado de 60000.
GID _MIN500El GID_MIN determina el primer GID que se asignará a un grupo ordinario. Cualquier grupo con un GID menor que este valor, ya sea para un grupo del sistema o bien para el grupo de root.
GID _MAX60000Un GID igual que un UID técnicamente podría tener un valor de más de 4 billones. Cualquier valor que utilices para tu UID_MAX debes utilizar para GID_MAX para soportar UPG.
CREATE_HOMEyesEste valor determina si se crea o no un nuevo directorio para el usuario, al crear su cuenta.
UMASK077Este UMASK funciona en el momento que se crea el directorio home del usuario; determinará cuáles serán los permisos predeterminados de este directorio. Utilizando el valor predeterminado de 077 para UMASK significa que sólo el usuario propietario tendrá algún tipo de permiso para acceder a su directorio.
USERGROUPS_ENAByesEn las distribuciones que cuentan con un grupo privado para cada usuario, como se muestra en este ejemplo CentOS, el USERGROUPS_ENAB tendrá un valor de yes. Si no se utiliza la UPG en la distribución, entonces esto tendrá un valor no.
ENCRYPT_METHODSHA512El método de cifrado que se utiliza para cifrar las contraseñas de los usuarios en el archivo /etc/shadow. El valor de ENCRYPT_METHOD anula la configuración de MD5_CRYPT_ENAB (véase el siguiente renglón).
MD5_CRYPT_ENABnoEste ajuste obsoleto originalmente permitía al administrador especificar el uso del cifrado de contraseñas MD5 en lugar del cifrado original DES. Ahora es reemplazado por el valor de ENCRYPT_METHOD.

Consideraciones de la Cuenta

Crear una cuenta de usuario para usarlo con un sistema Linux puede requerir que reúnas varias piezas de información. Mientras que todo lo que puede ser necesario es el nombre de la cuenta, probablemente quieras planificar el UID, el grupo principal, los grupos suplementarios, el directorio home, el esqueleto de directorio y el shell que vayas a utilizar. A la hora de planificar estos valores, considera lo siguiente:

nombre de usuario: El único argumento necesario para el comando useradd es el nombre que le quieras dar a la cuenta. Este nombre debe seguir las mismas pautas que vimos anteriormente en este capítulo para los nombres de grupo. Para resumir, debe tener 32 caracteres o menos, empezar con una letra en minúscula o un guión bajo y luego sólo debe contener letras minúsculas, números, guiones y guiones bajos. Si el usuario necesita tener acceso a múltiples sistemas, generalmente se recomienda que el nombre de la cuenta sea igual en esos sistemas. El nombre de la cuenta debe ser único para cada usuario.

identificador de usuario (UID): Una vez creado un usuario con un UID específico, el sistema generalmente incrementará el UID solo por uno para el siguiente usuario que vayas a crear. Si estás conectado a una red con otros sistemas, probablemente quieras asegurarte que este UID sea el mismo en todos los sistemas para ayudar a proveer un acceso consistente. La opción -u para el comando useradd te permite especificar el número UID. Los UID por lo general pueden variar de cero a más de 4 mil millones, pero para mayor compatibilidad con los sistemas antiguos, el máximo valor recomendado para el UID es de 60,000.

Tal como habíamos visto previamente, el usuario root tiene un identificador de usuario (UID) de 0, lo que hace que la cuenta tenga privilegios especiales. Cualquier cuenta con un UID de cero actuaría como «administrador».

Las cuentas del sistema son las cuentas que generalmente se utilizan para ejecutar los servicios en segundo plano (llamados daemons). Al no tener los servicios ejecutados como usuario root, se limita la cantidad de daño que se puede hacer con una cuenta de servicio que ha sido comprometida. Las cuentas del sistema utilizadas por los servicios generalmente utilizarán los UID que están en el rango de «reservados». Una cuenta de sistema que es una excepción a esta regla es el usuario nfsnobody, que tiene un UID 65534.

El rango reservado utilizado para las cuentas de servicio se ha ampliado con el tiempo. Originalmente, era para los UID entre 1 y 99. La tendencia actual entre distribuciones es que las cuentas del sistema sean cualquier cuenta que tenga un UID entre 1 y 999, pero se sigue utilizando también el rango de 1-499.

Si estás configurando un nuevo sistema, es una buena práctica a empezar tus UID no inferiores a 1000. Esto también tiene la ventaja para asegurar que tendrás suficientes UID disponibles para muchos servicios del sistema y darte la habilidad de crear muchos GID en el rango «reservado».

grupo primario: En las distribuciones que utilizan UPG, este grupo se creará automáticamente con un GID y un nombre de grupo que coincida con el UID y el nombre de usuario de la cuenta de usuario recién creado. En las distribuciones que no usan UPG, el grupo primario normalmente por defecto es el grupo de «users» («usuarios» en inglés) con un GID de 100. Para especificar un grupo primario con el comando useradd, utiliza la opción -g con el nombre o el GID del grupo.

grupo(s) suplementario(s): Si quieres que el usuario fuera miembro de uno o más grupos suplementarios, la opción -G se puede utilizar para especificar una lista separada por comas de nombres de grupos o números.

directorio home: Por defecto, la mayoría de las distribuciones crearán el directorio home del usuario con el mismo nombre que la cuenta de usuario bajo /home. Por ejemplo, si creas una cuenta de usuario llamada sam, el nuevo directorio home del usuario sería /home/sam. Hay varias opciones para el comando useradd que pueden afectar la creación del directorio home del usuario:

  • La opción -b te permite especificar un directorio diferente bajo el cual se creará el directorio home del usuario. Por ejemplo: -b /test resultaría en /test/sam siendo el directorio home para una cuenta de usuario llamada sam.
  • La opción -d te permite especificar un directorio existente o un nuevo directorio para el usuario. Esto debe ser una ruta de acceso completa para el directorio home del usuario. Por ejemplo: -d /home/sam.
  • La opción -m le dice a useradd que cree el directorio home; esto no es normalmente necesario ya que es el comportamiento predeterminado del comando useradd. Sin embargo, cuando utilices la opción -k (véase abajo) para especificar un esqueleto de directorio diferente, entonces necesitarás la opción -m.
  • La opción -M se utiliza para especificarle al comando useradd que no debe crear el directorio home.

esqueleto de directorio: De forma predeterminada, el contenido del directorio /etc/skel se copia en el directorio home del usuario nuevo. Los archivos resultantes también son propiedad del nuevo usuario. Usando la opción -k con el comando useradd, el contenido de un directorio diferente se puede utilizar para rellenar el directorio home de un usuario nuevo. Cuando se especifica el directorio esqueleto con la opción -k, debe utilizarse la opción -m, de lo contrario el comando useradd fallará mostrando un error que dice: «-k flag is only allowed with the -m flag» (o «La opción -k solo se permite con la opción -m» en español).

shell: Mientras el shell por defecto se especifica en el archivo /etc/default/useradd, también puede ser cambaido con la opción de useradd -s en el momento de la creación de cuentas. Más tarde, el administrador puede usar la opción usermod -s para cambiar el shell o el usuario puede cambiar su shell con el comando chsh. Es común especificar el shell /sbin/nologin para las cuentas que se vayan a utilizar como cuentas del sistema.

comentario: El campo de comentario, originalmente llamado el campo General Electric Comprehensive Operating System (GECOS), normalmente se utiliza para contener el nombre completo del usuario. Muchos programas gráficos muestran el valor de este campo en lugar del nombre de la cuenta. La opción -c de los comandos useradd y usermod permite especificar el valor de este campo.

El Comando useradd

Una vez hayas comprobado qué valores se utilizarán por defecto y hayas reunido la información sobre el usuario, entonces estás listo para crear una cuenta de usuario. Un ejemplo de un comando useradd usando algunas opciones sería el siguiente:

root@localhost:~# useradd -u 1000 -g users -G wheel,research -c 'Jane Doe' jane 

Este ejemplo del comando useradd crea un usuario con UID de 1000, un grupo primario de users («usuarios»), membresías suplementarias en los grupos wheel y research, un comentario de «Jane Doe» y un nombre de cuenta jane.

La información sobre la cuenta de usuario de jane se agregará automáticamente a los archivos /etc/passwd y /etc/shadow, mientras que la información sobre el acceso a grupos suplementarios de jane se añadirá automáticamente al archivo /etc/group y /etc/gshadow. Por ejemplo:

root@localhost:~# useradd -u 1000 -g users -G wheel,research -c "Jane Doe" jane
root@localhost:~# grep jane /etc/passwd
jane:x:1000:100:Jane Doe:/home/jane:/bin/bash
root@localhost:~# grep jane /etc/shadow
jane:!!:16003:0:99999:7:::
root@localhost:~# grep jane /etc/group
wheel:x:10:jane
research:x:2000:jane
root@localhost:~# grep jane /etc/gshadow
wheel:::jane
research:!::jane
root@localhost:~#

Ten en cuenta que la cuenta aún no tiene una contraseña válida!

Además, se crearía el archivo mail spool /var/spool/mail/jane, el directorio /home/jane se crearía con permisos de sólo permitir el acceso al usuario jane y el contenido del directorio /etc/skel se copiaría en el directorio:

root@localhost:~# ls /var/spool/mail 
jane root rpc sysadmin                                           
root@localhost:~# ls /home                                                    
jane sysadmin                                                                 
root@localhost:~# ls -a /home/jane                                            
.  ..  .bash_logout  .bashrc  .profile  .selected_editor                      
root@localhost:~# ls -a /etc/skel                                            
.  ..  .bash_logout  .bashrc  .profile  .selected_editor                      
root@localhost:~# 

Elegir una Contraseña

Elegir una buena contraseña no es una tarea fácil, pero es fundamental que se haga correctamente, ya que la seguridad de una cuenta (tal vez todo el sistema) puede verse comprometida. Escoger una buena contraseña es únicamente un comienzo; tienes que ser cuidadoso con tu contraseña para que otras personas no la puedan ver. Nunca debes decir a nadie tu contraseña y nunca dejes que alguien te vea escribir tu contraseña. Si quieres apuntar tu contraseña, entonces la debes guardar en un lugar seguro como una caja fuerte.

¡Es fácil crear una mala contraseña! Si utilizas cualquier información en tu contraseña que tenga que ver contigo, entonces otras personas pueden llegar a conocerla o descubrir tal información, por lo tanto tu contraseña podría verse fácilmente comprometida. Tu contraseña nunca debe contener información sobre ti o alguien que conoces, tales como:

  • nombre
  • segundo nombre
  • apellido
  • cumpleaños
  • teléfono
  • nombres de mascotas
  • licencia de conducir
  • seguro social

Hay numerosos factores a considerar al elegir una contraseña para una cuenta:

  • Longitud: El archivo /etc/login.defs permite al administrador especificar la longitud mínima de la contraseña. Aunque hay personas que consideran que una contraseña larga es mejor, esto no es realmente correcto. El problema con las contraseñas que son demasiado largas es que no se recuerdan fácilmente y, consecuentemente, la gente las apunta a menudo en un lugar donde pueden ser fácilmente encontradas y comprometidas.
  • Composición: Una buena contraseña debe estar compuesta por una combinación de caracteres alfabéticos, numéricos y simbólicos.
  • Vigencia: La cantidad de tiempo que una contraseña se puede utilizar como máximo debe ser limitada por varias razones:
    • Si una cuenta está comprometida y se limita el tiempo que la contraseña es válida, el intruso perderá el acceso puesto que eventualmente la contraseña se volverá invalidada.
    • Si una cuenta no se usa, entonces se puede desactivar automáticamente cuando la contraseña no sea válida.
    • Si los atacantes intentan atacar con «fuerza bruta» con cada contraseña posible, entonces la contraseña puede cambiarse antes de que el ataque tenga éxito.Sin embargo, el hecho de requerir a un usuario que cambie su contraseña a menudo podría plantear problemas de seguridad, incluyendo:
    • La calidad de la contraseña que el usuario elija, podría ser inferior.
    • El usuario puede empezar a apuntar su contraseña en papel, lo que aumenta la posibilidad de que la contraseña sea descubierta.
    • Las cuentas de usuario rara vez utilizadas se pueden caducar y requierir atención administrativa para reiniciar.Las opiniones varían sobre la frecuencia con la que los usuarios deben ser forzados a cambiar sus contraseñas. Para cuentas muy sensibles, se recomienda cambiar las contraseñas con mayor frecuencia, como cada 30 días. Por otro lado, para cuentas no críticas sin ningún tipo de acceso a información sensible, hay menos necesidad de cambio frecuente. Para cuentas con mínimo riesgo, una vigencia razonable sería 90 días.

Establecer una Contraseña de Usuario

Existen varias formas de cambiar una contraseña de usuario: el usuario puede ejecutar el comando passwd, el administrador puede ejecutar el comando passwd proporcionando el nombre de usuario como argumento y las herramientas gráficas también están disponibles.

El administrador puede utilizar el comando passwd para cambiar la contraseña de la cuenta o establecer una contraseña inicial. Por ejemplo, si el administrador hubiera creado la cuenta jane, entonces ejecutando passwd jane proporcionaría al administrador un prompt para configurar la contraseña para jane. Si se completa con éxito, el archivo /etc/shadow se actualizará con la nueva contraseña del usuario.

Mientras que los usuarios regulares deben seguir muchas reglas de contraseña, el usuario root solo debe seguir una regla: la contraseña no se puede dejar en blanco. Todas otras reglas de contraseña que el usuario root no cumpla, simplemente resultarán en una advertencia que se imprime a la pantalla y la regla no se aplica:

root@localhost:~# passwd jane                                                 
Enter new UNIX password: 
BAD PASSWORD: it is WAY to short
BAD PASSWORD: is too simple                                                   
Retype new UNIX password:                                                     
passwd: password updated successfully  
root@localhost:~#

Suponiendo que el administrador estableció una contraseña para una cuenta de usuario, el usuario puede entonces iniciar sesión con el nombre de cuenta y la contraseña. Cuando el usuario abre una terminal, puede ejecutar el comando passwd sin argumentos para cambiar su propia contraseña. Se le pide su contraseña actual y luego se pedirá que introduzca la nueva contraseña dos veces.

Para un usuario común puede ser difícil establecer una contraseña válida, porque debe seguir todas las reglas para la contraseña. El usuario normalmente tiene tres intentos para proporcionar una contraseña válida antes de que el comando passwd salga con un error.

Con los privilegios del usuario root, las contraseñas encriptadas y otra información relacionada a la contraseña puede verse consultando el archivo /etc/shadow. Hay que recordar que los usuarios normales no pueden ver el contenido de este archivo.

Usando el Comando chage

Aunque no aparezca como un comando que deber saber según los objetivos del curso, el comando chage ofrece muchas opciones para la gestión de la información de vencimiento de contraseña que se encuentra en el archivo /etc/shadow.

Aquí está un resumen de las opciones de chage:

Opción cortaOpción largaDescripción
-l--listListar la información de vencimiento de la cuenta
-d LAST_DAY--lastday LAST_DAYFijar la fecha del último cambio de contraseña a LAST_DAY
-E EXPIRE_DATE--expiredate EXPIRE_DATEConfigurar cuenta para que expire el EXPIRE_DATE
-h--helpMostrar la ayuda para chage
-I INACTIVE--inactive INACTIVEConfigurar la cuenta para permitir acceso INACTIVE días después de que la contraseña caduque.
-m MIN_DAYS--mindays MIN_DAYSDefinir el número mínimo de días antes de que se pueda cambiar la contraseña a MIN_DAY
-M MAX_DAYS--maxdays MAX_DAYSDefinir el número máximo de días antes de que se pueda cambiar la contraseña a MAX_DAY
-W WARN_DAYS--warndays WARN_DAYSEstablecer el número de días antes de que caduque una contraseña para mostrar una advertencia a WARN_DAYS

Un buen ejemplo del comando chage sería cambiar el número máximo de días para la validez de la contraseña de una persona a 60 días:

root@localhost:~# chage -M 60 jane

Modificar un Usuario

Antes de hacer cambios a una cuenta de usuario, debes entender que algunos comandos no modificarán con éxito una cuenta de usuario si el usuario está actualmente conectado (como por ejemplo cambiando su nombre de usuario del inicio de la sesión).

Otros cambios que podrías hacer no serán efectivos si el usuario está conectado, sino será efectivo tan pronto como el usuario cierre sesión y luego inicie sesión de nuevo. Por ejemplo, si vas a modificar las membresías de los grupos, entonces las nuevas membresías estarán disponibles para el usuario hasta la próxima vez que el usuario inicie sesión.

En cualquier caso, es útil saber cómo utilizar los comandos who , w y last, para que puedas saber quién está conectado en el sistema, ya que esto puede afectar los cambios que quieres hacer a un usuario.

Los comandos who y w los vimos en el capítulo anterior. Ambos comandos te permiten ver quién está actualmente conectado en el sistema. El comando w es el más detallado de los dos, ya que muestra información de tiempo de actividad y carga del sistema, así como qué procesos está ejecutando cada usuario.

El comando last es ligeramente diferente de los comandos who y w. Por defecto, también muestra el nombre de usuario, terminal y ubicación del inicio de la sesión, no sólo de las sesiones actuales iniciadas en el sistema, sino las sesiones anteriores también. A diferencia de los comandos who y w, mostrará la fecha y hora en la que el usuario inició la sesión. Si el usuario cerró la sesión del sistema, entonces se mostrará el tiempo total de conexión o se mostrará «still logged in» (o «sigue conectado» en español).

El comando last lee la historia completa de la sesión desde el archivo /var/log/wtmp y muestra todos los inicios de sesión y los reinicios por defecto. Un detalle interesante de los registros de reinicio es que se muestra la versión del kernel Linux que fue arrancado en lugar de la ubicación del inicio de la sesión.

Proporcionando un nombre de usuario o un nombre de tty (terminal) como argumento, el comando sólo mostrará los registros que coincidan con ese nombre. Si necesitas averiguar quién se conectó a partir de una determinada fecha y hora, el comando last lo puede mostrar, si utilizas la opción -t para especificar tal fecha y hora.

El Comando usermod

El comando usermod ofrece muchas opciones para modificar una cuenta de usuario existente. Observa que la mayoría de estas opciones también están disponible con el comando useradd en el momento de crear la cuenta. La siguiente tabla proporciona un resumen de las opciones usermod:

Opción cortaOpción largaDescripción
-cCOMMENTEstablecer el valor del campo GECOS o comentario a COMMENT.
-d HOME_DIR--home HOME_DIREstablecer un nuevo directorio home para el usuario.
-e EXPIRE_DATE--expiredate EXPIRE_DATEConfigurar la fecha de caducidad de la cuenta a EXPIRE_DATE.
-f INACTIVE--inactive INACTIVEConfigurar la cuenta para permitir acceso INACTIVE días después de que la contraseña caduque.
-g GROUP--gid GROUPEstablecer GROUP como grupo primario.
-G GROUPS--groups GROUPSEstablecer grupos adicionales a una lista especificada en GROUPS.
-a--appendAñadir grupos adicionales del usuario especificados por -G.
-h--helpMostrar la ayuda para usermod.
-l NEW_LOGIN--login NEW_LOGINCambiar el nombre de inicio de sesión del usuario.
-L--lockBloquear la cuenta de usuario.
-s SHELL--shell SHELLEspecificar el shell de inicio de sesión para la cuenta.
-u NEW_UID--uid NEW_UIDEspecificarque el UID del usuario sea NEW_UID.
-U--unlockDesbloquear la cuenta de usuario.

Varias de estas opciones son importantes debido a la forma en la que afectan la administración de usuarios. Puede ser muy complicado cambiar el UID del usuario con la opción -u, ya que los archivos pertenecientes al usuario quedarán huérfanos. Por otra parte, especificando un nuevo nombre de inicio de sesión para el usuario con la opción -l no resulta en archivos huérfanos.

Borrar un usuario con el comando userdel (véase la sección siguiente) puede resultar en archivos huérfanos o eliminados del usuario del sistema. En vez de eliminar la cuenta, otra opción es bloquear la cuenta con la opción -L del comando usermod. El bloqueo de una cuenta evita que la cuenta se utilice, pero sigue siendo propietario de los archivos.

Hay algunas cosas importantes que debes saber sobre el manejo de los grupos suplementarios. Si utilizas la opción -G sin la opción -a, debes listar todos los grupos a los que perteneciera el usuario. Usando solamente la opción -G puede accidentalmente quitar un usuario de todos los anteriores grupos suplementarios a los que pertenece.

Si utilizas la opción -a sin la opción -G, solamente tienes que listar los grupos nuevos a los que perteneciera el usuario. Por ejemplo, si el usuario jane pertenece actualmente a los grupos wheel y research, entonces para agregar su cuenta al grupo de desarrollo, ejecuta el siguiente comando:

root@localhost:~# usermod -aG development jane

Propiedad de Archivo

De forma predeterminada, los usuarios poseen los archivos que crean. Mientras que esta propiedad puede cambiarse, esta función requiere privilegios administrativos. Aunque la mayoría de los comandos generalmente muestran al usuario propietario como un nombre, el sistema operativo en realidad asociará la propiedad del usuario con el UID para ese nombre de usuario.

Cada archivo también tiene un grupo propietario. De forma predeterminada, el grupo primario del usuario que crea el archivo será el grupo propietario de los nuevos archivos. Los usuarios pueden cambiar a un propietario de grupo de un archivo a cualquier grupo al que pertenecen. De manera similar al usuario propietario, la asociación de un archivo con un grupo no está realmente hecha por nombre dentro del sistema operativo, sino por el GID del grupo.

Puesto que la propiedad se determina por el UID y GID asociado con un archivo, cambiar el UID de un usuario (o borrar el usuario) tiene el efecto de hacer que el archivo que originalmente fue propiedad del usuario no tenga ningún usuario propietario real. Cuando no hay ningún UID en el archivo /etc/passwd que coincide con el UID del propietario del archivo, el UID (el número) se mostrará como el usuario propietario del archivo en lugar del nombre de usuario (que ya no existe). Lo mismo ocurre con los grupos.

El comando id puede ser útil para verificar la cuenta del usuario que estás usando y qué grupos están disponibles para ti. Mediante la visualización de la salida de este comando, puedes ver la información de la identidad del usuario expresada como un número y un nombre.

La salida del comando id muestra el nombre de la cuenta de usuario y el UID del usuario actual seguido por el GID y el nombre del grupo primario y los GIDs y los nombres de grupo de todas las membresías de grupos:

sysadmin@localhost:~$ id
uid=500(sysadmin) gid=500(sysadmin) groups=500(sysadmin),10001(research),10002(development) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

El ejemplo anterior muestra que el usuario tiene un UID de 500 para la cuenta del usuario sysadmin. Muestra que el grupo primario para este usuario tiene un GID de 500 para el grupo sysadmin.

Ya que la cuenta de usuario y la cuenta del grupo primario tienen el mismo nombre y el mismo identificador numérico, esto indica que este usuario está en un grupo privado de usuario (UPG). Además, el usuario pertenece a dos grupos adicionales: el grupo research(o «investigación» en español) con un GID de 10001 y el grupo development (o «desarrollo» en español) con un GID de 10002.

Cuando se crea un archivo, éste pertenecerá al usuario actual y su grupo primario actual. Si el usuario del ejemplo anterior ejecutara un comando como touch para crear un archivo y luego ver los detalles de archivo, la salida sería como la siguiente:

sysadmin@localhost:~$ touch /tmp/filetest1
sysadmin@localhost:~$ ls -l /tmp/filetest1
-rw-rw-r--. 1 sysadmin sysadmin 0 Oct 21 10:18 /tmp/filetest1

El usuario propietario del archivo es sysadmin y el grupo propietario es sysadmin.

Los Comandos newgrp y groups

Si sabes que el archivo que vas crear debe pertenecer a un grupo diferente que tu grupo primario actual, entonces puedes utilizar el comando newgrp para cambiar tu grupo primario actual.

Como se mostró anteriormente, el comando id lista tu información de identidad, incluyendo tu pertenencia a grupos. Si sólo estás interesado en conocer a qué grupos perteneces, puedes ejecutar el comando groups:

sysadmin@localhost:~$ groups
sysadmin research development

La salida de groups puede no ser tan detallada como la salida del comando id, pero si todo lo que necesitas saber es a qué grupos puedes cambiar utilizando el comando newgrp, entonces el comando groups proporciona la información que necesitas. La salida del comando id muestra tu grupo primario actual, por lo que es útil verificar que el comando newgrp tuvo éxito.

Por ejemplo, si el usuario sysadmin quería tener un archivo que fuera propiedad del grupo research, pero no era el grupo primario del usuario, el usuario podría utilizar el comando newgrp y comprobar el grupo primario correcto con el comando id antes de crear el nuevo archivo:

sysadmin@localhost:~$ id
uid=502(sysadmin) gid=503(sysadmin) groups=503(sysadmin),10001(research),10002(development) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sysadmin@localhost:~$ newgrp research
sysadmin@localhost:~$ id
uid=502(sysadmin) gid=10001(research) groups=503(sysadmin),10001(research),10002(development) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

De la salida de los comandos anteriores, primero puedes ver que el GID del usuario es de 503 para el usuario sysadmin, y luego se ejecuta el comando newgrp research, y después el GID primario del usuario es de 10001, el grupo research. Después de estos comandos, si el usuario quiere crear otro archivo y ver sus detalles, el nuevo archivo pertenecería al grupo research:

sysadmin@localhost:~$ touch /tmp/filetest2
sysadmin@localhost:~$ ls -l /tmp/filetest2
-rw-r--r--. 1 sysadmin research 0 Oct 21 10:53 /tmp/filetest2

El comando newgrp abre un shell nuevo; mientras el usuario permanece en ese shell, el grupo primario no cambiará. Para cambiar el grupo principal hacia el original, el usuario podría abandonar el shell nuevo ejecutando el comando exit. Por ejemplo:

sysadmin@localhost:~$ id
uid=502(sysadmin) gid=10001(research) groups=503(sysadmin),10001(research),10002(development) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sysadmin@localhost:~$ exit
exit
sysadmin@localhost:~$ id
uid=502(sysadmin) gid=503(sysadmin) groups=503(sysadmin),10001(research),10002(development) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Se requieren privilegios administrativos para cambiar permanentemente el grupo primario del usuario. El usuario root ejecutaría el comando usermod -g groupname username.

Los Comandos chgrp y stat

Si quieres cambiar el grupo propietario de un archivo existente, puedes utilizar el comando chgrp. Como un usuario sin privilegios administrativos, el comando chgrp puede utilizarse solamente para cambiar el grupo propietario del archivo a un grupo del que el usuario ya sea miembro. Como usuario root, el comando chgrp puede utilizarse para cambiar el grupo propietario de cualquier archivo a cualquier grupo.

Mientras que puedes ver la propiedad de un archivo con la opción -l del comando ls, el sistema proporciona otro comando que es útil al visualizar los permisos y la propiedad de los archivos: el comando stat. El comando stat muestra información más detallada acerca de un archivo, incluyendo el grupo propietario tanto por nombre de grupo como por el número GID:

sysadmin@localhost:~$ stat /tmp/filetest1
  File: `/tmp/filetest1'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 31477       Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  502/sysadmin)   Gid: (  503/sysadmin)
Access: 2013-10-21 10:18:02.809118163 -0700
Modify: 2013-10-21 10:18:02.809118163 -0700
Change: 2013-10-21 10:18:02.809118163 -0700

El comando stat proporciona más detalles que el comando ls -l.

El siguiente gráfico muestra al usuario sysadmin cambiando la propiedad de grupo de un archivo que posee el usuario:

sysadmin@localhost:~$ chgrp development /tmp/filetest1                      
sysadmin@localhost:~$ stat /tmp/filetest1                                      File: `/tmp/filetest1'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 528677       Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  500/sysadmin)   Gid: (  502/development)
Access: 2013-10-21 10:18:02.809118163 -0500
Modify: 2013-10-21 10:18:02.809118163 -0500
Change: 2013-10-21 10:18:02.809118163 -0500                 
sysadmin@localhost:~$

Si un usuario intenta modificar la propiedad de grupo de un archivo que no posee, recibirá un mensaje de error:

sysadmin@localhost:~$ chgrp development /etc/passwd
chgrp: changing group of '/etc/passwd': Operation not permitted

A veces quieres no sólo cambiar los archivos en el directorio actual, pero también los archivos en los subdirectorios. Cuando se ejecuta con la opción -R (recursivo), el comando chgrp operará no sólo en el directorio actual, sino también en todos los directorios que pueden estar anidados bajo el directorio especificado. La operación también afectarán a todos los archivos en los subdirectorios, no sólo en los directorios.

El gráfico siguiente ilustra el uso de la opción -R:

sysadmin@localhost:~$ cp -r /etc/sound .                          
sysadmin@localhost:~$ ls -ld sound                                    
drwxr-xr-x 1 sysadmin sysadmin 0 Dec 11 02:02 sound                      
sysadmin@localhost:~$ls -lR sound
sound:
total 4
drwxr-xr-x. 2 sysadmin sysadmin 4096 Oct 28 13:06 events


sound/events:
total 48
-rw-r--r--. 1 sysadmin sysadmin 27223 Oct 28 13:06 gnome-2.soundlist
-rw-r--r--. 1 sysadmin sysadmin 18097 Oct 28 13:06 gtk-events-2.soundlist
sysadmin@localhost:~$ chgrp -R development sound
sysadmin@localhost:~$ ls -ld sound
drwxr-xr-x. 3 sysadmin development 4096 Oct 28 13:06 sound
ls -lR sound
sound:
total 4 
drwxr-xr-x. 2 sysadmin development 4096 Oct 28 13:06 events


sound/events:
-rw-r--r--. 1 sysadmin development 27223 Oct 28 13:06 gnome-2.soundlist
-rw-r--r--. 1 sysadmin development 18097 Oct 28 13:06 gtk-events-2.soundlist
sysadmin@localhost:~$

Comando chown

El comando chown permite al usuario root cambiar el usuario propietario de archivos y directorios. Un usuario normal no puede utilizar este comando para cambiar el usuario propietario de un archivo, ni siquiera para pasar la propiedad de uno de sus propios archivos a otro usuario. Sin embargo, el comando chown también permite cambiar la propiedad de grupo, que se puede lograr a través del root o el propietario del archivo.

Existen tres maneras diferentes de ejecutar el comando chown. El primer método se utiliza para cambiar sólo al usuario propietario del archivo. Por ejemplo, si el usuario root quiere cambiar la propiedad de usuario del archivo abc.txt al usuario ted, entonces el siguiente comando puede ser ejecutado:

root@localhost:~# chown ted abc.txt

El segundo método es cambiar ambos el usuario y el grupo; esto también requiere privilegios de root. Para lograr esto, debes separar al usuario y el grupo por dos puntos o un punto. Por ejemplo:

root@localhost:~# chown user:group /path/to/file
root@localhost:~# chown user.group /path/to/file

Si un usuario no tiene privilegios de root, puede utilizar el tercer método para cambiar el grupo propietario de un archivo al igual que el comando chgrp. Para usa chown para cambiar sólo la propiedad de grupo del archivo, usar dos puntos o un punto como un prefijo para el nombre del grupo:

root@localhost:~#  chown :group /path/to/file
root@localhost:~#  chown .group /path/to/file

Permisos

Al ejecutar el comando ls -l, la salida resultante muestra diez caracteres al principio de cada línea, que indican el tipo de archivo y los permisos del archivo:

  • El primer carácter indica el tipo de archivo.
  • Los caracteres 2-4 indican los permisos para el usuario al que pertenece el archivo.
  • Los caracteres 5-7 indican los permisos para el grupo al que pertenece el archivo.
  • Los caracteres 8-10 indican los permisos para «otros» o lo que se conoce a veces como los permisos del mundo. Esto incluiría todos los usuarios que no sean el propietario del archivo o un miembro del grupo del archivo.

Por ejemplo, considera la salida del siguiente comando:

root@localhost:~# ls -l /etc/passwd
-rw-r--r--. 1 root root 4135 May 27 21:08 /etc/passwd

Basándose en la salida del comando anterior, los primeros diez caracteres podrían ser descritos por la siguiente tabla:

CaracterTipo de Archivo
-Un archivo normal que puede estar vacío, contener texto o datos binarios.
dUn archivo de directorio que contiene los nombres de otros archivos y enlaces a los mismos.
lUn enlace simbólico es un nombre de archivo que hace referencia (apunta) a otro archivo.
bUn archivo de bloque es el que se refiere a un dispositivo de hardware de bloque donde los datos se leen en bloques de datos.
cUn archivo de caracteres es aquel que se refiere a un dispositivo de hardware de caracteres, donde se leen los datos un byte a la vez.
pUna archivo «pipe» («barra vertical» en español) funciona de forma similar al símbolo de barra vertical («pipe» en inglés), lo que permite a la salida de un proceso comunicarse con otro proceso por el archivo «pipe», donde se utiliza la salida de un proceso como entrada para el otro proceso.
sUn archivo de socket permite que se comuniquen dos procesos, donde se permite a ambos procesos enviar o recibir datos.

A pesar de que todos los tipos de archivos estan listados en la tabla anterior, lo más probable es que nunca te encontrarás nada más que archivos regulares, directorios y archivos de enlace, a menos que explores el directorio /dev.

Los caracteres de la parte de permisos de la salida tienen los siguientes significados:

  • r significa el permiso de leer
  • w significa el permiso de escribir
  • x significa el permiso de ejecutar

Los permisos establecidos en estos archivos determinan el nivel de acceso que un usuario va a tener en el archivo. Cuando un usuario ejecuta un programa y el programa accede a un archivo, los permisos se comprueban para determinar si el usuario tiene los derechos de acceso correctos en el archivo.

Los propios permisos son engañosamente simple y tienen un significado diferente dependiendo de si se aplican a un archivo o un directorio:

PermisoSignificado relacionado a un archivoSignificado relacionado a un directorio
rEl proceso puede leer el contenido del archivo, es decir, los contenidos se pueden ver y copiar.Los nombres de archivo en el directorio se pueden enumerar, pero otros detalles no están disponibles.
wEl proceso puede escribir en este archivo, por lo que los cambios se pueden guardar. Ten en cuenta que el permiso w realmente requiere el permiso r en un archivo para que funcione correctamente.Los archivos se pueden agregar a un directorio o quitar del mismo. Ten en cuenta que el permiso w requiere el permiso x en el directorio para que funcione correctamente.
xEl archivo se puede ejecutar o correr como un proceso.El usuario puede utilizar el comando cd para «entrar» al directorio y utilizar el directorio en una ruta de acceso para acceder a los archivos y, potencialmente, a los subdirectorios de este directorio.

Comprendiendo los Permisos

Mientras que la tabla anterior puede ser una referencia útil, por sí sola no ofrece una descripción clara de cómo funcionan los permisos. Para entender mejor cómo funcionan los permisos, considera los siguientes escenarios.

Para entender estos escenarios, primero debes entender el siguiente diagrama:

La información importante viene resaltada. El primer cuadro representa el directorio / con un usuario propietario root, un grupo propietario root y los permisos rwxr-xr-x. El segundo cuadro representa el directorio /data, un directorio que está bajo el directorio /. El tercer cuadro representa el archivo abc.txt, que se almacena en el directorio /data.

También debes entender que si eres el propietario del archivo/directorio, entonces sólo los permisos de propiedad de usuario se utilizarán para determinar el acceso a ese archivo/directorio.

Si no eres el propietario, pero eres un miembro del grupo que posee el archivo/directorio, entonces sólo los permisos de propiedad de grupo se utilizarán para determinar el acceso a ese archivo o directorio.

Si no eres el propietario y tampoco eres un miembro del grupo de archivos o directorios, entonces los permisos serían «otros».

Escenario #1 – La importancia del Acceso al Directorio

Pregunta: Según el siguiente diagrama, ¿Qué acceso tendría el usuario bob en el archivo abc.txt?

Respuesta: Ninguno

Explicación: Al principio podría parece que el usuario bob puede ver el contenido del archivo abc.txt, igual que copiar el archivo, modificar su contenido y ejecutarlo como un programa. Esta conclusión errónea sería el resultado de tener en cuenta únicamente permisos del archivo (rwx para el usuario bob en este caso).

Sin embargo, para hacer algo con el archivo, el usuario debe primero «entrar» al directorio /data. Los permisos para bob en el directorio /data son los permisos para «otros» (r--), que significa bob no puede utilizar ni siquiera el comando cd para entrar al directorio. Si el permiso de ejecutar (--x) fuera configurado para el directorio, entonces el usuario bob sería capaz de «entrar» al directorio, lo que significa que se aplicarían los permisos del propio archivo.

Lección aprendida: Los permisos de todos los directorios padres deben considerarse antes de considerar los permisos en un archivo específico.

Escenario #2 – Visualizar el Contenido del Directorio

Pregunta: Según el diagrama siguiente, ¿Quién puede utilizar el comando ls para mostrar el contenido del directorio /data (ls /data)?

Respuesta: Todos los usuarios

Explicación: Todo lo que es necesario para poder ver el contenido de un directorio es el permiso r en el directorio (y poder acceder a los directorios padres). El permiso x para todos los usuarios en el directorio / significa que todos los usuarios pueden usar / como parte de la ruta, así que todo el mundo puede pasar a través del directorio / al directorio /data. El permiso de r para todos los usuarios en el directorio /data significa que todos los usuarios pueden utilizar el comando ls para ver el contenido. Esto incluye los archivos ocultos, entonces el comando ls -a también funciona en este directorio.

Sin embargo, ten en cuenta que para ver los datos de los archivos (ls -l) requiere tambien el permiso x en el directorio. Así que mientras el usuario root y los miembros del grupo root tienen este acceso en el directorio /data, otros usuarios no pueden ejecutar ls -l /data.

Lección aprendida: El permiso r permite a un usuario ver un listado del directorio.

Escenario #3 – Eliminar el Contenido del Directorio

Pregunta: Según el diagrama siguiente, ¿Quién puede eliminar el archivo /data/abc.txt?

Respuesta: Sólo el usuario root

Explicación: Un usuario no necesita ninguno permiso en el archivo para eliminarlo. El permiso w en el directorio en el cual se almacena el archivo se necesita para eliminar un archivo de un directorio. Con base en esto, parece que todos los usuarios pueden eliminar el archivo /data/abc.txt, ya que todo el mundo tiene el permiso w en el directorio.

Sin embargo, para eliminar un archivo, también tienes que poder «entrar» al directorio. Puesto que sólo el usuario root tiene el permiso x en el directorio /data, sólo el root puede «entrar» a ese directorio con el fin de eliminar los archivos de este directorio.

Lección aprendida: El permiso w permite eliminar los archivos de un directorio, pero sólo si el usuario también tiene el permiso x en el directorio.

Escenario #4 – Acceso a los Contenidos de un Directorio

Pregunta: Verdadero o falso: Según el siguiente diagrama, ¿Puede el usuario bob ejecutar con éxito el siguiente comando: more /data/abc.txt?

Respuesta: Verdadero

Explicación: Como se mencionó anteriormente, para acceder a un archivo, el usuario debe tener acceso al directorio. El acceso al directorio sólo requiere el permiso x; aunque el permiso de r sería útil para listar los archivos en un directorio, no se necesita para «entrar» en el directorio y acceder a los archivos dentro del directorio.

Cuando se ejecuta el comando more /data/abc.txt, se comprueban los siguientes permisos: el permiso x en el directorio /, el permiso x en el directorio data y el permiso r en el archivo abc.txt. Puesto que el usuario bob tiene todos estos permisos, el comando se ejecuta con éxito.

Lección aprendida: El permiso x se necesita para «entrar» a un directorio, pero no se necesita el permiso r en el directorio, a menos, que quieras listar el contenido del directorio.

Escenario #5 – La Complejidad de los Usuarios y Grupos

Pregunta: Verdadero o falso: Según el siguiente diagrama, ¿Puede el usuario bob ejecutar con éxito el siguiente comando: more /data/abc.txt (observa que el directorio /data tiene un usuario y grupo propietarios diferentes a los ejemplos anteriores)?

Respuesta: No hay suficiente información para determinarlo.

Explicación: Para acceder al archivo /data/abc.txt, el usuario bob necesita permiso para «entrar» en el directorio /data. Esto requiere el permiso x, que bob puede tener o no, dependiendo de si es un miembro del grupo payroll.

Si bob es un miembro del grupo payroll, entonces sus permisos en el directorio /data son r-x y el comando more /data/abc.txt se ejecutará con éxito (bob también necesita x en / y r en abc.txt, que ya tiene). Si no es un miembro del grupo payroll, sus permisos en el directorio /data son --- y el comando fallaría.

Lección aprendida: Debes tener en cuenta los permisos de cada archivo y directorio por separado y ser consciente a qué grupos pertenece la cuenta de usuario.

Escenario #6 – Prioridad de Permiso

Pregunta: Verdadero o falso: Según el siguiente diagrama, ¿Puede el usuario bob ejecutar con éxito el siguiente comando: more /data/abc.txt (observa que el directorio /data tiene un usuario y grupo propietarios diferentes a los ejemplos anteriores)?

Respuesta: Falso

Explicación: Recuerda que si eres el propietario de un archivo, entonces sólo los permisos que son validados son los del usuario propietario. En esta caso, sería --- para bob en el archivo /data/abc.txt.

En este caso, los miembros del grupo de bob y «otros» tienen más permisos sobre el archivo que los que tiene bob.

Lección aprendida: No proporciones permisos para el grupo propietario y «otros» sin aplicar al menos el mismo nivel de acceso para el propietario del archivo.

Usando el Comando chmod – Método Simbólico

El comando chmod (change mode) se utiliza para cambiar los permisos de un archivo o directorio. Hay dos técnicas a la hora de utilizar este comando: simbólico y numérico. Ambas técnicas utilizan la siguiente sintaxis básica:

chmod new_permission file_name

o

chmod nuevo_permiso nombre_de_archivo

Importante: Para cambiar los permisos de un archivo, necesitas ser el propietario del archivo o iniciar la sesión como el usuario root.

Si quieres modificar algunos de los permisos actuales, el método simbólico probablemente será más fácil de usar. Con este método especifícas que permisos quieres cambiar en el archivo y los permisos de otros permanecen siendo como son.

Cuando se especifica el nuevo_permiso, comienzas por utilizar uno de los caracteres siguientes para indicar qué conjunto de permisos quieres cambiar:

  • u = cambiar los permisos del usuario propietario
  • g = cambiar los permisos del grupo propietario
  • o = cambiar los permisos de «otros»
  • a = aplicar los cambios a todos los conjuntos de permisos (usuario propietario, grupo propietario y «otros»)

Debe especificar un + para agregar un permiso o un - para quitar un permiso. Por último, especifica r para la lectura w para escritura y x para ejecución.

Por ejemplo, para conceder permiso de lectura al usuario propietario en un archivo denominado abc.txt, podrías utilizar el siguiente comando:

root@localhost:~# chmod u+r abc.txt

Solamente se cambió el permiso del usuario propietario. Todos los otros permisos permanecieron como estaban antes de la ejecución del comando chmod.

Puedes combinar los valores para realizar múltiples cambios en los permisos del archivo. Por ejemplo, considera el siguiente comando que agregará permisos de lectura para el usuario propietario y grupo propietario mientras quita el permiso de escritura para «otros»:

root@localhost:~# chmod ug+r,o-w abc.txt

Por último, podrías utilizar el carácter = en lugar de - o + para especificar exactamente los permisos que quieres para un conjunto de permisos:

root@localhost:~# chmod u=r-x abc.txt

Usando el Comando chmod – Método Numérico

El método numérico (también llamado el método octal) es útil cuando quieres cambiar muchos permisos en un archivo. Se basa en el sistema octal de numeración en el que a cada tipo de permiso se le asigna un valor numérico:

4read (leer)
2write (escribir)
1execute (ejecutar)

Usando una combinación de números del 0 al 7, cualquier combinación de permisos posible para leer, escribir y ejecutar se pueden especificar por un conjunto de permisos individuales. Por ejemplo:

7rwx
6rw-
5r-x
4r--
3-wx
2-w-
1--x
0---

Cuando se utiliza el método numérico para cambiar los permisos, se deben especificar los nueve permisos. Debido a esto, el método simbólico es generalmente más fácil para cambiar unos pocos permisos, mientras que el método numérico es mejor para los cambios más drásticos.

Por ejemplo, para establecer los permisos de un archivo llamado abc.txt a rwxr-xr-- puedes utilizar el siguiente comando:

root@localhost:~]# chmod 754 abc.txt

Revisión del Comando stat

Recordemos el comando stat mencionado anteriormente en este capítulo. Este comando proporciona información más detallada que el comando ls -l.

Debido a esto, es posible considerar el uso del comando stat en lugar del comando ls -l durante la visualización de los permisos de un archivo. Una gran ventaja del comando stat es que muestra permisos tanto simbólicamente como por método numérico, como se demuestra a continuación:

sysadmin@localhost:~$ stat /tmp/filetest1
  File: `/tmp/filetest1'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 31477       Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  502/sysadmin)   Gid: (  503/sysadmin)
Access: 2013-10-21 10:18:02.809118163 -0700
Modify: 2013-10-21 10:18:02.809118163 -0700
Change: 2013-10-21 10:18:02.809118163 -0700

umask

El comando umask es una característica que se utiliza para determinar los permisos predeterminados establecidos al crear un archivo o directorio. Los permisos predeterminados se determinan cuando el valor de umask se resta de los permisos máximos predeterminados permisibles. Los permisos máximos por defecto son diferentes para los archivos y para los directorios:

archivorw-rw-rw-
directoriosrwxrwxrwx

Los permisos que se establecen inicialmente en un archivo cuando se crea no pueden exceder rw-rw-rw-. Para tener el permiso de ejecución para un archivo, primero tienes que crear el archivo y luego cambiar los permisos.

El comando umask se puede utilizar para mostrar el valor umask actual:

sysadmin@localhost:~$ umask
0002

Desglose de la salida:

  • El primer 0 indica que umask se da como un número octal.
  • El segundo 0 indica qué permisos hay que restar de los permisos por defecto de usuario propietario.
  • El tercer 0 indica qué permisos hay que restar de los permisos por defecto del grupo propietario.
  • El último número 2 indica qué permisos hay que restar de los permisos por defecto de otros.

Ten en cuenta que los diferentes usuarios pueden tener diferentes umasks. Normalmente, el usuario root tendrá una unmask más restrictiva que las cuentas de usuario:

root@localhost:~# umask
0022

Cómo Funciona umask

Para entender cómo funciona umask, supongamos que umask se establece en 027 y consideremos lo siguiente:

File Default (valor predeterminado)667
Umask-027
Resultado640

La umask 027 significa que, por defecto los archivos nuevos recibirían los permisos 640 o rw-r----- tal como se demuestra a continuación:

sysadmin@localhost:~$ umask 027
sysadmin@localhost:~$ touch sample
sysadmin@localhost:~$ ls -l sample
-rw-r-----. 1 sysadmin sysadmin 0 Oct 28 20:14 sample

Debido a que los permisos predeterminados para los directorios son diferentes que para los archivos, una umask 027 daría lugar a diferentes permisos iniciales sobre los nuevos directorios:

Directory Default (valor predeterminado)777
Umask-027
Resultado750

La umask 027 significa que, por defecto los directorios nuevos recibirían los permisos 750 o rwxr-x----- tal como se demuestra a continuación:

sysadmin@localhost:~$ umask 027
sysadmin@localhost:~$ mkdir test-dir
sysadmin@localhost:~$ ls -ld test-dir
drwxr-x---. 1 sysadmin sysadmin 4096 Oct 28 20:25 test-dir

La nueva umask sólo se aplicará a un archivo y los directorios creados durante esa sesión. Cuando arranque un nuevo shell, la umask por defecto será efectiva de nuevo.

Cambiar permanentemente la umask requiere la modificación del archivo .bashrc que se encuentra en el directorio home del usuario.

Si quieres que un directorio sea más privado, a continuación, puedes utilizar el comando chmod para quitar los permisos que otros tienen en el directorio. Utiliza el comando chmod para quitar los permisos del otro para leer y ejecutar:

ls -ld priv-dir/
chmod o-rx priv-dir/
ls -ld priv-dir/

Ahora la salida muestra que otros no tienen permiso o acceso al priv-dir:

sysadmin@localhost:/tmp$ ls -ld priv-dir/                                 
drwxrwxr-x 2 sysadmin sysadmin 4096 Apr 11 21:26 priv-dir/                
sysadmin@localhost:/tmp$ chmod o-rx priv-dir/                             
sysadmin@localhost:/tmp$ ls -ld priv-dir/                                 
drwxrwx--- 2 sysadmin sysadmin 4096 Apr 11 21:26 priv-dir/                
sysadmin@localhost:/tmp$

Utilizaste el comando chmod para modificar los permisos para los demás mediante el uso del carácter o seguido de un carácter + o un carácter - para sumar o restar los permisos. El carácter = se puede utilizar para fijar un permiso exacto.

Puedes utilizar una u en lugar de una o para modificar los permisos del usuario propietario. Utiliza una g si quieres cambiar los permisos para el propietario del grupo.

Para modificar los permisos de todo el mundo utiliza una a r en lugar de o, u o g.

chmod a+x file#proporciona todos los permisos de ejecución
chmod g-w file#elimina el permiso de escritura para los propietarios del grupo
chmod go+r file#agrega permiso de lectura para el propietario del grupo y otros
chmod o=rwx#configura permisos de otros para leer, escribir y ejecutar

El Permiso setuid

Cuando el permiso setuid se encuentra en un archivo binario ejecutable (Alias, un programa), el archivo binario se «ejecuta como» el propietario del archivo, no como el usuario que lo ejecuta. Este permiso se establece en una cierta cantidad de utilidades del sistema para que puedan ser manejados por los usuarios normales, pero ejecutados con los permisos root, proporcionando acceso a los archivos del sistema a los que el usuario normal normalmente no tiene acceso.

Considera el siguiente escenario en el que el usuario sysadmin intenta ver el contenido del archivo /etc/shadow:

sysadmin@localhost:~$ more /etc/shadow
/etc/shadow: Permission denied
sysadmin@localhost:~$ ls -l /etc/shadow
-rw-r-----. 1 root root 5195 Oct 21 19:57 /etc/shadow

Como puedes ver, el archivo /etc/shadow no se puede ver (o modificar) por los usuarios normales debido a que los permisos del archivo /etc/shadow son: -rw-r-----. Dado que el archivo es propiedad del usuario root, el administrador del sistema podría modificar temporalmente los permisos en el caso de que quisieran ver o modificar este archivo.

Consideremos ahora el comando passwd. Cuando se ejecuta este comando, se modifica el archivo /etc/shadow. Esto parece imposible porque otros comandos que el usuario sysadmin ejecuta e intentan acceder a este archivo, fallan. Así que, ¿Por qué el usuario sysadmin puede modificar el archivo /etc/shadow mientras se ejecuta el comando passwd cuando normalmente este usuario no tiene acceso al archivo?

El comando passwd tiene el permiso especial setuid. Cuando se ejecuta el comando passwd y éste accede al archivo /etc/shadow, el sistema actúa como si el usuario que accede al archivo fuera el propietario del comando passwd (el usuario root), no el usuario que está ejecutando realmente el comando.

Puedes ver este conjunto de permisos mediante la ejecución del comando ls -l:

Observa el resultado del comando ls anterior; el permiso setuid está representado por s en los permisos de propietario, donde normalmente se esperaría el permiso de ejecución.  

Al igual que los permisos de lectura, escritura y ejecución, permisos especiales pueden ser ajustados con el comando chmod, utilizando cualquiera de los métodos, simbólicos y octales.

Para agregar el permiso setuid simbólicamente, ejecuta:

chmod u+s file

Para agregar el permiso setuid numéricamente, agrega 4000 a los permisos existentes del archivo (asume que el archivo tenía originalmente 775 para su permiso en el ejemplo siguiente):

chmod 4775 file

Para retirar el permiso setuid simbólicamente, ejecuta:

chmod u-s file

Para retirar el permiso setuid numéricamente, resta 4000 de los permisos existentes del archivo:

chmod 0775 file

En el capítulo anterior, establecimos permisos con el método octal utilizando códigos de tres dígitos. Cuando se proporciona un código de tres dígitos, el comando chmod supone que el primer dígito antes del código de tres dígitos es 0. Los permisos especiales serán establecidos sólo si se fijan los cuatro dígitos.

Si se especifican tres dígitos cuando se cambian los permisos en un archivo que ya tiene un conjunto de permisos especiales, el primer dígito se establecerá en 0 y el permiso especial se quita del archivo.

El Permiso setgid en un Archivo

El permiso setgid es similar a setuid, pero hace uso de los permisos del grupo propietario. En realidad, hay dos formas de permisos setgid: setgid en un archivo y setgid en un directorio. Cómo funciona el setgid depende de si se establece en un archivo o un directorio.

El permiso setgid en un archivo es muy similar a setuid; permite que un usuario ejecute un archivo binario ejecutable proporcionando un acceso adicional (temporal) de grupo. El sistema permitirá que el usuario que ejecuta el comando pertenezca al grupo al que pertenece el archivo, pero sólo «en» el programa setgid. A medida que el comando se ejecuta y accede a archivos, esta afiliación adicional al grupo puede proporcionar acceso a los archivos.

Un buen ejemplo del permiso setgid en un archivo ejecutable es el comando /usr/bin/wall. Observa los permisos de este archivo y el grupo propietario:

sysadmin@localhost:~$ ls -l /usr/bin/wall
-rwxr-sr-x. 1 root tty 10996 Jul 19  2011 /usr/bin/wall

Se puede ver que este archivo es setgid por la presencia de la s en la posición de ejecución del grupo. Debido a que este ejecutable pertenece al grupo TTY, cuando un usuario ejecuta este comando, el comando podrá acceder a los archivos que son propiedad del grupo TTY.

Este acceso es importante porque el comando /usr/bin/wall envía mensajes a «terminales». Esto se logra al escribir datos en archivos como los siguientes:

sysadmin@localhost:~$ ls -l /dev/tty?
crw-------. 1 root tty  4, 0 Mar 29  2013 /dev/tty0
crw--w----. 1 root tty  4, 1 Oct 21 19:57 /dev/tty1

Ten en cuenta que el grupo tty tiene permiso de escritura en los archivos anteriores, mientras que los usuarios que no están en el grupo tty ( «otros») no tienen permisos en estos archivos. Sin el permiso setgid, el comando /usr/bin/wall fallaría.

El Permiso setgid en un Directorio

El permiso setgid también se puede establecer en un directorio. Cuando se establece en un directorio, setgid hace que los archivos creados en el directorio automáticamente sean propiedad del grupo que posee el directorio. Esto es contrario a cómo funcionaría normalmente la propiedad de grupo de un archivo nuevo, ya que por defecto los archivos nuevos son propiedad del grupo primario del usuario que creó el archivo.

Además, los directorios creados dentro de un directorio que tiene «establecido» el permiso setgid no sólo serán propiedad del grupo que posee el directorio setgid, sino ademas el nuevo directorio de forma automática tendrá el permiso setgid también. En otras palabras, si un directorio es setgid, entonces, los directorios creados dentro de ese directorio heredarán el permiso setgid.

A continuación se muestra la función del permiso setgid en un directorio. Observa que el usuario sysadmin crea un archivo en un directorio setgid /tmp/data y que el grupo al que pertenece el archivo no es el grupo primario sysadmin, sino más bien el grupo que posee el directorio demo:

sysadmin@localhost:~$  ls -ld /tmp/data
drwxrwsrwx. 2 root demo 4096 Oct 30 23:20 /tmp/data
sysadmin@localhost:~$ id
uid=500(sysadmin) gid=500(sysadmin)
groups=500(sysadmin),10001(research),10002(development) 
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sysadmin@localhost:~$  touch /tmp/data/file.txt
sysadmin@localhost:~$  ls -ld /tmp/data/file.txt
-rw-rw-r--. 1 bob demo 0 Oct 30 23:21 /tmp/data/file.txt

Entonces, ¿Por qué el administrador configuraría un directorio setgid? En primer lugar, ten en cuenta las siguientes cuentas de usuario:

  • bob es miembro de payroll group
  • sue es miembro de staff group
  • tim es miembro de acct group

Estos tres usuarios necesitan trabajar en un proyecto conjunto. Se acercan al administrador para solicitar un directorio compartido en el que puedan trabajar juntos, pero que nadie más pueda acceder a sus archivos. El administrador hace lo siguiente:

  • Crea un nuevo grupo llamado team.
  • Añade bob, sue y tim al grupo team.
  • Hace un nuevo directorio llamado /home/team.
  • Hace que el grupo propietario del directorio /home/team sea el grupo team.
  • Otorga al directorio /home/team los siguientes permisos: rwxrwx---

Como resultado, bob, sue y tim pueden acceder al directorio /home/team y agregar archivos. Sin embargo, hay un problema potencial: cuando bob crea un archivo en el directorio /home/team, los detalles del nuevo archivo se ven así:

-rw-r-----. 1 bob payroll 100 Oct 30 23:21 /home/team/file.txt

Desafortunadamente, mientras sue y tim pueden acceder al directorio /home/team, no pueden hacer nada con el archivo de bob. Sus permisos para ese archivo son los permisos de «otros» (---).

Si el administrador estableciera el permiso setgid al directorio /home/team, entonces, cuando bob crea el archivo, se vería de la siguiente manera:

-rw-r-----. 1 bob team 100 Oct 30 23:21 /home/team/file.txt

Y como resultado, sue y tim tendrían acceso de grupo al archivo (r--).

Ciertamente, bob podría cambiar la propiedad de grupo después de crear el archivo (o cambiar los permisos de «otros»), pero esto sería tedioso si se crearan muchos archivos nuevos. El permiso setgid hace que sea más fácil esta situación.

Configurar el Permiso setgid

Utiliza la siguiente sintaxis para agregar el permiso setgid simbólicamente:

chmod g+s <archivo|directorio>

Para agregar el permiso setgid numéricamente, añade 2000 a los permisos existentes del archivo (asume en el ejemplo siguiente de que el directorio tenía originalmente 775 para su permiso):

chmod 2775 <archivo|directorio>

Para retirar el permiso setgid simbólicamente, ejecuta:

chmod g-s <archivo|directorio>

Para retirar el permiso setgid numéricamente, resta 2000 de los permisos existentes del archivo:

chmod 0775 <archivo|directorio>

En un listado largo el permiso setgid está representado por una s en la posición de ejecución del grupo: drwxrwsr-x.

Una s minúscula significa tanto los permisos de ejecución de setgid como los de grupo están establecidos. Una S mayúscula significa que sólo el permiso setgid está establecido y no el permiso de ejecución del grupo: drwxrwSr-x.

Si ves una S mayúscula en la posición de ejecución del grupo, esto indica que, aunque se haya establecido el permiso setgid, en realidad no está realmente en efecto debido a que el grupo carece de los permisos de ejecución para utilizarlo.

El Permiso Sticky Bit

El permiso sticky bit se utiliza para evitar que otros usuarios eliminen los archivos de los que no son dueños en un directorio compartido. ¡Recordemos que cualquier usuario con permiso de escritura en un directorio puede crear archivos en ese directorio, así como eliminar cualquier archivo del directorio, incluso si no es el propietario del archivo!

El permiso sticky bit permite que los archivos se puedan compartir con otros usuarios, cambiando el permiso de escritura en el directorio para que los usuarios aún puedan añadir y eliminar los archivos del directorio, pero los archivos sólo pueden ser borrados por el propietario del archivo o el usuario root.

Para establecer el permiso sticky bit simbólicamente, ejecuta un comando como el siguiente:

chmod o+t <directorio>

Para establecer el permiso sticky bit numéricamente, añade 1000 a los permisos existentes del directorio (asume que el directorio en el ejemplo siguiente tenía originalmente 775 para su permiso):

chmod 1775 <archivo|directorio>

Para retirar el permiso sticky bit simbólicamente, ejecuta:

chmod o-t <directorio>

Para retirar el permiso sticky bit numéricamente, resta 1000 de los permisos existentes del directorio:

chmod 0775 <directorio>

La salida del comando ls -l visualiza el permiso sticky bit con una t en la posición de ejecución de «otros»: drwxrwxrwt.

Una t minúscula significa que tanto el permiso sticky bit como los permisos de ejecución están establecidos para «otros». Una T mayúscula significa que sólo el permiso sticky bit está establecido: drwxrwxrwT.

Mientras la S mayúscula indica un problema con los permisos setuid o setgid, una T mayúscula no indica necesariamente un problema, siempre y cuando el grupo propietario aún tenga permiso de ejecución.

Un buen ejemplo del uso de directorios con el permiso sticky bit serían los directorios /tmp y /var/tmp. Estos directorios están diseñados como ubicaciones donde cualquier usuario puede crear un archivo temporal.

Debido a que estos directorios están destinados a ser modificables por todos los usuarios, están configurados para utilizar el permiso sticky bit. Sin este permiso especial, un usuario podría eliminar los archivos temporales de otro usuario.

Los Enlaces Físicos y los Enlaces Simbólicos

Considera el siguiente escenario: hay un archivo profundamente enterrado en el sistema de archivos llamado /usr/share/doc/superbigsoftwarepackage/data/2013/october/tenth/valuable-information.txt. Es un archivo que se actualiza de forma rutinaria por otro usuario y al que habitualmente necesitas tener acceso. Introducir este largo nombre de archivo no es una opción ideal, pero el archivo debe residir en este lugar y, ya que se actualiza de forma regular, no se puede simplemente hacer una copia del archivo.

Ésta es una situación en la que los enlaces físicos y los simbólicos (blandos) pueden ser útiles. Se puede crear un archivo que se enlazara al que está «profundamente enterrado». Este nuevo archivo podría ser colocado en tu directorio home o cualquier otro lugar conveniente. Cuando accedes al archivo nuevo de «enlace», éste accederá a los contenidos del archivo valuable-information.txt.

Cada método de enlace, físico o simbólico, resulta en el mismo acceso global, pero utilizan diferentes técnicas. Existen ventajas y desventajas de cada método, por lo que conocer ambas técnicas y cuando se usan es importante.

Creación de los Vínculos Físicos

Con el fin de entender los enlaces físicos, hay que entender un poco cómo el sistema de archivos realiza un seguimiento de los archivos. Por cada archivo creado, hay un bloque de datos en el sistema de archivos que almacena la información meta del archivo. La información meta incluye información sobre el archivo, tal como los permisos, propiedades y marcas de tiempo. Información meta no incluye el nombre del archivo o el contenido del archivo, pero sí incluye casi toda la demás información sobre el archivo.

A esta información meta se le llama la tabla de inodos del archivo. La tabla de inodos también incluye punteros a otros bloques en el sistema de archivos llamados bloques de datos donde se almacenan los datos.

Cada archivo en una partición tiene un número de identificación único llamado número de inodo. El comando ls -i mostrará el número de inodo de un archivo. Al igual que los usuarios y grupos, lo que realmente define un archivo no es su nombre, sino más bien el número que se le haya asignado.

La tabla de inodos no incluye el nombre del archivo. Para cada archivo, también hay una entrada que se almacena en el área de datos de un directorio (bloque de datos) que incluye una asociación entre un número de inodo y un nombre de archivo.

En el bloque de datos para el directorio /etc habría una lista de todos los archivos de este directorio y su número de inodo correspondiente. Por ejemplo:

passwd123
shadow175
group144
gshadow897

Cuando se intenta acceder al archivo /etc/passwd, el sistema utiliza esta tabla para traducir el nombre de archivo en un número de inodo. A continuación, recupera los datos del archivo al ver la información en la tabla de inodos para el archivo.

Los enlaces físicos son dos nombres de archivo que apuntan al mismo inodo. Por ejemplo, considera las siguientes entradas de directorio:

passwd123
mypasswd123
shadow175
group144
gshadow897

Debido a que tanto el archivo passwd como el mypasswd tienen el mismo número de inodo, en realidad, son el mismo archivo. Puedes acceder a los datos del archivo utilizando cualquiera de los dos nombres de archivo.

Al ejecutar el comando ls -l, el número que aparece para cada archivo entre los permisos de usuario y el propietario es la cuenta de enlaces:

sysadmin@localhost:~$ echo data > file.original 
sysadmin@localhost:~$ ls -li file.* 
278772 -rw-rw-r--. 1 sysadmin sysadmin 5 Oct 25 15:42 file.original

El número contador de enlaces indica cuántos enlaces físicos fueron creados. Cuando el número es un valor de uno, entonces el archivo sólo tiene un nombre relacionado con el inodo.

Para crear los enlaces físicos, se utiliza el comando ln con el primer argumento siendo el nombre de archivo existente y el segundo argumento es el nuevo archivo. Cuando utilizas el comando ln para crear un enlace físico, el número del enlace aumentará en una unidad por cada nombre de archivo adicional que enlaces:

sysadmin@localhost:~$ ln file.original file.hard.1
sysadmin@localhost:~$ ls -li file.*
278772 -rw-rw-r--. 2 sysadmin sysadmin 5 Oct 25 15:53 file.hard.1
278772 -rw-rw-r--. 2 sysadmin sysadmin 5 Oct 25 15:53 file.original

Creación de Enlaces Simbólicos

Un enlace simbólico es simplemente un archivo que apunta a otro archivo. Hay varios enlaces simbólicos que ya están en el sistema, incluyendo varios en el directorio /etc :

sysadmin@localhost:~$ ls -l /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Feb 15  2011 /etc/grub.conf -> ../boot/grub/grub.conf

En el ejemplo anterior, se puede ver que el archivo /etc/grub.conf «apunta» al archivo ../boot/grub/grub.conf. Por lo tanto, si intentaras ver el contenido del archivo /etc/grub.conf, éste seguiría el puntero y mostraría el contenido del archivo ../boot/grub/grub.conf.

Para crear un enlace simbólico, utiliza la opción -s con el comando ln:

sysadmin@localhost:~$  ln -s /etc/passwd mypasswd
sysadmin@localhost:~$  ls -l mypasswd
lrwxrwxrwx. 1 sysadmin sysadmin 11 Oct 31 13:17 mypasswd -> /etc/passwd

Comparación de los Enlaces Físicos y Simbólicos

Mientras que los enlaces físicos y simbólicos tienen el mismo resultado final, las diferentes técnicas producen diferentes ventajas y desventajas. De hecho, la ventaja de una técnica compensa la desventaja de la otra técnica.

Ventaja: Enlaces físicos – ningún punto único de fallo

Una de las ventajas de utilizar los enlaces físicos es que cada nombre de archivo para el contenido del archivo es equivalente. Si tienes cinco archivos enlazados físicamente entre sí, entonces eliminando cualquiera de estos cuatro archivos no daría lugar a la eliminación del contenido del archivo real.

Recordemos que realmente un archivo está asociado con un número de inodo único. Mientras permanezca uno de los archivos enlazados físicamente, entonces ese número de inodo sigue existiendo. Esto significa que aún existen los datos del archivo.

Los enlaces simbólicos, sin embargo, tienen un único punto de fallo: el archivo original. Consideremos el siguiente ejemplo en el que el acceso a los datos fallará si se elimina el archivo original:

sysadmin@localhost:~$ echo "hi there" > test.txt
sysadmin@localhost:~$ ln -s test.txt mytest.txt
sysadmin@localhost:~$ more test.txt
hi there
sysadmin@localhost:~$ more mytest.txt
hi there
sysadmin@localhost:~$ rm test.txt
sysadmin@localhost:~$ more mytest.txt
mytest.txt: No such file or directory
sysadmin@localhost:~$ ls -l mytest.txt
lrwxrwxrwx. 1 sysadmin sysadmin 8 Oct 31 13:29 mytest.txt -> test.txt

Ventaja: Los enlaces blandos – fáciles de ver

A veces puede ser difícil saber dónde están los enlaces físicos a un archivo. Si ves un archivo normal con un número de enlace mayor que uno, puedes utilizar el comando find con el criterio de búsqueda -inum para localizar los otros archivos que tienen el mismo número de inodo. Para encontrar el número de inodo, primero utilizarías el comando ls -i:

sysadmin@localhost:~$ ls -i file.original 
278772 file.original
sysadmin@localhost:~$ find / -inum 278772 2> /dev/null
/home/sysadmin/file.hard.1
/home/sysadmin/file.original

Los enlaces blandos son mucho más visuales y no requieren ningún comando adicional más allá del comando ls para determinar el vínculo:

sysadmin@localhost:~$ ls -l mypasswd
lrwxrwxrwx. 1 sysadmin sysadmin 11 Oct 31 13:17 mypasswd -> /etc/passwd

Ventaja: Los enlaces blandos – pueden vincular cualquier archivo

Debido a que cada sistema de archivos (partición) tiene un conjunto independiente de inodos, no se pueden crear enlaces físicos que intenten cruzar los sistemas de archivos:

sysadmin@localhost:~$ ln /boot/vmlinuz-2.6.32-358.6.1.el6.i686 Linux.Kernel
ln: creating hard link `Linux.Kernel' => `/boot/vmlinuz-2.6.32-358.6.1.el6.i686': Invalid cross-device link

En el ejemplo anterior, se intentó crear un enlace físico entre un archivo en el sistema de archivos /boot y el sistema de archivos /; éste falló porque cada uno de estos sistemas de archivos tiene un conjunto único de números de inodo que no se pueden utilizar fuera del sistema de archivos.

Sin embargo, debido a que un enlace simbólico apunta a otro archivo con un nombre de ruta, se puede crear un vínculo simbólico a un archivo en otro sistema de archivos:

sysadmin@localhost:~$  ln -s /boot/vmlinuz-2.6.32-358.6.1.el6.i686 Linux.Kernel
sysadmin@localhost:~$  ls -l Linux.Kernel
lrwxrwxrwx. 1 sysadmin sysadmin 11 Oct 31 13:17 Linux.Kernel -> /boot/vmlinuz-2.6.32-358.6.1.el6.i686

Ventaja: Enlaces blandos – pueden enlazar un directorio

Otra limitación de los enlaces físicos es que no se pueden crear en directorios. La razón de esta limitación es que el propio sistema operativo utiliza enlaces físicos para definir la jerarquía de la estructura de directorios. El siguiente ejemplo muestra el mensaje de error que se muestra si se intenta enlazar físicamente un directorio:

sysadmin@localhost:~$ ln /bin binary
ln: `/bin': hard link not allowed for directory

Enlazando los directorios utilizando un enlace simbólico está permitido:

sysadmin@localhost:~$ ln -s /bin binary
sysadmin@localhost:~$ ls -l binary
lrwxrwxrwx. 1 sysadmin sysadmin 11 Oct 31 13:17 binary -> /bin

Estándar de Jerarquía del Sistema de Archivos

Entre los estándares soportados por la Fundación Linux está el Estándar de Jerarquía del Sistema de Archivos (FHS), que está alojado en la URL http://www.pathname.com/fhs.

Un estándar es un conjunto de reglas o directrices que se recomiendan a seguir. Sin embargo, estas directrices sin duda pueden romperse, ya sea por las distribuciones enteras o por los administradores en las máquinas individuales.

El estándar FHS categoriza cada directorio del sistema de dos maneras:

  1. Un directorio puede ser categorizado como compartible o no, es decir, si el directorio puede ser compartido en una red y utilizado por varios equipos.
  2. El directorio se pone en una categoría de tener archivos estáticos (el contenido del archivo no cambiará) o archivos variables (el contenido del archivo puede cambiar).

Con el fin de poder hacer estas clasificaciones, a menudo es necesario hacer referencia a los subdirectorios debajo del nivel superior de los directorios. Por ejemplo, el directorio /var en sí no puede ser clasificado como compartible o no compartible, pero uno de sus subdirectorios, el directorio /var/mail, es compartible. Por el contrario, el directorio /var/lock no debe ser compartible.

No compartibleCompartible
Variable/var/lock/var/mail
Estático/etc/opt

El estándar FHS define cuatro jerarquías de directorios utilizados en la organización de los archivos del sistema de archivos. El nivel superior o jerarquía root viene seguido por:

DirectorioPropósito del Directorio
/La base de la estructura, o el root del sistema de archivos, este directorio unifica todos los directorios independientemente si son particiones locales, dispositivos extraíbles o recursos compartidos de red
/binPara mantener binarios esenciales como los comandos ls, cp, y rm, y ser parte del sistema de archivos root.
/bootContiene los archivos necesarios para arrancar el sistema, como el kernel de Linux y los archivos de configuración asociados
/devViene rellenado de archivos que representan los dispositivos de hardware y otros archivos especiales, tales como los archivos /dev/null y /dev/zero
/etcContiene los archivos de configuración de host esenciales, como los archivos /etc/hosts o /etc/passwd
/homeLa ubicación de los directorios home de los usuarios
/libLas librerías esenciales de soporte para los archivos ejecutables en los directorios /bin y /sbin
/lib<qual>Las librerías esenciales creadas para una arquitectura específica. Por ejemplo, el directorio /lib64 para los procesadores de 64 bit AMD/Intel x86 compatibles
/mediaEl punto de montaje para los medios extraíbles que se montan automáticamente
/mntUn punto de montaje para montar temporalmente sistemas de archivos de manera manual
/optUbicación opcional de la instalación de software de terceros
/procUn sistema de archivos virtual para que el kernel reporte procesos y otra información
/rootEl directorio inicial del usuario root
/sbinLos binarios esenciales del sistema utilizados principalmente por el usuario root
/sysUn sistema de archivos virtual que contiene información acerca de los dispositivos de hardware conectados al sistema
/srvUbicación donde los servicios específicos del sitio pueden estar alojados
/tmpDirectorio en el que todos los usuarios tienen permiso para crear archivos temporales que deberían ser borrados durante el arranque (pero a menudo no es así)
/usrLa segunda jerarquía de archivos que no son esenciales para el uso de múltiples usuarios
/usr/localLa tercera jerarquía de archivos para software que no sea originario de la distribución
/varLa jerarquía /var contiene archivos que cambian durante el tiempo
/var/cacheArchivos utilizados para almacenar en caché, los datos de la aplicación
/var/logEl directorio donde se ubica la mayoría de los archivos de registro
/var/lockUbicación para guardar los archivos de bloqueo de los recursos compartidos
/var/spoolUbicación para almacenar los archivos spool de impresión y correo
/var/tmpLos archivos temporales que se deben conservar entre los reinicios

La segunda y la tercera jerarquía, que se encuentra bajo los directorios /usr y /usr/local, repiten el patrón de muchos de los directorios clave que se encuentran debajo de la primera jerarquía o el sistema de archivos root. La cuarta jerarquía, el directorio /var, también repite algunos de los directorios de primer nivel, como lib, opt y tmp.

Cuando el sistema de archivos root y su contenido se consideran esenciales o necesarios para arrancar el sistema, los directorios /var, /usr y /usr/local no se consideran esenciales para el proceso de arranque. Como resultado, el sistema de archivos root y sus directorios pueden ser los únicos disponibles en ciertas situaciones, tales como arrancar en modo de usuario único, un entorno diseñado para la solución de problemas del sistema.

El directorio /usr sirve para contener software para su uso por varios usuarios. El directorio /usr a veces se comparte a través de la red y se monta como de sólo lectura. Los directorios comunes de segundo nivel se describen en la siguiente tabla:

DirectorioPropósito del Directorio
/usr/binLos binarios para el usuario común, usados cuando el sistema está en modo multiusuario
/usr/includeLos archivos que se incluyen para compilar el software de distribución
/usr/libLas librerías de soporte para los archivos ejecutables en los directorios /usr/bin y /usr/sbin
/usr/lib<qual>Las librerías no esenciales creadas para una arquitectura específica
/usr/libexecLos programas ejecutables utilizados por otros programas y no directamente por los usuarios
/usr/sbinLos binarios del sistema para su uso por el administrador en modo multiusuario
/usr/shareUbicación para almacenar documentación de software y otros datos de aplicación
/usr/srcEl código fuente para compilar el kernel

La jerarquía /usr/local sirve para la instalación del software que no se origina con la distribución. A menudo, este directorio se utiliza para software que se complia a partir del código fuente. Los directorios de tercer nivel comunes que se encuentran bajo el directorio /usr/local se describen en la siguiente tabla:

DirectorioPropósito del Directorio
/usr/local/binLos binarios de software locales para el uso de un usuario ordinario
/usr/local/etcLos archivos de configuración de software locales
/usr/local/includeLos archivos que necesitan ser incluidos con el fin de compilar el código fuente local
/usr/local/libLos archivos de la librería de soporte para los archivos ejecutables en los directorios /usr/local/bin y /usr/local/sbin
/usr/local/libexecLos programas ejecutables utilizados por otros programas y no directamente por los usuarios
/usr/local/sbinLos binarios locales para uso del administrador del sistema
/usr/local/shareUbicación para almacenar las páginas man, páginas de información, y otra información de aplicaciones locales
/usr/local/srcLa ubicación en la que menudo se coloca el código fuente de software para ser compilado localmente

La Organización Dentro de la Jerarquía del Sistema de Archivos

Aunque el estándar FHS es útil para una comprensión detallada de la disposición de los directorios utilizados por la mayoría de las distribuciones de Linux, a continuación se ofrece una descripción más generalizada de la estructura de los directorios como realmente existen en una distribución típica de Linux.

Los Directorios Home

El directorio /home tendrá típicamente un directorio inferior para cada cuenta de usuario. Por ejemplo, el usuario bob normalmente tendrá su directorio home de /home/bob. Normalmente, sólo el usuario bob tendrá acceso a este directorio. Sin ser asignados permisos especiales en otros directorios, un usuario normalmente sólo puede crear archivos en su directorio home, en el directorio /tmp y el directorio /var/tmp.

Los Directorios Binarios

Los directorios binarios contienen programas que los usuarios y los administradores ejecutarán para iniciar los procesos o las aplicaciones del sistema. Los directorios binarios, que están destinados a ser utilizados por los usuarios sin privilegios, incluyen los directorios /bin, /usr/bin y /usr/local/bin. A veces el software de terceros también almacenará sus archivos ejecutables en los directorios, tales como /usr/local/application/bin y /opt/application/bin. Además, no es inusual que cada usuario tenga su propio directorio bin ubicado en su directorio home, tal como /home/bob/bin.

Por otra parte, los directorios sbin están destinados principalmente a ser utilizados por el administrador del sistema (usuario root). Estos por lo general incluyen los directorios /sbin, /usr/sbin y /usr/local/sbin, aunque las aplicaciones administrativas de terceros también podrían utilizar directorios como /usr/local/application/sbin o /opt/application/sbin.

Dependiendo de la distribución, la variable PATH puede no contener todos los directorios bin y sbin. Con el fin de poder ejecutar un comando en uno de estos directorios, el directorio debe ser incluido en la lista de las variables PATH o el usuario tiene que especificar la ruta al comando, por ejemplo: /sbin/ifconfig.

Los Directorios de las Aplicaciones de Software

A diferencia del sistema operativo Windows, donde las aplicaciones pueden tener todos sus archivos instalados en un único subdirectorio bajo el directorio C:\Program Files, las aplicaciones de Linux pueden tener sus archivos en varios directorios repartidos a lo largo del sistema de archivos de Linux. Para las distribuciones Debian, puedes ejecutar la aplicación dpkg -L para obtener la lista de ubicación de los archivos. En las distribuciones de Red Hat, puedes ejecutar la aplicación rpm -ql para listar la de ubicación de los archivos que pertenecen a esa aplicación.

Los archivos binarios de los programas ejecutables pueden ir en el directorio /usr/bin, si vienen incluidos en el sistema operativo, o de lo contrario pueden ir a los directorios /usr/local/bin o /opt/application/bin en caso de que procedan de un tercero.

Los datos para la aplicación pueden ser almacenados en uno de los siguientes subdirectorios: /usr/share, /usr/lib, /opt/application o /var/lib.

El archivo relacionado con la documentación se puede almacenar en uno de los siguientes subdirectorios: /usr/share/doc, /usr/share/man o /usr/share/info.

El archivo(s) de configuración global para una aplicación muy probablemente se almacene en un subdirectorio bajo el directorio /etc, mientras que los archivos de configuración personalizados (específicos para un usuario) para la aplicación están, probablemente, en un subdirectorio oculto del directorio home del usuario.

Los Directorios de Librerías

Las librerías son archivos que contienen código que se comparte entre varios programas. La mayoría de los nombres de archivo de la librería terminan con una extensión de archivo .so, lo que significa objeto compartido (shared object).

Puede haber varias versiones de una librería debido a que el código puede ser diferente dentro de cada archivo a pesar de que puede llevar a cabo funciones similares a las otras versiones de la librerías. Una de las razones por las que el código puede ser diferente, a pesar de que puede hacer lo mismo que otro archivo de la biblioteca, es que está compilado para ejecutarse en un tipo diferente de procesador. Por ejemplo, es habitual que los sistemas que utilizan un código diseñado para los procesadores de tipo Intel/AMD de 64 bits, tengan las dos bibliotecas, la de 32 bits y de 64 bits.

Las librerías que dan soporte a los programas binarios esenciales que se encuentran en los directorios /bin y /sbin típicamente se encuentran en /lib o /lib64.

Para dar soporte a los ejecutables /usr/bin y /usr/sbin, normalmente se usan los directorios librerías /usr/lib y /usr/lib64.

Para dar soporte a las aplicaciones que no se distribuyen con el sistema operativo, a menudo se utilizan los directorios librería /usr/local/lib y /opt/application/lib.

Los Directorios de Datos Variables

Los directorios /var y muchos de sus subdirectorios pueden contener datos que vayan a cambiar con frecuencia. Si el sistema se utiliza para correo electrónico, normalmente se utilizará /var/mail o /var/spool/mail para almacenar los datos de correo electrónico del usuario. Si vas a imprimir desde tu sistema, entonces el directorio /var/spool/cups se utilizará para almacenar temporalmente los trabajos de impresión.

Dependiendo de los eventos que el sistema está registrando y la cantidad de actividad que hay en el sistema, se determinará el tamaño de tu archivo de registro. En un sistema ocupado, puede haber una considerable cantidad de datos en los archivos de registro. Estos archivos se almacenan en el directorio /var/log.

Mientras que los archivos de registro pueden ser extremadamente útiles para solucionar los problemas, también pueden causar problemas. Una de las principales preocupaciones de todos estos directorios es que pueden llenar rápidamente el espacio del disco en un sistema activo. Si el directorio /var no es una partición separada, entonces el sistema de archivos root se podría llenar por completo y bloquear el sistema.

Creditos > netacad.com

Related Posts

Deja una respuesta

Tu dirección de correo electrónico no será publicada.