martes, 30 de septiembre de 2008

Comandos basicos y utiles para administradores

Cuando uno se dedica a la administracion de servidores, es común que utilicemos muchos comandos e instrucciones, y mas común es que nos olvidemos de como funcionan o mejor dicho, de cual es el que necesitamos para determinada tarea.
Eh aqui algunos comandos básicos y útiles para los administradores de sistemas Linux/Unix/BSD.


1. Sistema
(Hardware, Statistics, Users, Limits, Runlevels, root password, Compiel Kernel)

Running kernel and system information
# uname -a                       # Obtiene la version de kernel
# lsb_release -a # informacion completa de cualquier distribucion BSD
# cat /etc/SuSE-release # Obtener la version de SuSE
# cat /etc/version # Obtener la version de Slackware
# cat /etc/debian_version # Obtener la version de Debian

Utiliza /etc/DISTR-release con DISTR= lsb (Ubuntu), redhat, gentoo, mandrake, sun (solaris) y demas, tambien checa /etc/issue

# uptime                         # muestra el tiempo que ha estado encendido tu sistema
# hostname # Nombre del host
# hostname -i # Muestra la direccion IP del sistema. (Linux solamente)
# man hier # Descripcion de jeraquias del sistema de archivos
# last reboot # Muestra historial de reinicios del sistema

1.1 Informacion del Hardware
Hardware detectado por el kernel

# dmesg                          # Hardware detectado y mensajes de inicio
# lsdev # informacion del hardware installado
# dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 # Lee el BIOS
Linux
# cat /proc/cpuinfo              # o del CPU
# cat /proc/meminfo # Información de la memoria
# grep MemTotal /proc/meminfo # Despliega la memoria física
# watch -n1 'cat /proc/interrupts' # Ver interrupciones en cambio continuo
# free -m # Memoria utilizada y libre (-m muestra en MB)
# cat /proc/devices # Dispositivos configurados
# lspci -tv # Muestra dispositivos PCI
# lsusb -tv # Muestra dispositivos USB
# lshal # Muestra una lista de todos los dispositivos con sus proiedades
# dmidecode # Muestra DMI/SMBIOS: información hw del BIOS
FreeBSD
# sysctl hw.model                # Modelo del CPU
# sysctl hw # Devuelve bastante información del hardware
# sysctl vm # Use de la memoria
# dmesg | grep "real mem" # Hardware memory
# sysctl -a | grep mem # Kernel memory información y configuración
# sysctl dev # dispositivos configurados
# pciconf -l -cv # Muestra los dispositivos PCI
# usbdevs -v # Muestra los dispositivos USB
# atacontrol list # Muestra los dispositivos ATA
# camcontrol devlist -v # Muestra los dispositivos SCSI

1.2 Carga, estadísticas y mensajes

Los siguientes comandos son útiles para averiguar lo que está sucediendo en el sistema.
# top                            # despliega y actualiza los procesos del CPU
# mpstat 1 # despliega estadísticas relacionadas a procesadores
# vmstat 2 # estadísticas de memoria virtual
# iostat 2 # despliega estadísticas de E/S (intervalo de 2 seg)
# systat -vmstat 1 # BSD sumario de estadísticas del sistema (intervalos de 1 s)
# systat -tcp 1 # BSD conexiones tcp (intenta con -ip)
# systat -netstat 1 # BSD conecciónes de red activas
# systat -ifstat 1 # BSD trafico de red a través de las interfaces activas
# systat -iostat 1 # BSD rendimiento del Disco y del CPU
# tail -n 500 /var/log/messages # Últimos 500 mensajes del kernel/syslog
# tail /var/log/warn # Mensajes de advertencia del sistema, ver syslog.conf
1.3 Usuarios
# id                             # Muestra id de usuarios activos, grupo y login
# last # muestra los últimos logins al sistema
# who # Quién esta activo en el sistema
# groupadd admin # Agrega el grupo "admin" y el usuario colin (Linux/Solaris)
# useradd -c "Colin Barschel" -g admin -m colin
# usermod -a -G # Agregar usuario existente al grupo (Debian)
# groupmod -A # Agregar usuario existente al grupo (SuSE)
# userdel colin # Borrar usuario colin (Linux/Solaris)
# adduser joe # FreeBSD agrega usuario joe (interactivo)
# rmuser joe # FreeBSD borrar usuario joe (interactivo)
# pw groupadd admin # Usa pw on FreeBSD
# pw groupmod admin -m newmember # Agregar nuevo miembro al grupo
# pw useradd colin -c "Colin Barschel" -g admin -m -s /bin/tcsh
# pw userdel colin; pw groupdel admin
Los passwords son encriptados y almacenados en /etc/shadow para Linux y solaris, para FreeBSD en /etc/master.passwd Si master.passwd es modificado manualmente (borrando un password) , ejecuta # pwd_mkdb -p master.passwd para reconstruir la base de datos.

Para prevenir temporalmente el acceso al sistema (para todos los usuarios excepto root) utiliza nologin. Se desplegara el mensaje en nologin (puede no funfionar con ssh pre-shared keys).
# echo "Sorry no login now" > /etc/nologin       # (Linux)
# echo "Sorry no login now" > /var/run/nologin # (FreeBSD)
1.4 Limites
Algunas aplicaciones requieren limites muy altos al abrir archivos y sockets (proxys, web servers, bases de datos), Los limites por defeto usualmente son muy bajos.

Linux
Para shell/script
Los limites del shell son gobernados por ulimit, el estado es checado con ulimit -a. Por ejemplo, para cambiar el límite de archivos abiertos de 1024 a 10240 ejecuta:
# ulimit -n 10240                # This is only valid within the shel
El commando ulimit puede ser utilizado en un script para cambiar los limites solo dentro del script.

Para usuarios/procesos
Usuarios activos y aplicaciones pueden ser configurados en /etc/security/limits.conf. Por ejemplo:
# cat /etc/security/limits.conf
* hard nproc 250 # Limit user processes
asterisk hard nofile 409600 # Limit application open files
Sistema
Los limites del kernel se establecen con sysctl. Los limites permanentes se establecen en /etc/sysctl.conf.
# sysctl -a                      # Ver todos los limites del sistema
# sysctl fs.file-max # Ver limite max. de archivos abiertos
# sysctl fs.file-max=102400 # Cambiar max. de archivos abiertos
# echo "1024 50000" > /proc/sys/net/ipv4/ip_local_port_range # rango de puerto
# cat /etc/sysctl.conf
fs.file-max=102400 # Entrada permanente en sysctl.conf
# cat /proc/sys/fs/file-nr # Cuantos descriptores de archivos hay en uso
FreeBSD
Para shell/script
Utilizar el comando limits en csh o tcsh o como en Linux, utilizar ulimit en sh o bash shell.

Para usuarios/procesos
Los limites por default al acceder están configurados en /etc/login.conf. Un valor ilimitado sigue siendo limitado por el valor máximo del sistema.

Sistema
Límites del kernel
# sysctl -a                      # Ver todos los limites del sistema
# sysctl kern.maxfiles=XXXX # número máximo de descriptores de archivos
kern.ipc.nmbclusters=32768 # Entrada permanente en /etc/sysctl.conf
kern.maxfiles=65536 # Valores típicos para Squid
kern.maxfilesperproc=32768
kern.ipc.somaxconn=8192 # Cola TCP. Mejor para apache/sendmail
# sysctl kern.openfiles # cuantos descriptores de archivos hay en uso
# sysctl kern.ipc.numopensockets # Cuantos sockets abiertos hay en uso
# sysctl -w net.inet.ip.portrange.last=50000 # Default es 1024-5000
# netstat -m # estadísticas del bufer de memoria de red
Para detalles, vea FreeBSD handbook Chapter 11

Solaris
Los valores siguientes en /etc/system, incrementarán el máximo de descriptores de archivo por procesos:
set rlim_fd_max = 4096           # Hard limit en descriptores de archivo para un solo proc
set rlim_fd_cur = 1024 # Soft limit en descriptores de archivo para un solo proc
1.5 Limites
Linux
Una vez que inicio el sistema, el kernel ejecuta init que a su vez llama a rc el cual carga todos los scripts pertenecientes a un runlevel. Los scripts son almacenados en /etc/init.d y ligados a /etc/rc.d/rcN.d donde N es el número de runlevel.
El runlevel por defecto esta configurado en /etc/inittab que usualmente es 3 o 5:
# grep default: /etc/inittab
id:3:initdefault:
El runlevel actual (ver lista siguiente) puede ser cambiado con init. Por ejemplo para pasar de runlevel 3 a 5:
# init 5                             # Enters runlevel 5
  • 0 Shutdown and halt
  • 1 Single-User mode (also S)
  • 2 Multi-user without network
  • 3 Multi-user with network
  • 5 Multi-user with X
  • 6 Reboot
Utiliza chkconfig para configurar los programas que serán ejecutados al iniciar un runlevel.
# chkconfig --list               # Lista todos los scripts init
# chkconfig --list sshd # Reporta el estado de sshd
# chkconfig sshd --level 35 on # Configura sshd para los niveles 3 y 5
# chkconfig sshd off # Deshabilita sshd para todos los runlevels
Debian y todas las distribuciones basadas en el, utilizan update-rc.d para administrar los scripts de runlevels. Por defecto se inicia en 2, 3, 4 y 5 y apagar en 0, 1 y 6.
# update-rc.d sshd defaults      # Activa sshd con el runlevel por default
# update-rc.d sshd start 20 2 3 4 5 . stop 20 0 1 6 . # Con argumentos específicos
# update-rc.d -f sshd remove # Dashabilita sshd para todos los runlevels
# shutdown -h now (or # poweroff)# Shutdown and halt the system
FreeBSD
El enfoque de arranque BSD es diferente del SysV, no existen los niveles de ejecución (runlevels). El estado final de inicio (single user, con o sin X) es configurado en /etc/ttys. Todos los scripts del Sistema Operativo (SO) se localizan en /etc/rc.d/ y en /usr/local/etc/rc.d/ para aplicaciones de terceros. La activación de los servicios es configurada en /etc/rc.conf y /etc/rc.conf.local. El comportamiento predeterminado está configurado en /etc/defaults/rc.conf. Los scripts responden al menos a start | stop | status.
# /etc/rc.d/sshd status
sshd is running as pid 552.
# shutdown now # Go into single-user mode
# exit # Go back to multi-user mode
# shutdown -p now # Shutdown and halt the system
# shutdown -r now # Reboot
El proceso init también se puede utilizar para llegar a uno de los siguientes estados nivel. Por ejemplo # init 6 para reiniciar.
  • 0 Halt and turn the power off (signal USR2)
  • 1 Go to single-user mode (signal TERM)
  • 6 Reboot the machine (signal INT)
  • c Block further logins (signal TSTP)
  • q Rescan the ttys(5) file (signal HUP)
1.6 Reset al pasword de root
Linux método 1
En el boot loader (lilo o grub), entre la siguiente opción de inicio:
init=/bin/sh
El kernel montara la partición raiz e init iniciara el bourne shell en vez de rc y un runlevel. Utilice el comando passwd en el prompt del sistema paracambiar el password y después reinicie. Olvídese del modo single user (usuario unico) a menos que requiera cambiar el password.
Si después de iniciar, la partición raíz es montada como solo lectura, remontela con rw
# mount -o remount,rw /
# passwd # or delete the root password (/etc/shadow)
# sync; mount -o remount,ro / # sync before to remount read only
# reboot
FreeBSD método 1
En FreeBSD, iniciar en modo single user, remontar la partición root / como rw y utilice passwd. Usted puede seleccionar el modo de single user en el menú de inicio (opcion 4) el cual es desplegado por 10 segundos al iniciar. El modo single user debe darle un shell como root en la partición /
# mount -u /; mount -a           # montara / rw
# passwd
# reboot
Linux, FreeBSD y Unix metodo 2
Otros Unix puede que no le permitan hacerlo con el simple truco de init. La solución es montar la partición raíz de algún otro sistema operativo (como un CD de rescate) y cambiar la contraseña en el disco.
  • Inicie con un live CD o CD de instalacion in modo rescate el cual le dará un shell.
  • Localice la partición raíz con fdisk p.e. fdisk /dev/sda
  • Montela y utilice chroot:
# mount -o rw /dev/ad4s3a /mnt
# chroot /mnt # chroot into /mnt
# passwd
# reboot
1.7 Módulos del kernel

Linux

# lsmod                          # Lista todos los módulos cargados en el kernel
# modprobe isdn # cargar un modulo (aquí isdn)

FreeBSD

# kldstat                        # Lista todos los módulos cargados en el kernel
# kldload crypto # Cargar un modulo (aquí crypto)
1.8 Compilar el kernel
Linux
# cd /usr/src/linux
# make mrproper # Limpia todo, incluyendo archivos de configuración
# make oldconfig # Reutilizar el viejo .config si existe
# make menuconfig # o xconfig (Qt) o gconfig (GTK)
# make # Crear una imagen del kernel
# make modules # Compilar módulos
# make modules_install # Instalar módulos
# make install # Instalar el kernel
# reboot
FreeBSD
Opcionalmente actualizar el árbol de código fuente (en /usr/src) con csup (a partir de FreeBSD 6.2 o posterior):
# csup 
Se puede utilizar el siguiente supfile como ejemplo:
*default host=cvsup5.FreeBSD.org  # www.freebsd.org/handbook/cvsup.html#CVSUP-MIRRORS
*default prefix=/usr
*default base=/var/db
*default release=cvs delete tag=RELENG_7
src-all
Para modificar y reconstruir el kernel, copie el archivo de configuración genérico en uno nuevo y editelo a sus necesidades (también puede editar el archivo GENERIC directamente). Para reiniciar la construción despues de una interrupción, agregue la opción NO_CLEAN=YES al comando make a fin de evitar se limpien los objetos ya construidos.
# cd /usr/src/sys/i386/conf/
# cp GENERIC MYKERNEL
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
Para reconstruir el SO completamente:
# make buildworld                # Construye el SO completo pero no el kernel
# make buildkernel # Utilice KERNCONF como en el caso anterior si procede
# make installkernel
# reboot
# mergemaster -p # Compara solo los archivos sabemos son escenciales
# make installworld
# mergemaster -i -U # Actualizacón de toda la configuración y otros archivos
# reboot
Para cambios pequeños en la fuente puede utilizar NO_CLEAN=yes a fin de evitar la reconstrucción de todo el árbol. Sin embargo, utilícelo con cuidado.
# make buildworld NO_CLEAN=yes   # No borrar los objetos anteriores
# make buildkernel KERNCONF=MYKERNEL NO_CLEAN=yes

Hasta la próxima.


Fuente: UnixToolBox

4 comentarios:

Alfredo Campos dijo...

Algunas aclaraciones, respecto a Solaris:

1. Para saber la versión del Solaris que tienen corriendo es con:
> uname -a
> cat /etc/release

En cuanto al tiempo que ha estado arriba el sistema, pueden ejecutar
> who -b

que les da la hora en la que se reinició el sistema.

1.2 Carga, estadísticas y mensajes.

Sobre esto he econtrado algunas opciones interesantes con el comando ps que escribiré en un artículo próximo del blog.

Por lo pronto incluyo algunos comandos útiles:

- prstat : Reporta estadísticas de losp rocesos activos. Este comando les devuelve entre otras cosas un gran total de unnúmero de ejecuciones determinadas. Pueden ejecutar algo como lo siguiente:

> prstat -v -n 1000,1 1 1 | sort -k 1,1 |grep -v Total|grep -v USERNAME

se van a divertir.

- sar : System activity reporter
Ahora, podrían decirme qué significan estos dos comandos? ;)

> sar -p 1 59 | grep Average (1 min)
> sar -p 1 3540 | grep Average (1 hr)

- vmstat .. auqnue ya lo tieen, pueden jugar cone ste:

> vmstat -p 1 10

Saludos!

Alfredo Campos dijo...

Querido Yusuf:

En el punto 1.4 (Límites), en el apartado "Para usuarios/procesos" mencionas que "Usuarios activos y aplicaciones peden ser configurados en /etc/security/limits.conf", e incluso, más abajo muestras un pedacito del mencionado archivo.

En efecto, este archivo configura los límites, peeeeeeeeero, ¿no es acaso el que está relacionado con PAM?
Originalmente en Linux (al menos en slackware puedes encontrar otro archivo de límites (/etc/limits), cuyo formato es ligeramente diferente del de PAM.

Saludos!

Alfredo Campos dijo...

¡Sí, más comentarios!

El apartado 1.5 se llama también Límites, ¿es eso correcto?

Sobre ese mismo apartado:
Cabe mencionar que en Slackware (al menos hasta la versión 10), el runlevel 4 es Milti-user con XWindow y el 5 no tiene un propósito definido.

Ahora, respecto al manejo de los runlevels en Solaris, es muy sencillo, al menos en cuanto a la gestión manual de servicios.

Aquí tenemos un direcorio /etc/init.d en el que radican todos los archivos de inicio, tal como se usan en linux, es decir, con las opciones de start, stop, etc.
Luego hay directorios para cada uno de los runleves:
/etc/rc0.d
/etc/rc1.d
.........
/etc/rc5.d

Dentro, hay ligas simbólicas a los archivos en /etc/init.d, con la particularidad de que algunos comienzan con una letra (S o K), sigue un número y generalmente el nombre del script. La idea es que, esos que comienzan con S se inician al entrar al nivel y los que comienzan con K se apagan. Y el número indica el orden en el que se ejecutan estos procesos. Es decir, supongamo que en /etc/init.d hay una rchivo llamado miServicio0 y miServicio1.

Si en /etc/rc2.d tenemos:
S10miServicio0 y
S11miServicio1
Significa que ambos servicios se van a iniciar al entrar al runlevel 2, primero miServicio0 y espués miServicio1

Ahora, si en /etc/rc3.d las entradas son:
S10miServicio0 y
K01miServicio1
Significa que al entrar al runlevel 3, miServicio0 se va a iniciar (sólo si estaba previamente apagado), miServicio1 va a ser detenido (sólo si estaba previamente encendido).

Bueno, me parece que ahora sí es todo.

Cuetzpallin dijo...

Alfredo, muchas gracias por acrecentar nuestro intelecto y sobretodo por complementar este post.

Bienvenidas todas las sugerencias y correciones :-D