Capítulo 9. Trucos del sistema

# Capítulo 9. Trucos del sistema

Aquí, describo los trucos fundamentales para configurar y gestionar sistemas, principalmente desde la consola.

## 9.1. Consejos para la consola

Existen algunas utilidades que te ayudarán en tu interacción con la consola.

Tabla 9.1. Lista de programas de apoyo a las actividades de la consola

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`mc` | V:39, I:179 | 1590 | Ver Sección 1.3, “Midnight Commander (MC)”
`bsdutils` | V:445, I:1000 | 338 | script(1) comando para hacer typescript de la sesión del terminal
`screen` | V:52, I:198 | 991 | Multiplexador de terminal con emulación de terminal VT100/ANSI
`tmux` | V:100, I:164 | 1391 | alternativa al multiplexor de terminales (utiliza "Control-B" en su lugar)
`ripgrep` | V:15, I:46 | 5284 | búsqueda rápida de las cadenas recursivas en el árbol del código fuente con el filtrado automático
`fzf` | V:8, I:34 | 5064 | buscador de texto borroso
`fzy` | V:0.07, I:0.38 | 59 | buscador de texto borroso
`rlwrap` | V:1, I:11 | 328 | envoltorio de la línea de comando de la función readline
`ledit` | V:0.4, I:7.8 | 375 | envoltorio de la línea de comando de la función readline
`rlfe` | V:0.02, I:0.50 | 45 | envoltorio de la línea de comando de la función readline

### 9.1.1. Registro correcto de las actividades del intérprete de órdenes

La utilización para el registro de la actividad del intérprete de órdenes, sin más, de script(1) (ver Sección 1.4.9, “Grabación de las actividades del intérprete de órdenes”) produce un archivo con caracteres de control. Esto se puede evitar con la utilización de col(1) como se muestra.

    $ script
    Script started, file is typescript

Haga lo que quiera ... y pulse `Ctrl-D` para finalizar `script`.

    $ col -bx < typescript > cleanedfile
    $ vim cleanedfile

Existen métodos alternativos para registrar las actividades de shell :

- Utiliza `tee` (solo se puede usar durante el proceso de arranque en initramfs):

      $ sh -i 2>&1 | tee typescript

- Utiliza `gnome-terminal` con el búfer de línea extendida para el scrollback.

- Utilice `pantalla` con "`^A H`" (ver Sección 9.1.2, “El programa screen”) para realizar la grabación de la consola.

- Utiliza `vim` con "`:terminal`" para entrar en el modo terminal. Utiliza "`Ctrl-W N`" para salir del modo terminal al modo normal. Utiliza "`:w typescript`" para escribir en el búfer de un archivo.

- Usa `emacs` con "`Mx shell`", "`M-x eshell`" o "`M-x term`" para ingresar a la consola de grabación . Utiliza "`C-x C-w`" para escribir en el búfer de un archivo.

### 9.1.2. El programa screen

Screen(1) no solo permite trabajar con múltiples procesos en un único terminal, si no que también que el proceso del intérprete de órdenes remoto sobreviva a la interrupción de las conexiones. Aquí está un escenario típico de utilización de screen(1).

1. Acceda a un equipo remoto.

2. Iniciar `screen` en una única consola.

3. Ejecute múltiples programas en la ventana de `screen` con `^A c` («Control-A« seguido por «c«).

4. Puede cambiar entre las múltiples ventanas de `screen` con `^A n` («Control-A« seguido de «n»).

5. Si repentinamente necesita dejar su terminal, pero no quiere perder su trabajo activo por la mantener la conexión.

6. Se puede separar la sesión `screen` por cualquier método.

   - Desconexión forzada de su conexión de red

   - Pulse `^A d` («Control-A« seguido de «d«) y cierre manualmente la conexión remota

   - Pulse `^A DD` («Control-A» seguido de «DD») para que `screen` separe y cierre su sesión

7. Si inicia la sesión otra vez al mismo equipo remoto (incluso desde un terminal diferente).

8. Inicie `screen` con «`screen -r`».

9. `Screen` mágicamente reconecta con todas las ventanas anteriores de `screen` con todos los programas activos ejecutándose.

| Sugerencia
Puede guardar la entrada de la conexión con `screen` para la conexión de red a medida como de marcado y de paquete, ya que puede dejar el proceso activo mientras esta desconectado, y entonces recuperarlo más tarde cuando se conecte de nuevo.

En una sesión de `screen`, todas las entradas de teclado se envían a la ventana actual excepto las que son combinaciones de teclado de órdenes. Todas las combinaciones de teclas de órdenes `screen` se inician pulsando `^A` («Control-A«) más otra tecla [más algunos parámetros]. He aquí algunos importantes para recordar.

Tabla 9.2. Relación de los atajos de teclado para screen

función | significado
--- | ---
`^A ?` | muestra la ayuda de screen (muestra los atajos de teclado)
`^A c` | crea una nueva ventana y cambia a ella
`^A n` | ir a la siguiente ventana
`^A p` | ir a la ventana anterior
`^A 0` | va a la ventana 0
`^A 1` | ir a la ventana número 1
`^A w` | muestra una relación de las ventanas
`^A a` | envía un Ctrl-A a la ventana actual como entrada de teclado
`^A h` | escribe una copia de la ventana actual a un archivo
`^A H` | inicia/finaliza la grabación de la ventana actual a un archivo
`^A ^X` | bloquea la terminal (protegido por contraseña)
`^A d` | separa la sesión de screen de la terminal
`^A DD` | separa la sesión de screen y sal

Para más detalles ver screen(1).

Ver tmux(1) para saber las funcionalidades del comando alternativo.

### 9.1.3. Navegando por los directorios

En Sección 1.4.2, “Personalización de bash”, se describen 2 sugerencias para permitir una navegación rápida por los directorios: `$CDPATH` y `mc`.

Si utiliza el programa de fuzzy text filter, puede hacerlo sin escribir la ruta exacta. Para `fzf`, incluya lo siguiente en `~/.bashrc`.

    FZF_KEYBINDINGS_PATH=/usr/share/doc/fzf/examples/key-bindings.bash
    if [ -f $FZF_KEYBINDINGS_PATH ]; then
      . $FZF_KEYBINDINGS_PATH
    fi

Por ejemplo:

- Puedes saltar a un subdirectorio muy profundo con un mínimo esfuerzo. Primero escribe "`cd **`" y pulsa `Tab`. A continuación, pedirá las rutas candidatas. Si escribe cadenas de rutas parciales, por ejemplo, `s/d/b foo`, se reducirán las rutas candidatas. Seleccione la ruta que va a usar `cd` con las teclas de cursor y retorno.

- Puede seleccionar un comando del historial de comandos de manera más eficiente con un esfuerzo mínimo. Presione `Ctrl-R` en el símbolo del sistema. Luego le pedirá los comandos candidatos. Escribir cadenas de comandos parciales, por ejemplo, `vim d`, reducirá los candidatos. Seleccione el que se utilizará con las teclas de cursor y retorno.

### 9.1.4. Readline wrapper

Algunos comandos, como `/usr/bin/dash`, que carecen de la capacidad de edición del historial en la línea de comandos, pueden agregar dicha funcionalidad de forma transparente si se ejecutan bajo `rlwrap` o sus equivalentes.

     $ rlwrap dash -i

Esto proporciona una plataforma conveniente para probar puntos sutiles para `dash` con un entorno amigable similar a `bash`.

### 9.1.5. Escaneando el árbol del código fuente

El comando rg(1) en el paquete `ripgrep` ofrece una alternativa más rápida al comando grep(1) para escanear el árbol de código fuente en busca para situaciones típicas. Aprovecha las modernas CPU multinúcleo y aplica automáticamente filtros razonables para omitir algunos archivos.

## 9.2. Personalización de vim

Después de aprender los conceptos básicos de vim(1) a través de Sección 1.4.8, “Usando vim”, ver "Siete hábitos de edición de texto efectiva (2000) "de Bram Moolenaar, para entender cómo se debe usar `vim`.

### 9.2.1. Personalizando vim con características internas

Se puede cambiar el comportamiento de `vim` significativamente habilitando sus características internas a través de los comandos del modo `Ex` como "`set ...`" para establecer opciones de vim.

Estos comandos en modo `Ex` se pueden incluir en el archivo vimrc del usuario, en el tradicional "`~/.vimrc`" o en el compatible con git "`~/.vim/vimrc`". He aquí un ejemplo muy simple [2]:

    """ Generic baseline Vim and Neovim configuration (~/.vimrc)
    """   - For NeoVim, use "nvim -u ~/.vimrc [filename]"
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    let mapleader = ' '             " :h mapleader
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    set nocompatible                " :h 'cp -- sensible (n)vim mode
    syntax on                       " :h :syn-on
    filetype plugin indent on       " :h :filetype-overview
    set encoding=utf-8              " :h 'enc (default: latin1) -- sensible encoding
    """ current vim option value can be verified by :set encoding?
    set backspace=indent,eol,start  " :h 'bs (default: nobs) -- sensible BS
    set statusline=%<%f%m%r%h%w%=%y[U+%04B]%2l/%2L=%P,%2c%V
    set listchars=eol:¶,tab:⇄\ ,extends:↦,precedes:↤,nbsp:␣
    set viminfo=!,'100,<5000,s100,h " :h 'vi -- bigger copy buffer etc.
    """ Pick "colorscheme" from blue darkblue default delek desert elflord evening
    """ habamax industry koehler lunaperche morning murphy pablo peachpuff quiet ron
    """ shine slate torte zellner
    colorscheme industry
    """ don't pick "colorscheme" as "default" which may kill SpellUnderline settings
    set scrolloff=5                 " :h 'scr -- show 5 lines around cursor
    set laststatus=2                " :h 'ls (default 1)  k
    """ boolean options can be unset by prefixing "no"
    set ignorecase                  " :h 'ic
    set smartcase                   " :h 'scs
    set autoindent                  " :h 'ai
    set smartindent                 " :h 'si
    set nowrap                      " :h 'wrap
    "set list                        " :h 'list (default nolist)
    set noerrorbells                " :h 'eb
    set novisualbell                " :h 'vb
    set t_vb=                       " :h 't_vb -- termcap visual bell
    set spell                       " :h 'spell
    set spelllang=en_us,cjk         " :h 'spl -- english spell, ignore CJK
    set clipboard=unnamedplus       " :h 'cb -- cut/copy/paste with other app
    set hidden                      " :h 'hid
    set autowrite                   " :h 'aw
    set timeoutlen=300              " :h 'tm

El mapa de teclas de `vim` puede cambiarse en el fichero vimrc del usuario. Por ejemplo:

| Atención
No intente cambiar las combinaciones de teclas predeterminadas sin muy buenas razones.

    """ Popular mappings (imitating LazyVim etc.)
    """ Window moves without using CTRL-W which is dangerous in INSERT mode
    nnoremap <C-H> <C-W>h
    nnoremap <C-J> <C-W>j
    nnoremap <C-K> <C-W>k
    silent! nnoremap <C-L> <C-W>l
    """ Window resize
    nnoremap <C-LEFT> <CMD>vertical resize -2<CR>
    nnoremap <C-DOWN> <CMD>resize -2<CR>
    nnoremap <C-UP> <CMD>resize +2<CR>
    nnoremap <C-RIGHT> <CMD>vertical resize +2<CR>
    """ Clear hlsearch with <ESC> (<C-L> is mapped as above)
    nnoremap <ESC> <CMD>noh<CR><ESC>
    inoremap <ESC> <CMD>noh<CR><ESC>
    """ center after jump next
    nnoremap n nzz
    nnoremap N Nzz
    """ fast "jk" to get out of INSERT mode (<ESC>)
    inoremap  jk <CMD>noh<CR><ESC>
    """ fast "<ESC><ESC>" to get out of TERM mode (CTRL-\ CTRL-N)
    tnoremap <ESC><ESC> <C-\><C-N>
    """ fast "jk" to get out of TERM mode (CTRL-\ CTRL-N)
    tnoremap jk <C-\><C-N>
    """ previous/next trouble/quickfix item
    nnoremap [q <CMD>cprevious<CR>
    nnoremap ]q <CMD>cnext<CR>
    """ buffers
    nnoremap <S-H> <CMD>bprevious<CR>
    nnoremap <S-L> <CMD>bnext<CR>
    nnoremap [b <CMD>bprevious<CR>
    nnoremap ]b <CMD>bnext<CR>
    """ Add undo break-points
    inoremap  , ,<C-G>u
    inoremap  . .<C-G>u
    inoremap  ; ;<C-G>u
    """ save file
    inoremap <C-S> <CMD>w<CR><ESC>
    xnoremap <C-S> <CMD>w<CR><ESC>
    nnoremap <C-S> <CMD>w<CR><ESC>
    snoremap <C-S> <CMD>w<CR><ESC>
    """ better indenting
    vnoremap < <gv
    vnoremap > >gv
    """ terminal (Somehow under Linux, <C-/> becomes <C-_> in Vim)
    nnoremap <C-_> <CMD>terminal<CR>
    "nnoremap <C-/> <CMD>terminal<CR>
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    if ! has('nvim')
    """ Toggle paste mode with <SPACE>p for Vim (no need for Nvim)
    set pastetoggle=<leader>p
    """ nvim default mappings for Vim.  See :h default-mappings in nvim
    """ copy to EOL (no delete) like D for d
    noremap Y y$
    """ sets a new undo point before deleting
    inoremap <C-U> <C-G>u<C-U>
    inoremap <C-W> <C-G>u<C-W>
    """ <C-L> is re-purposed as above
    """ execute the previous macro recorded with Q
    nnoremap Q @@
    """ repeat last substitute and *KEEP* flags
    nnoremap & :&&<CR>
    """ search visual selected string for visual mode
    xnoremap * y/\V<C-R>"<CR>
    xnoremap # y?\V<C-R>"<CR>
    endif

Para que las combinaciones de teclas anteriores funcionen correctamente, el programa de terminal ha de configurarse para generar "ASCII DEL" para la tecla`Backspace` y "Secuencia de escape" para la tecla `Delete`.

También se pueden cambiar otras configuraciones en el archivo vimrc del usuario. Por ejemplo:

    """ Use faster 'rg' (ripgrep package) for :grep
    if executable("rg")
      set grepprg=rg\ --vimgrep\ --smart-case
      set grepformat=%f:%l:%c:%m
    endif
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ Retain last cursor position :h '"
    augroup RetainLastCursorPosition
      autocmd!
      autocmd BufReadPost *
        \ if line("'\"") > 0 && line ("'\"") <= line("$") |
        \   exe "normal! g'\"" |
        \ endif
    augroup END
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ Force to use underline for spell check results
    augroup SpellUnderline
      autocmd!
      autocmd ColorScheme * highlight SpellBad term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellCap term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellLocal term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellRare term=Underline gui=Undercurl
    augroup END
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ highlight tailing spaces except when typing as red (set after colorscheme)
    highlight TailingWhitespaces ctermbg=red guibg=red
    """ \s\+     1 or more whitespace character: <Space> and <Tab>
    """ \%#\@<!  Matches with zero width if the cursor position does NOT match.
    match TailingWhitespaces /\s\+\%#\@<!$/

### 9.2.2. Personalizando vim con paquetes externos

Se pueden encontrar interesantes paquetes de complementos externos:

- Vim - el editor de texto extendido -- El sitio web oficial de Vim y vim scripts

- VimAwsome -- La lista de plugins de Vim

- vim-scripts -- Paquete Debian: una colección de scripts de vim

Los paquetes del plugins en el paquete vim-scripts se pueden habilitar usando el archivo vimrc del usuario. Ej:

    packadd! secure-modelines
    packadd! winmanager
    " IDE-like UI for files and buffers with <space>w
    nnoremap <leader>w         :WMToggle<CR>

El nuevo sistema de paquetes nativo de Vim funciona bien con "`git`" y "`git submodule`". Puede encontrar un ejemplo de configuración en my git repository: dot-vim. Esto hace esencialmente:

- Al usar "`git`" y "`git submodule`", los últimos paquetes externos, como "`name`", se sitúan en `~/.vim/pack/*/opt/name` y similares.

- Agregando la línea `:packadd! name` al archivo vimrc del usuario, estos paquetes se colocan en `runtimepath`.

- Vim carga estos paquetes en `runtimepath` durante su inicialización.

- Al final de su inicialización, se actualizan las etiquetas de los documentos instalados con "`helptags ALL`".

Para más información, inicie `vim` con "`vim --startuptime vimstart.log`" para comprobar la secuencia de ejecución real y el tiempo usado en cada paso.

Es bastante confuso ver demasiadas formas [3] de administrar y cargar estos paquetes externos en `vim`. Verificar la información original es la mejor cura.

Tabla 9.3. Información de la inicialización de `vim`

entradas con el teclado | información
--- | ---
`:help package` | explicación sobre el mecanismo del paquete vim
`:help runtimepath` | explicación sobre el mecanismo de `runtimepath`
`:version` | condiciones internas incluyen candidatos para el archivo vimrc
`:echo $VIM` | la variable de entorno "`$VIM`" utilizada para situar el archivo vimrc
`:set runtimepath?` | lista de directorios en los que se buscarán todos los archivos del soporte del tiempo de ejecución
`:echo $VIMRUNTIME` | la variable del entorno "`$VIMRUNTIME`" utilizada para ubicar varios archivos del soporte de tiempo de ejecución proporcionados por el sistema

## 9.3. Registro de datos y presentación

### 9.3.1. El demonio de registro

Muchos programas tradicionales registran tus actividades en el formato de un archivo de texto en el directorio "`/var/log/`".

logrotate(8) se utiliza para simplificar la administración de los archivos del registro en un sistema que genera muchos archivos de registro.

Muchos programas nuevos registran sus actividades en formato de archivo binario utilizando el servicio Journal`systemd-journald` (8) en el directorio "`/var/log/journal` ".

Puedes registrar los datos en el registro systemd-journald(8) desde un script de shell, usando el comando systemd-cat(1).

Consulte Sección 3.5, “El sistema de mensajes” y Sección 3.4, “Los mensajes del núcleo”.

### 9.3.2. Analizador de registros

Aquí están los analizadores de registro más importantes («`~Gsecurity::log-analyzer`» en aptitude(8)).

Tabla 9.4. Relación de analizadores de registro del sistema

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`fail2ban` | V:102, I:113 | 2191 | prohibición de las IPs con múltiples errores de acreditación
`logwatch` | V:9, I:11 | 2440 | analizador de registro con una buena salida escrito en Perl
`awstats` | V:5.3, I:8.4 | 6934 | analizador de registro de servidor web potente y funcional
`analog` | V:3, I:84 | 3739 | analizador de registro para servidores web
`sarg` | V:0.71, I:0.79 | 863 | generador de informes de análisis de squid
`pflogsumm` | V:1.5, I:3.7 | 173 | Resumidor de entradas de registro Postfix
`fwlogwatch` | V:0.12, I:0.18 | 487 | analizador de registros de cortafuegos
`squidview` | V:0.02, I:0.43 | 224 | controla y analiza los archivos access.log de squid
`swatch` | V:0.07, I:0.31 | 99 | visor de archivos de registros con combinación de expresiones regulares, hechos relevantes y reglas
`crm114` | V:0.06, I:0.33 | 1371 | Filtro de spam y filtro mediante expresiones regulares programables (CRM114)
`icmpinfo` | V:0.01, I:0.38 | 42 | intérprete de mensajes ICMP

| Nota
CRM114 tiene un lenguaje que permite escribir borrosos filtros con la biblioteca de expresiones regulares TRE . Su uso más común es como filtro de correos no deseados pero se puede utilizar también como analizador de registros.

### 9.3.3. Personalizar la visualización de información en formato texto

Aunque las herramientas de paginación como more(1) y less(1) (ver Sección 1.4.5, “El paginador”) y las herramientas personalizadas para marcar y dar formato (ver Sección 11.1.8, “Resaltando y dándole formato a información en texto plano”) pueden visualizar la información en formato texto de la forma correcta, los editores de propósito general (ver Sección 1.4.6, “El editor de texto”) son más versátiles y personalizables.

| Sugerencia
En vim(1) y su modo de paginación conocido como view(1), «`:set hls`» permite la búsqueda de textos resaltados.

### 9.3.4. Personalización de la visualización de la fecha y hora

El formato predeterminado de visualización de la hora y la fecha mediante el comando "`ls -l`" depende de la localidad (ver Sección 1.2.6, “Marcas de tiempo” para conocer el valor). La variable "`$LANG`" es la primera a la que se hace referencia y se puede anular con las variables de entorno exportadas "`$LC_TIME`" o "`$LC_ALL`".

El formato de visualización predeterminado real para cada configuración regional depende de la versión de la biblioteca C estándar (el paquete `libc6`) utilizada. Es decir, diferentes versiones de Debian tienen diferentes valores por defecto. Para los formatos iso, ver ISO 8601.

Si de verdad quiere personalizar el formato de visualización de la hora y la fecha independientemente de la configuración regional, debería asignar el valor de estilo de tiempo por el parámetro «`--time-style`» o por el valor de «`$TIME_STYLE`» (ver ls(1), date(1), «`info coreutils 'ls invocation'`»).

Tabla 9.5. Mostrar los ejemplos de la hora y la fecha para el comando "`ls -l`" con el time style value

valor del estilo de la hora | configuración regional | visualización de la hora y la fecha
--- | --- | ---
`iso` | cualquiera | `01-19 00:15`
`long-iso` | cualquiera | `2009-01-19 00:15`
`full-iso` | cualquiera | `2009-01-19 00:15:16.000000000 +0900`
`locale` | `C` | `Jan 19 00:15`
`locale` | `en_US.UTF-8` | `Jan 19 00:15`
`locale` | `es_ES.UTF-8` | `ene 19 00:15`
`+%d.%m.%y %H:%M` | cualquiera | `19.01.09 00:15`
`+%d.%b.%y %H:%M` | `C` o `en_US.UTF-8` | `19.Jan.09 00:15`
`+%d.%b.%y %H:%M` | `es_ES.UTF-8` | `19.ene.09 00:15`

| Sugerencia

Puedes eliminar escribir la opción larga en la línea de comandos usando el alias de comando (ver Sección 1.5.9, “Alias de órdenes”):

    alias ls='ls --time-style=+%d.%m.%y %H:%M'

### 9.3.5. Intérprete de órdenes en color

En los terminales más modernos se pueden utilizar colores utilizando secuencias de escape ANSI (ver «`/usr/share/doc/xterm/ctlseqs.txt.gz`»).

Por ejemplo, intente lo siguiente

    $ RED=$(printf "\x1b[31m")
    $ NORMAL=$(printf "\x1b[0m")
    $ REVERSE=$(printf "\x1b[7m")
    $ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

### 9.3.6. Órdenes coloreadas

Las ordenes de colores son útiles para la comprobación visual de la salida en entornos interactivos. Yo añado lo siguiente en mi «`~/.bashrc`».

    if [ "$TERM" != "dumb" ]; then
        eval "`dircolors -b`"
        alias ls='ls --color=always'
        alias ll='ls --color=always -l'
        alias la='ls --color=always -A'
        alias less='less -R'
        alias ls='ls --color=always'
        alias grep='grep --color=always'
        alias egrep='egrep --color=always'
        alias fgrep='fgrep --color=always'
        alias zgrep='zgrep --color=always'
    else
        alias ll='ls -l'
        alias la='ls -A'
    fi

La utilización de alias limita los efectos del color en el uso de órdenes interactivas. Tiene ventajas sobre las variables de entorno exportadas «`export GREP_OPTIONS='--color=auto'`» ya que el color puede verse en los programas de paginación como less(1). Si quiere eliminar el color cuando usa tuberías con otros programas, utilice «`--color=auto`» en su lugar en los ejemplos anteriores «`~/.bashrc`».

| Sugerencia
Puede deshabilitar los alias de color en un entorno interactivo llamando al intérprete de órdenes con «`TERM=dumb bash`».

### 9.3.7. Grabación de las actividades del editor con repeticiones complejas

Puede guardar las actividades del editor con repeticiones complejas.

Para Vim, como sigue.

- «`qa`»: comienza a grabar los caracteres escritos en un registro llamado «`a`».

- … actividades del editor

- «`q`»: finaliza la grabación de los caracteres escritos.

- «`@a`»: ejecuta el contenido del registro «`a`».

Para Emacs, como sigue.

- «`C-x (`»: comienza a definir una macro de teclado.

- … actividades del editor

- «`C-x )`»: termina definir una macro de teclado.

- «`C-x e`»: ejecuta una macro de teclado.

### 9.3.8. Capturar una imagen gráfica en un aplicación X

Existen varias maneras de grabar una imagen gráfica de una aplicación X, incluida una pantalla de `xterm`.

Tabla 9.6. Relación de herramientas de manipulación de imágenes

paquete | popularidad | tamaño | pantalla | orden
--- | --- | --- | --- | ---
`gnome-screenshot` | V:12, I:99 | 1115 | Wayland | aplicación de captura de pantalla para GNOME
`flameshot` | V:7, I:16 | 3542 | Wayland | aplicación de capturas de pantalla con esteroides
`gimp` | V:41, I:214 | 32779 | Wayland + X | captura de pantalla en el menú GUI
`x11-apps` | V:30, I:440 | 2461 | X | xwd(1)
`imagemagick` | V:7, I:275 | 81 | X | import(1)
`scrot` | V:4, I:49 | 144 | X | scrot(1)

### 9.3.9. Guardando cambios en los archivos de configuración

Existen herramientas especializadas para guardar los cambios de los archivos de configuración con la ayuda de DVCS y para hacer instantáneas del sistema en Btrfs.

Tabla 9.7. Relación de paquetes que pueden guardar el histórico de configuración

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`etckeeper` | V:23, I:26 | 157 | almacenar los archivos de configuración y sus metadatos con Git (por defecto), Mercurial, o GNU Bazaar
`timeshift` | V:8, I:14 | 4481 | utilidad de restauración del sistema usando rsync o instantáneas BTRFS
`snapper` | V:6.3, I:8.4 | 2396 | Herramienta de gestión de instantáneas de sistemas de archivos Linux

También puedes pensar en el enfoque de los script locales Sección 10.2.3, “Consejos para copias de seguridad”.

## 9.4. Monitoreando, controlando e iniciando lo que hacer los programas

Las actividades de los programas pueden ser monitoreados y controlados utilizando herramientas especializadas.

Tabla 9.8. Relación de las herramientas de monitorización y control de las actividades de los programas

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`coreutils` | V:910, I:1000 | 17994 | nice(1): ejecuta un programa modificando su prioridad de planificación
`bsdutils` | V:445, I:1000 | 338 | renice(1): cambia la prioridad de planificación de un proceso en ejecución
`procps` | V:828, I:998 | 2691 | «`/proc`» utilidades del sistema de archivos: ps(1), top(1), kill(1), watch(1), …
`psmisc` | V:400, I:720 | 950 | «`/proc`» utilidades del sistema de archivos: killall(1), fuser(1), peekfd(1), pstree(1)
`time` | V:6, I:79 | 148 | time(1): ejecuta un programa para crear un informe de los recursos del sistema utilizados a lo largo del tiempo
`sysstat` | V:118, I:168 | 1904 | sar(1), iostat(1), mpstat(1), …: herramientas de optimización del sistema en Linux
`isag` | V:0.1, I:3.3 | 109 | Graficador Interactivo de la Actividad del Sistema para sysstat
`lsof` | V:449, I:949 | 492 | lsof(8): enumera la relación de archivos abiertos por un proceso en ejecución utilizando la opción «`-p`»
`strace` | V:11, I:103 | 4393 | strace(1): registro de las llamadas del sistema y señales
`ltrace` | V:1, I:12 | 420 | ltrace(1): registro a las bibliotecas invocadas
`xtrace` | V:0.05, I:0.71 | 342 | xtrace(1): registra las comunicaciones entre el cliente y el servidor en X11
`powertop` | V:35, I:226 | 696 | powertop(1): información sobre el uso de la potencia por parte del sistema
`cron` | V:922, I:997 | 247 | ejecuta procesos en segundo plano de acuerdo a su planificación desde el dominio cron(8)
`anacron` | V:416, I:475 | 110 | planificador de tareas similar a cron para los sistemas que no están activos 24 horas al día
`at` | V:72, I:96 | 158 | at(1) o batch(1): ejecuta un trabajo en un momento determinado o debajo de cierto nivel de carga

| Sugerencia
El paquete `procps` provee lo fundamental para la monitorización, control e inicio de las actividades de los programas. Podría aprender sobre todo ello.

### 9.4.1. Temporización de un proceso

Muestra el tiempo utilizado por un proceso llamado por una orden.

    # time some_command >/dev/null
    real    0m0.035s       # time on wall clock (elapsed real time)
    user    0m0.000s       # time in user mode
    sys     0m0.020s       # time in kernel mode

### 9.4.2. La prioridad de planificación

Se usa un buen valor para determinar la prioridad de planificación de los procesos.

Tabla 9.9. Relación de buenos valores para la prioridad de planificación

buen valor | prioridad de planificación
--- | ---
19 | proceso de menor prioridad (buen)
0 | proceso de muy alta prioridad para el usuario
-20 | proceso de superusuario (no bueno) de muy alta prioridad

    # nice  -19 top                                      # very nice
    # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # very fast

Algunas veces un buen valor extremo produce más mal que bien al sistema. Utilice esta orden con cuidado.

### 9.4.3. La orden ps

La orden ps(1) en un sistema Debian aportan tanto las funcionalidades de SystemV y BSD y ayuda a identificar la actividad estática del proceso.

Tabla 9.10. Lista de estilo de la orden ps

estilo | orden típica | funcionalidad
--- | --- | ---
BSD | `ps aux` | muestra %CPU %MEM
System V | `ps -efH` | visualiza PPID

Para los procesos hijos zombies (muertos) , los puede eliminar mediante el identificador del proceso padre que corresponde al campo «`PPID`».

La orden pstree(1) muestra el árbol de procesos.

### 9.4.4. La orden top

top(1) en el sistema Debian es rico desde el punto de vista funcional y ayuda a identificar que procesos actúan de forma extraña puntualmente.

Es un programa a pantalla completa interactivo. Puede obtener ayuda pulsando la tecla «h« y salir pulsando la tecla «q«.

### 9.4.5. Relación de los archivos abiertos por un proceso

Puede enumerar los archivos abiertos por un proceso con el identificador de proceso (PID), p. ej. 1, con lo siguiente.

    $ sudo lsof -p 1

PID=1 generalmente es del programa `init`.

### 9.4.6. Trazando la actividad de un programa

Puede trazar la actividad de un programa con strace(1), ltrace(1), o xtrace(1) para llamadas y señales del sistema, llamadas a bibliotecas o comunicación entre el cliente X11 y el servidor..

Puede seguir las invocaciones del sistema de la orden `ls` como se muestra.

    $ sudo strace ls

| Sugerencia
Usar el script strace-graph ubicado en /usr/share/doc/strace/examples/ para armar una vista de árbol agradable

### 9.4.7. Identificación de procesos utilizando archivos o conexiones (sockets)

También puede identificar procesos utilizando archivos mediante fuser(1), p. ej. para «`/var/log/mail.log`» como se muestra.

    $ sudo fuser -v /var/log/mail.log
                         USER        PID ACCESS COMMAND
    /var/log/mail.log:   root       2946 F.... rsyslogd

Puede ver que el archivo «`/var/log/mail.log`» esta abierto en escritura por la orden rsyslogd(8).

También puede identificar un proceso por la utilización de sus conexiones (sockets) mediante fuser(1), p. ej. para «`smtp/tcp`» como sigue.

    $ sudo fuser -v smtp/tcp
                         USER        PID ACCESS COMMAND
    smtp/tcp:            Debian-exim   3379 F.... exim4

Ahora sabe que su sistema ejecuta exim4(8) para gestionar las conexiones TCP del puerto SMTP (25).

### 9.4.8. Repetición de una orden a intervalos constantes

watch(1) ejecuta un programa de forma reiterada a un intervalo constante mientras muestra la salida del programa a pantalla completa.

    $ watch w

Esto muestra quién está acreditado en el sistema y lo actualiza cada 2 segundos.

### 9.4.9. Repetición de una orden sobre archivos

Existen varias formas de repetir una orden sobre los archivos que cumplan una condición, p. ej, encajan en un patrón «`*.ext`».

- Método del bucle for del intérprete de órdenes (ver Sección 12.1.4, “Bucles del intérprete de órdenes”):

    for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done

- Combinación de find(1) y xargs(1):

    find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command

- find(1) con la opción «`-exec`» y una orden:

    find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;

- find(1) con la opción «`-exec`» con un archivo de órdenes pequeño:

    find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

Los ejemplos anteriores están escritos para garantizar el manejo adecuado de nombres de archivo graciosos, como los que contienen espacios. Véase Sección 10.1.5, “Formas de selección de archivos” para usos más avanzados de find(1).

### 9.4.10. Iniciar un programa desde el interfaz gráfico de usuario

Para el interfaz de órdenes en línea (CLI), el programa ejecutado será el primero que encaja el nombre en el directorio especificado por la variable de entorno `$PATH`. Ver Sección 1.5.3, “La variable «`$PATH`»”.

Para el interfaz gráfico de usuario (GUI) que cumple con el estándar de freedesktop.org, los archivos `*.desktop` en el directorio `/usr/share/applications/` proporcionan los atributos necesarios para la visualización de cada programa en el menú del interfaz gráfico de usuario. Cada paquete que cumple con el sistema de menú xdg de Freedesktop.org instala sus datos de menú proporcionados por "*. desktop" en "/usr/share/applications/". Los modernos entornos de escritorio que cumplen con el estándar Freedesktop.org utilizan estos datos para generar su menú utilizando el paquete xdg-utils. Ver "/usr/share/doc/xdg-utils/README".

Por ejemplo, el archivo `chromium.desktop` define los atributos para el «Navegador Web Chromium« como «Name« para el nombre del programa, «Exec« para la ruta de ejecución del programa y parámetros, «Icon« para el icono utilizado, etc. (consulte la Especificación de Entradas del Escritorio (Desktop Entry Specification)) como sigue:

    [Desktop Entry]
    Version=1.0
    Name=Chromium Web Browser
    GenericName=Web Browser
    Comment=Access the Internet
    Comment[fr]=Explorer le Web
    Exec=/usr/bin/chromium %U
    Terminal=false
    X-MultipleArgs=false
    Type=Application
    Icon=chromium
    Categories=Network;WebBrowser;
    MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
    StartupWMClass=Chromium
    StartupNotify=true

Esta es una descripción muy simplificada. Los archivos `*.desktop` se revisan como sigue.

The desktop environment sets `$XDG_DATA_HOME` and `$XDG_DATA_DIR` environment variables. For example, under the GNOME:

- `$XDG_DATA_HOME` esta sin asignar. (El valor por defecto que se utiliza es `$HOME/.local/share`.)

- `$XDG_DATA_DIRS` se le asigna el valor `/usr/share/gnome:/usr/local/share/:/usr/share/`.

Así los directorios base (ver XDG Base Directory Specification) y los directorios de `aplicaciones` quedan como sigue.

- `$HOME/.local/share/` → `$HOME/.local/share/applications/`

- `/usr/share/gnome/` → `/usr/share/gnome/applications/`

- `/usr/local/share/` → `/usr/local/share/applications/`

- `/usr/share/` → `/usr/share/applications/`

Los archivos `*.desktop` se comprueban en estos directorios de `aplicaciones` siguiendo este orden.

| Sugerencia
Se puede crear una entrada personalizada al menú del interfaz gráfico de usuario (GUI) añadiendo un archivo `*.desktop` al directorio `$HOME/.local/share/applications/`.

| Sugerencia
La línea "`Exec=...`" no es analizada por el shell. Utilice el comando env(1) si necesita establecer variables de entorno.

| Sugerencia
Igualmente, si se crea un archivo `*.desktop` en el directorio `autostart` por debajo de estos directorios base, el programa que se especifique en el archivo `*.desktop` se ejecuta automáticamente cuando el entorno de escritorio se inicia. Ver Especificación de Inicio Automático de Aplicaciones de Escritorio.

| Sugerencia
De igual manera, si un archivo `*.desktop` se crea en el directorio `$HOME/Desktop` y se ha configurado el entorno de escritorio con la funcionalidad del lanzador del icono, el programa especificado en el se ejecutará cuando se pulse sobre el icono. Tenga en cuenta que el nombre real del directorio `$HOME/Desktop` depende de la configuración regional. Consulte xdg-user-dirs-update(1).

### 9.4.11. Personalizando el inicio de un programa

Algunos programas inician otros programa de forma automática. Aquí están los puntos a comprobar para la personalización de este proceso.

- Menú de configuración de aplicaciones:

  - GNOME desktop: "Settings" → "Apps" → "Default Apps"

  - KDE desktop: "Application Launcher" → "System Settings" → "Default Applications"

  - Navegador Iceweasel: «Editar→ «Preferencias« → «Aplicaciones«

  - mc(1): «`/etc/mc/mc.ext`»

- Variables de entorno como «`$BROWSER`», «`$EDITOR`», «`$VISUAL`» y «`$PAGER`» (ver eviron(7))

- El sistema update-alternatives(1) para los programas como «`editor`», «`view`», «`x-www-browser`», «`gnome-www-browser`», y «`www-browser`» (ver Sección 1.4.7, “Configuración del editor de texto por defecto”)

- El contenido de los archivos «`~/.mailcap`» y «`/etc/mailcap`» que asocia los tiposMIME con los programas (ver mailcap(5))

- El contenido de los archivos «`~/.mime.types`» y «`/etc/mime.types`» el cual se asocia con la extensión del nombre del archivo con los tipos MIME (ver run-mailcap(1))

| Sugerencia
update-mime(8) actualiza el archivo «`/etc/mailcap`» utilizando el archivo «`/etc/mailcap.order`» (ver mailcap.order(5)).

| Sugerencia
El paquete `debianutils` aporta sensible-browser(1), sensible-editor(1) y sensible-pager(1) que elige de forma sensata el editor, paginador y navegador web que se lanzará, respectivamente. Le recomiendo leer estos archivos de órdenes.

| Sugerencia

Con el fin de ejecutar una aplicación de consola como `mutt` como la preferida en GuI, podría crear una aplicación GUI de la forma siguiente y asignar «`/usr/local/bin/mutt-term`» como su aplicación preferida al inicio como se describe.

    # cat /usr/local/bin/mutt-term <<EOF
    #!/bin/sh
    gnome-terminal -e "mutt \$@"
    EOF
    # chmod 755 /usr/local/bin/mutt-term

### 9.4.12. Matando un proceso

Utilice kill(1) para matar (o enviar una señal a) un proceso mediante su identificador de proceso.

Utilice killall(1) o pkill(1) para hacer lo mismo mediante otros atributos como el nombre de la orden del proceso.

Tabla 9.11. Relación de las señales más usadas con la orden kill

valor de la señal | nombre de la señal | acción | nota
--- | --- | --- | ---
0 | --- | no se envía ninguna señal (ver matar(2)) | comprobar si el proceso se está ejecutando
1 | SIGHUP | terminar el proceso | terminal desconectado (señal bloqueada)
2 | SIGINT | terminar el proceso | interrumpir desde el teclado (`CTRL-C`)
3 | SIGQUIT | terminar el proceso y dump core | salir desde el teclado (`CTRL-\`)
9 | SIGKILL | terminar el proceso | Señal de apagado desbloqueable
15 | SIGTERM | terminar el proceso | Señal de apagado bloqueable

### 9.4.13. Planificación una vez de las tareas

Ejecute al orden at(1) para planificar una única ejecución de un trabajo mediante lo siguiente.

    $ echo 'command -args'| at 3:40 monday

### 9.4.14. Planificación regular de tareas

Utilice cron(8) para planificar las tareas de forma regular. Ver crontab(1) y crontab(5).

Puede planificar la ejecución de procesos como un usuario normal, p. ej. `foo` creando un archivo crontab(5) como «`/var/spool/cron/crontabs/foo`» con la orden «`crontab -e`».

He aquí un ejemplo de un archivo crontab(5).

    # use /usr/bin/sh to run commands, no matter what /etc/passwd says
    SHELL=/bin/sh
    # mail any output to paul, no matter whose crontab this is
    MAILTO=paul
    # Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
    # run at 00:05, every day
    5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
    # run at 14:15 on the first of every month -- output mailed to paul
    15 14 1  * *   $HOME/bin/monthly
    # run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
    0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
    23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
    5  4 *   * sun echo "run at 04:05 every Sunday"
    # run at 03:40 on the first Monday of each month
    40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

| Sugerencia
En los sistemas que no están en funcionamiento ininterrumpido, instale el paquete `anacron` para planificar órdenes periódicas en los intervalos deseados tan pronto como el equipo activo lo permita. Ver anacron(8) y anacrontab(5).

| Sugerencia
Para los archivos de órdenes de mantenimiento del sistema, puede ejecutarlos de forma periódica desde la cuenta de superusuario ubicando esos archivos de órdenes en «`/etc/cron.hourly/`», «`/etc/cron.daily/`», «`/etc/cron.weekly/`», o «`/etc/cron.monthly/`». La temporización de la ejecución de los archivos de órdenes puede personalizarse mediante «`/etc/crontab`» y «`/etc/anacrontab`».

Systemd tiene capacidad de bajo nivel para programar programas para que se ejecuten de fondo `cron`. Por ejemplo, `/lib/systemd/system/apt-daily.timer` y `/lib/systemd/system/apt-daily.service` configuran actividades diarias de descarga de apt. Ver systemd.timer(5) .

### 9.4.15. Programación de tareas en un suceso

Systemd puede programar el programa no sólo en timer sino también en mount. Como ejemplos ver Sección 10.2.3.3, “Copia de seguridad activada por acción del temporizador” y Sección 10.2.3.2, “Montar la copia de seguridad activada por el acto”.

### 9.4.16. Tecla Alt-SysRq

Presionar Alt-SysRq (PrtScr) seguido de una tecla hace la magia de rescatar el control del sistema.

Tabla 9.12. Lista de teclas notables del comando SAK

tecla seguida de Alt-SysRq | descripción de la acción
--- | ---
`k` | kill (mata) todos los procesos de la consola virtual actual (SAK)
`s` | sincroniza todos los sistemas de archivos montados para evitar la corrupción de datos
`u` | remonta todos los sistemas de archivos montados como de solo lectura (desmonta)
`r` | recupera el teclado del modo rudo después de que X falle

Más información en «Guía del administrador y del usuario del kernel de Linux » Linux Magic System Request Key Hacks

| Sugerencia
Desde terminales SSH etc., puede utilizar la funcionalidad Alt-SysRq resribiendo «`/proc/sysrq-trigger`». Por ejemplo, «`echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger`» desde el cursor del intérprete de órdenes del superusuario syncs y umount todos los sistemas de archivos.

El kernel de Debian amd64 Linux actual (2021) tiene `/proc/sys/kernel/sysrq=438=0b110110110`:

- 2 = 0x2: habilita el control del nivel del registro de la consola (ON)

- 4 = 0x4 - permiti el control del teclado (SAK, unraw) (ON)

- 8 = 0x8 - habilita dumps de depuración de procesos etc. (OFF)

- 16 = 0x10 - habilita sync command (ON)

- 32 = 0x20 - habilita volver a montar solo lectura (ON)

- 64 = 0x40 - permite la señalización de procesos (term, kill, oom-kill) (OFF)

- 128 = 0x80 - permite reboot/poweroff (ON)

- 256 = 0x100 - permite el inicio de todas las tareas RT (ON)

## 9.5. Trucos para el mantenimiento del sistema

### 9.5.1. ¿Quién está en el sistema?

Puede comprobar quién esta en el sistema así.

- who(1) muestra quién está acreditado.

- w(1) muestra quién esta acreditado y que está haciendo.

- last(1) muestra una lista del último usuario conectado.

- lastb(1) muestra una relación de los últimos intentos fallidos de acceso a una sesión.

| Sugerencia
«`/var/run/utmp`» y «`/var/log/wtmp`» mantiene esa información de usuario. Ver login(1) y utmp(5).

### 9.5.2. Avisos para todos

Puede enviar mensajes a cualquiera que esté acreditado en el sistema con wall(1) así.

    $ echo "We are shutting down in 1 hour" | wall

### 9.5.3. Identificación del hardware

El punto de inicio para la identificación de los dispositivos tipo PCI (AGP, PCI-Express, CardBus, ExpressCard, etc.) es la orden lspci(8) (preferentemente con la opción «`-nn`»).

Otra forma en la que puede identificar el hardware es leyendo el contenido de «`/proc/bus/pci/devices`» o navegando por el árbol de directorios que cuelga de «`/sys/bus/pci`» (ver Sección 1.2.12, “procfs y sysfs”).

Tabla 9.13. Relación de las herramientas para la identificación de hardware

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`pciutils` | V:258, I:993 | 289 | Utilidades de Linux para PCI: lspci(8)
`usbutils` | V:84, I:888 | 322 | Utilidades de Linux para USB: lsusb(8)
`nvme-cli` | V:26, I:36 | 2222 | Utilidades NVMe para Linux: nvme(1)
`pcmciautils` | V:4.0, I:6.0 | 92 | Utilidades Linux para PCMCIA: pccardctl(8)
`scsitools` | V:0.2, I:2.2 | 261 | colección de herramientas para la gestión de hardware SCSI: lsscsi(8)
`procinfo` | V:0.8, I:6.1 | 149 | información del sistema obtenida de «`/proc`»: lsdev(8)
`lshw` | V:12, I:91 | 971 | información sobre la configuración hardware: lshw(1)
`discover` | V:25, I:595 | 81 | sistema de identificación hardware: discover(8)

### 9.5.4. Configuración del hardware

Aunque la mayor parte de la configuración del hardware en los sistemas de escritorio con interfaz gráfico de usuario como GNOME y KDE se puede realizar mediante herramientas de configuración con interfaz gráfico de usuario, es una buena idea conocer algunos métodos básicos para su configuración.

For the keyboard and terminal configuration, see Sección 8.2, “La entrada por teclado” and Sección 8.3, “La salida por pantalla”.

Tabla 9.14. Relación de herramientas de configuración hardware

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`console-setup` | V:82, I:975 | 422 | Utilidades de teclado y tipos de letra para consolas
`keyd` | V:1.4, I:1.5 | 1437 | keyboard key remapping daemon using kernel level input primitives (evdev, uinput)
`keyd-application-mapper` | V:0.00, I:0.07 | 34 | keyboard key remapping daemon - application-specific remapper
`x11-xserver-utils` | V:304, I:528 | 559 | Utilidades de servidor X: xset(1), xmodmap(1)
`acpid` | V:55, I:83 | 158 | demonio que gestiona lo que llegan del Interfaz de Potencia y Configuración Avanzada (Advanced Configuration and Power Interface, ACPI)
`acpi` | V:7, I:77 | 49 | utilidad para visualizar información de dispositivos ACPI
`sleepd` | V:0.10, I:0.12 | 84 | demonio que «duerme« el portátil si deja de tener actividad
`hdparm` | V:114, I:208 | 246 | optimización de acceso al disco duro (ver Sección 9.6.9, “Optimización del disco duro”)
`smartmontools` | V:239, I:269 | 2455 | control y monitoreo de sistemas de almacenamiento utilizando S.M.A.R.T.
`setserial` | V:3.2, I:5.2 | 104 | colección de herramientas para la gestión del puerto serie
`memtest86+` | V:1, I:19 | 12483 | colección de herramientas para la gestión de la memoria hardware
`scsitools` | V:0.2, I:2.2 | 261 | colección de herramientas para la gestión de hardware SCSI
`setcd` | V:0.06, I:0.67 | 33 | optimización de acceso a la unidad de discos compactos
`big-cursor` | I:0.65 | 26 | cursores grandes del ratón para X

Aquí, ACPI es un marco más nuevo para el sistema de gestión de fuerza que APM.

| Sugerencia
La frecuencia de funcionamiento de la CPU de los sistemas modernos esta gestionada por módulos en el núcleo como `acpi_cpufreq`.

### 9.5.5. Hora del sistema y del hardware

Lo siguiente asigna al sistema y hardware la hora y fecha a MM/DD hh:mm CCYY.

    # date MMDDhhmmCCYY
    # hwclock --utc --systohc
    # hwclock --show

La hora habitualmente se visualiza en la hora local en el sistema Debian pero el hardware y el sistema usa generalmente la hora en UTC(GMT).

Si la hora del hardware está establecida en UTC, cambia la configuración a "`UTC=yes`" en "`/etc/default/rcS`".

Lo siguiente reconfigura la zona horaria utilizada por el sistema Debian.

    # dpkg-reconfigure tzdata

Si desea actualizar el tiempo del sistema a través de la red, piense en utilizar el servicio NTP con paquetes como `ntp`, `ntpdate` y `chrony`.

| Sugerencia
En systemd para la sincronización de la hora a través de la red utilice `systemd-timesyncd`. Ver systemd-timesyncd(8).

Ver lo siguiente.

- Manual Cómo Gestionar la Precisión de la Fecha y Hora

- Proyecto de Servicio NTP Público (NTP Public Services Project)

- El paquete `ntp-doc`

| Sugerencia
ntptrace(8) del paquete `ntp` puede trazar una cadena de vuelta de los servidores NTP a la fuente primigenia.

### 9.5.6. La infraestructura de sonido

La Arquitectura Avanzada de Sonido para Linux (Advanced Linux Sound Architecture, ALSA) proporciona los controladores de dispositivos de tarjetas de sonido en el actual Linux. ALSA tiene un modo de emulación para ser compatible con el anterior Open Sound System (OSS).

El software de aplicación se puede configurar no solo para acceder directamente a los dispositivos de sonido, sino también para acceder a ellos a través de algún sistema de servidor de sonido estandarizado. Actualmente, PulseAudio, JACK y PipeWire se utilizan como sistema de servidor de sonido. Ver la Página Wiki de Debian sobre sonido para estar actualizado.

Generalmente existe un motor de sonido común para los entorno de escritorio más populares. Cada motor de sonido utilizado por la aplicación puede elegir conectarse a diferentes servidores de sonido.

| Sugerencia
Para comprobar el altavoz (speaker) utilice «`cat /dev/urandom > /dev/audio`» o speaker-test(1) (^C para finalizar).

| Sugerencia
Si no obtiene sonido, su altavoz puede estar conectado a una salida en silencio. Alsamixer(1) en el paquete `alsa-utils` le será útil para la configuración del volumen y el silencio.

Tabla 9.15. Relación de paquetes de sonido

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`alsa-utils` | V:337, I:455 | 2700 | utilidades para configurar y usar ALSA
`oss-compat` | V:0.5, I:9.7 | 21 | La compatibilidad de ALSA con OSS evita errores como «`/dev/dsp no se encuentra`»
`pipewire` | V:321, I:364 | 135 | servidor multimedia del motor de procesamiento de audio y vídeo - metapaquete
`pipewire-bin` | V:328, I:364 | 2219 | servidor multimedia del motor de procesamiento del audio y vídeo - servidor de audio y programas CLI
`pipewire-alsa` | V:168, I:234 | 190 | servidor multimedia del motor de procesamiento del audio y vídeo - servidor de audio para reemplazar ALSA
`pipewire-pulse` | V:290, I:338 | 53 | servidor multimedia del motor de procesamiento del audio y vídeo - servidor de audio para reemplazar PulseAudio
`pulseaudio` | V:151, I:177 | 6602 | PulseAudio servidor
`libpulse0` | V:437, I:575 | 969 | biblioteca del cliente para PulseAudio
`jackd` | V:2, I:14 | 8 | JACK Audio Connection Kit. (JACK) servidor (baja latencia)
`libjack0` | V:1.8, I:9.0 | 328 | Kit de conexión de audio JACK. (JACK) biblioteca (baja latencia)
`libphonon4qt5-4` | V:20, I:46 | 572 | Phonon: motor de sonido KDE

### 9.5.7. Deshabilitar el salvapantallas

Para deshabilitar el salvapantallas, utilice las siguientes órdenes.

Tabla 9.16. Relación de las órdenes para deshabilitar el salvapantallas

entorno | orden
--- | ---
La consola de Linux | `setterm -powersave off`
Las Ventanas X (deshabilitando el salvapantallas) | `xset s off`
Las Ventanas X (deshabilitando dpms) | `xset -dpms`
Las Ventanas X (configuración por GUI del salvapantallas) | `xscreensaver-command -prefs`

### 9.5.8. Deshabilitando los pitidos

Siempre puede desenchufar el altavoz del PC para deshabilitar los pitidos. Eliminando el módulo del núcleo `pcspkr` realiza ese trabajo por usted.

Lo siguiente impide que el programa readline(3) utilizado por bash(1) pite cuando encuentre un carácter de alerta (ASCII=7).

    $ echo "set bell-style none">> ~/.inputrc

### 9.5.9. Utilización de memoria

Existen dos recursos disponibles para determinar el uso de la memoria.

- El mensaje de arranque del núcleo en «`/var/log/dmesg`» contiene el tamaño exacto de memoria disponible.

- free(1) y top(1) visualiza la información de los recursos de memoria en el sistema en ejecución.

Aquí hay un ejemplo.

    # grep '\] Memory' /var/log/dmesg
    [    0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init)
    $ free -k
                 total       used       free     shared    buffers     cached
    Mem:        997184     976928      20256          0     129592     171932
    -/+ buffers/cache:     675404     321780
    Swap:      4545576          4    4545572

Te puede sorprender que «dmesg diga que existen 990 MB libres y free -k dice que solo hay 320 MB libres. Más de 600 MB de diferencia …».

No se preocupe por el gran tamaño de memoria «`utilizada`» y el pequeño tamaño de memoria «`libre`» en la línea «`Mem:`», pero lea lo que hay debajo (675404 y 321780 en el ejemplo anterior) y relájese.

Para mi MacBook con 1GB=1048576k DRAM (el sistema de vídeo usa algo de esto), tengo lo siguiente.

Tabla 9.17. Relación de informes de tamaño de la memoria

informe | tamaño
--- | ---
Tamaño total en dmesg | 1016784k = 1GB - 31792k
Memoria libre en dmesg | 990528k
Total en el intérprete de órdenes | 997184k
Libre en el intérprete de órdenes | 20256k (pero de forma efectiva 321780k)

### 9.5.10. Sistema de seguridad y de comprobación de la integridad

Un mantenimiento inadecuado del sistema puede exponerlo a sufrir un ataque del exterior.

Para la seguridad y las comprobaciones de integridad, debe comenzar con lo que se muestra.

- Para el paquete `debsums`, ver debsums(1) y Sección 2.5.2, “Archivo «Release» del nivel superior y autenticación”.

- Para el paquete `chkrootkit` ver chkrootkit(1).

- Para la familia de paquetes `clamav` ver clamscan(1) y freshclam(1).

- FAQ de Seguridad Debian.

- Manual de Seguridad Debian.

Tabla 9.18. Relación de las herramientas de seguridad del sistema y comprobación de la integridad

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`logcheck` | V:4.7, I:5.8 | 120 | demonio que envía por correo anomalías en los registros del sistema al administrador
`debsums` | V:4, I:30 | 108 | utilidad para verificar los archivos de los paquetes instalado mediante sumas MD5
`chkrootkit` | V:11, I:15 | 988 | detector de rootkit
`clamav` | V:9, I:40 | 19861 | utilidad anti-virus para Unix - interfaz de línea de órdenes
`tiger` | V:1.2, I:1.5 | 7800 | informa de vulnerabilidades de seguridad del sistema
`tripwire` | V:1.3, I:1.7 | 5060 | comprobador de integridad de archivos y directorios
`john` | V:1.1, I:7.7 | 469 | herramienta para descifrar contraseñas
`aide` | V:2.2, I:2.6 | 324 | Entorno de Detección Avanzado de Intrusión - binario estático
`integrit` | V:0.09, I:0.18 | 2759 | programa de verificación de la integridad del archivo
`crack` | V:0.09, I:0.65 | 153 | programa que adivina contraseñas

He aquí un archivo de órdenes para comprobar el permiso de escritura incorrecto para todos.

    # find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)

| Atención
Ya que el paquete `debsums` utiliza la comprobación mediante MD5 almacenado en local, no se puede confiar plenamente en él como herramienta de auditoría de seguridad del sistema contra ataques maliciosos.

## 9.6. Trucos del almacenamiento de datos

Booting your system as the Linux live system (see Sección 3.2.2, “Linux live rescue system on USB” and Sección 3.2.3, “Linux live rescue system from GRUB”) makes it easy for you to reconfigure data storage on the installed system.

| Nota
Statements on hard disk (HDD) are applicable to other storage devices such as SSD / USB flash drive / Memory card / ... . Replace device names in examples such as `/dev/sda` with applicable device names `/dev/nvme0`, `/dev/mmcblk0`, ... .

Es posible que debas desmontar(8) algunos dispositivos manualmente desde la línea de comandos antes de operar en ellos si el sistema del escritorio GUI los monta automáticamente.

### 9.6.1. Uso de espacio de disco

El uso de espacio en disco lo pueden evaluar los programas proporcionados por los paquetes `mount`, `coreutils` y `xdu`:

- mount(8) muestra todos los sistemas de archivos (=discos) montados.

- df(1) muestra el espacio de disco utilizado por el sistema de archivos.

- du(1) informa del espacio de disco utilizado por el árbol de un directorio.

| Sugerencia
Puede utilizar la salida de du(8) como entrada de xdu(1) para tener una presentación gráfica e interactiva con «`du -k . |xdu`», «`sudo du -k -x / |xdu`», etc.

### 9.6.2. Configuración del particionado de disco

Para la configuración de la partición del disco , a pesar de que fdisk(8) fue considerado en el pasado el estándar, parted(8) merece nuestra atención. Las expresiones «datos del particionado del disco«, «tabla de partición«, «mapa de particiones« y «marcado del disco« son todas ellas sinónimos.

Los ordenadores más antiguos usan el esquema clásico Master Boot Record (MBR) para almacenar datos del particionamiento del disco en el primer sector, es decir, LBA sector 0 (512 bytes).

Algunos ordenadores modernos con Interfaz de firmware extensible unificada (UEFI), incluidas los Mac basados en Intel, usan Identificar la tabla de particiones única globalmente (partición GUID Table, GPT) esquema, partición del disco duro los datos no se guardan en el primer sector.

Aunque fdisk(8) fue la herramienta estándar para el particionado del disco, se ha sustituido por parted(8).

Tabla 9.19. Relación de paquetes para la gestión del particionado del disco

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`util-linux` | V:914, I:1000 | 4758 | las utilidades varias del sistema incluyen fdisk(8) y cfdisk(8)
`parted` | V:435, I:565 | 122 | Programa de modificación del tamaño de las particiones de disco GNU Parted
`gparted` | V:11, I:87 | 2313 | Editor GNOME del particionado basado en `libparted`
`gdisk` | V:19, I:264 | 967 | editor de particiones para el disco híbrido GPT/MBR
`kpartx` | V:16, I:26 | 80 | programa para crear mapeos entre dispositivos y particiones

| Atención
Aunque parted(8) afirma que crea y también modifica el tamaño de los sistemas de archivos, es más seguro realizar estas tareas con herramientas especializadas de mantenimiento como mkfs(8) (mkfs.msdos(8), mkfs.ext2(8), mkfs.ext3(8), mkfs.ext4(8), …) y resize2fs(8).

| Nota
Para realizar el cambio entre GPT y MBR, necesita eliminar el contenido de unos cuantos bloques ubicados al principio (ver Sección 9.8.6, “Limpieza del contenido de los archivos”) y utilice «`parted /dev/sdx mklabel gpt`» o «`parted /dev/sdx mklabel msdos`» para asignarlo. Tenga en cuenta que «`msdos`» se utiliza para MBR.

### 9.6.3. Acceso al particionado utilizando UUID

Aunque la reconfiguración de tu partición o el orden de activación de los medios del almacenamiento extraíbles puede dar lugar a diferentes nombres para las particiones, puede acceder a ellos de forma coherente. Esto también es útil si tienes varios discos y tu BIOS/UEFI no les da nombres de dispositivo consistentes.

- mount(8) con la opción «`-U`» permite montar dispositivos de bloque utilizando UUID, en lugar de sus nombres de archivo como «`/dev/sda3`».

- «`/etc/fstab`» (ver fstab(5)) puede utilizar UUID.

- Los gestores de arranque (Sección 3.1.2, “Fase 2: el cargador de arranque”) pueden utilizar también UUID.

| Sugerencia
Puede determinar el UUID de un dispositivo especial de bloque con blkid(8). También puedes buscar el UUID y otra información con "`lsblk -f`".

### 9.6.4. LVM2

LVM2 es un gestor de volúmenes lógicos del núcleo de Linux. Con LVM2 las particiones de disco se pueden crear en volúmenes lógicos en vez de discos duros físicos.

LVM necesita lo siguiente.

- soporte de device-mapper en el núcleo Linux (por defecto en los núcleos de Debian)

- el soporte de la biblioteca device-mapper en el espacio de usuario (paquete `libdevmaper*`)

- herramientas LVM2 del espacio de usuario (paquete `lvm2`)

Por favor, para saber sobre LVM2 lea las siguiente páginas de manual.

- lvm(8): Fundamentos del mecanismo LVM2 (relación de todas las órdenes LVM2)

- lvm.conf(5): archivo de configuración de LVM2

- lvs(8): crea un informe sobre los volúmenes lógicos

- vgs(8): crea un informe sobre los grupos de volúmenes

- pvs(8): crea un informe sobre los volúmenes físicos

### 9.6.5. Configuración del sistema de archivos

Para el sistema de archivos ext4, el paquete `e2fsprogs` aporta lo siguiente.

- mkfs.ext4(8) para crear un nuevo de sistema de archivos ext4

- fsck.ext4(8) para comprobar y reparar un sistema de archivos ext4 preexistente

- tune2fs(8) para configurar el superbloque de ext4 filesystem

- debugfs(8) para depurar en modo interactivo el sistema de archivos ext4. (Existe la orden `undel` para recuperar los archivos borrados.)

Las órdenes mkfs(8) y fsck(8) esta en el paquete `e2fsprogs` como interfaz de varios programas específicos del sistema de archivos (`mkfs.fstype` y `fsck.fstype`). Para el sistema de archivos ext4 existen mkfs.ext4(8) y fsck.ext4(8) (esta enlazado a mke2fs(8) y e2fsck(8)).

Las siguientes órdenes están disponibles para cada sistema de archivos que soporta Linux.

Tabla 9.20. Relación de paquetes para la gestión del sistema de archivos

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`e2fsprogs` | V:828, I:998 | 1560 | utilidades para el sistema de archivos ext2/ext3/ext4
`btrfs-progs` | V:52, I:79 | 5255 | utilidades para el sistema de archivos Btrfs
`reiserfsprogs` | V:10, I:21 | 473 | utilidades para el sistema de archivos Reiserfs
`zfsutils-linux` | V:33, I:33 | 1904 | utilidades para el sistema de archivos OpenZFS
`dosfstools` | V:260, I:564 | 310 | utilidades para el sistema de archivos FAT. (Microsoft: MS-DOS, Windows)
`exfatprogs` | V:35, I:459 | 558 | utilidades para el sistema de archivos exFAT mantenido por Samsung.
`exfat-fuse` | V:2, I:43 | 73 | lectura/escritura exFAT controlador del sistema de archivos (Microsoft) para FUSE.
`xfsprogs` | V:41, I:86 | 4382 | utilidades para el sistema de archivos XFS. (SGI: IRIX)
`ntfs-3g` | V:175, I:509 | 1507 | lectura/escritura NTFS controlador del sistema de archivos (Microsoft: Windows NT, ...) para FUSE.
`jfsutils` | V:0.4, I:6.7 | 1104 | utilidades para el sistema de archivos JFS. (IBM: AIX, OS/2)
`xorriso` | V:14, I:65 | 378 | utilities for the ISO-9660 filesystem and CD/DVD writing from libburnia
`wodim` | V:7, I:87 | 898 | command line CD/DVD writing tool from cdrkit
`genisoimage` | V:16, I:158 | 1567 | command line ISO-9660 filesystem tool from cdrkit
`reiser4progs` | V:0.1, I:1.2 | 1367 | utilidades para el sistema de archivos Reiser4
`hfsprogs` | V:0.3, I:3.2 | 394 | utilidades para el sistema de archivos HFS y HFS Plus. (Apple: Mac OS)
`zerofree` | V:7, I:117 | 30 | programa de cero bloques libres para sistemas de archivos ext2/3/4

| Sugerencia

Ext4 es el sistema de archivos por defecto para el sistema Linux y es muy recomendable su uso a menos que tenga una razón concreta para no hacerlo.

El estado de Btrfs se puede encontrar en La wiki de Debian en btrfs y la wiki kernel.org wiki en btrfs. Se espera que sea el siguiente sistema de archivos por defecto después del sistema de archivos ext4.

Algunas herramientas permiten el acceso al sistema de archivos sin soporte del núcleo de Linux (ver Sección 9.8.2, “Manipular archivos sin el montaje de discos”).

### 9.6.6. Comprobación de la integridad y creación del sistema de archivos

La orden mkfs(8) crea el sistema de archivos en el sistema Linux. La orden fsck(8) aporta la comprobación de integridad al sistema de archivos y la capacidad de reparación al sistema Linux.

El Debian actual no ejecuta periódicamente `fsck` después de la creación del sistema de archivos.

| Atención
Normalmente no es seguro ejecutar `fsck` en sistemas de archivos montados.

| Sugerencia

Puede ejecutar la orden fsck(8) de forma segura en todos los sistemas de archivos incluido el sistema de archivos raíz en el arranque activando «`enable_periodic_fsck`» en «`/etc/mke2fs.conf`» y el contador de montajes máximo a 0 utilizando «`tune2fs -c0 /dev/nombre_de_la_partición`». Ver mke2fs.conf(5) y tune2fs(8).

Para comprobar la ejecución de la orden fsck(8) del archivo de órdenes del arranque compruebe los archivos en «`/var/log/fsck/`».

### 9.6.7. Optimización de los sistemas de archivos a través de las opciones de montaje

La configuración estática básica del sistema de archivos se realizan en «`/etc/fstab`». Por ejemplo,

    «file system»                   «mount point» «type» «options»    «dump» «pass»
    proc                                      /proc proc   defaults          0 0
    UUID=709cbe4c-80c1-56db-8ab1-dbce3146d2f7 /     ext4   errors=remount-ro 0 1
    UUID=817bae6b-45d2-5aca-4d2a-1267ab46ac23 none  swap   sw                0 0
    /dev/scd0                        /media/cdrom0  udf,iso9660 user,noauto  0 0

| Sugerencia
UUID (ver Sección 9.6.3, “Acceso al particionado utilizando UUID”) puede utilizarse para identificar los dispositivos de bloque en lugar de los nombres de los dispositivos de bloque como «`/dev/sda1`», «`/dev/sda2`», …

Desde Linux 2.6.30, el kernel utiliza por defecto el comportamiento proporcionado por la opción "`relatime`".

Ver fstab(5) y mount(8).

### 9.6.8. Optimización del sistema de archivo a través del superbloque

La caracterización del sistema de archivos se puede optimizar a través de su superbloque utilizando la orden tune2fs(8).

- La ejecución de «`sudo tune2fs -l /dev/sda1`» muestra el contenido del sistema de archivos del superbloque de «`/dev/sda1`».

- La ejecución de «`sudo tune2fs -c 50 /dev/sda1`» cambia la frecuencia de comprobaciones del sistema de archivos (`fsck` durante el arranque) cada 50 arranques en «`/dev/sda1`».

- La ejecución de «`sudo tune2fs -j /dev/sda1`» añade la capacidad del registro de operaciones al sistema archivos, a saber conversión del sistema de archivos de ext2 a ext3 en «`/dev/sda1`». (Para ello se necesita que el sistema de archivos este desmontado.)

- La ejecución de «`sudo tune2fs -O extents,uninit_bg,dir_index /dev/sda1 && fsck -pf /dev/sda1`» lo convierte de ext3 a ext4 en «`/dev/sda1`». (Realice esto con el sistema de archivos desmontado.)

| Sugerencia
A pesar de su nombre, tune2fs(8) trabaja no solo con el sistema de archivos ext2 pero también con los sistemas de archivos ext3 y ext4.

### 9.6.9. Optimización del disco duro

| Aviso
Por favor, compruebe su hardware y lea las páginas de manual de hdparm(8) antes de probar las configuraciones del disco duro ya que puede ser peligroso para la integridad de los datos.

Puede comprobar la velocidad de acceso al disco duro, p. ej. «`/dev/sda`» con «`hdparm -tT /dev/sda`». Algunos discos conectados mediante (E)IDE se puede mejorar su velocidad con «`hdparm -q -c3 -d1 -u1 -m16 /dev/sda`» activando el «soporte I/O (E)IDE 32-bit«, activando la «bandera using_dma«, asignando la «bandera interrupt-unmask» y activando «multiple 16 sector I/O» (¡peligroso!).

Puede comprobar la funcionalidad de la escritura de caché del disco duro , p. ej. «`/dev/sda`», con «`hdparm -W /dev/sda`». Para deshabilitar esta funcionalidad ejecute «`hdparm -W 0 /dev/sda`».

Puede intentar leer CDROMs dañados en dispositivos de lectura de alta velocidad modernos haciendo que funcionen a menor velocidad con «`setcd -x 2`».

### 9.6.10. Optimización de un disco de estado sólido (SSD)

La unidad de estado sólido (SSD) ahora se detecta automáticamente.

Reducir los accesos innecesarios al disco para evitar el desgaste del disco montando "`tmpfs`" en la trayectoria de datos volátil en `/etc/fstab`.

### 9.6.11. Utilice SMART para predecir fallos en su disco duro

Puede monitorear y registrar el cumplimiento de su disco duro con SMART con el demonio smartd(8).

1. Active la funcionalidad SMART en la BIOS.

2. Instale el paquete `smartmontools`.

3. Identifique los dispositivos que son discos duros enumerándolos con df(1).

   - Asumamos que el dispositivo de disco duro a controlar es «`/dev/sda`».

4. Compruebe la salida de «`smartctl -a /dev/sda`» para verificar que la funcionalidad SMART está activada realmente.

   - Si no es así, actívelo con «`smartctl -s on -a /dev/sda`».

5. Active el demonio smartd(8) ejecutando lo siguiente.

   - descomente «`start_smartd=yes`» en el archivo «`/etc/default/smartmontools`».

   - reiniciar el demonio smartd(8) mediante «`sudo /etc/init.d/smartmontools restart`».

| Sugerencia
El demonio smartd(8) se puede personalizar mediante el archivo `/etc/smartd.conf` que incluye el modo de notificación de las alertas.

### 9.6.12. Determine el directorio de almacenamiento temporal por medio de $TMPDIR

Las aplicaciones habitualmente crean los archivos temporales en el directorio de almacenamiento temporal «`/tmp`». Si «`/tmp`» no proporciona suficiente espacio, puede especificar el directorio de almacenamiento temporal por medio de la variable `$TMPDIR` para obtener el comportamiento adecuado de las aplicaciones.

### 9.6.13. Expansión del espacio de almacenamiento utilizable mediante LVM

Las particiones creadas mediante el Gestor de Volúmenes Lógicos (Logical Volume Manager, LVM) (funcionalidad de Linux) en el momento de la instalación, se pueden redimensionar de forma sencilla mediante la concatenación o la extensión de estas sobre varios dispositivos de almacenamiento sin necesitar otras reconfiguraciones del sistema.

### 9.6.14. Expansión del espacio de almacenamiento útil mediante el montaje de otra partición

Si tiene una partición vacía (p. ej. «`/dev/sdx`»), puede darle formato con mkfs.ext4(1) y montarlo(8) en un directorio donde necesite más espacio. (Necesitará copiar el contenido de los datos originales.)

    $ sudo mv work-dir old-dir
    $ sudo mkfs.ext4 /dev/sdx
    $ sudo mount -t ext4 /dev/sdx work-dir
    $ sudo cp -a old-dir/* work-dir
    $ sudo rm -rf old-dir

| Sugerencia
También puede montar un archivo de imagen de disco vacío (ver Sección 9.7.5, “Haciendo un archivo de imagen de disco vacío”) como un dispositivo «loop« (ver Sección 9.7.3, “Montaje del archivo imagen del disco”). El uso actual del disco crece con los datos reales almacenados.

### 9.6.15. Expansión del espacio de almacenamiento por el enlace mediante el montaje en otro directorio

Si tiene un directorio vacío (p. ej. «`/path/to/emp-dir`») en otra partición con espacio utilizable, puede montar(8)lo con la opción «`--bind`» a un directorio (p. ej., «`work-dir`») donde necesite más espacio.

    $ sudo mount --bind /path/to/emp-dir work-dir

### 9.6.16. Expansión del espacio de almacenamiento utilizable por superposición-montaje de otro directorio

Si tiene espacio útil en otras particiones (p. ej. «`/path/to/empty`» y «`/path/to/work`»), puede crear un directorio en él y juntarlo con el antiguo directorio (p. ej., «`/path/to/old`») donde necesita espacio usando el OverlayFS para el kernel de Linux 3.18 o posterior (Debian Stretch 9.0 o nuevas).

    $ sudo mount -t overlay overlay \
      -olowerdir=/path/to/old-dir,upperdir=/path/to/empty,workdir=/path/to/work

Aquí, «`/path/to/empty`» y «`/path/to/work`» deben ser una partición con permiso RW para escribir en "`/path/to/old`"..

### 9.6.17. Expansión del espacio de almacenamiento útil utilizando un enlace simbólico

| Atención
Este es un método obsoleto. Algún software puede no funcionar bien con "enlace simbólico a un directorio". En su lugar, utilice los enfoques de "montaje" ya descritos.

Si tiene un directorio vacío (p. ej., «`/path/to/emp-dir`») en otra partición con espacio utilizable, puede crear un enlace simbólico a el directorio con ln(8).

    $ sudo mv work-dir old-dir
    $ sudo mkdir -p /path/to/emp-dir
    $ sudo ln -sf /path/to/emp-dir work-dir
    $ sudo cp -a old-dir/* work-dir
    $ sudo rm -rf old-dir

| Aviso
No utilice «enlaces simbólicos a directorios« que gestionen el sistema como «`/opt`». Como enlace simbólico se puede sobreescribir cuando se actualice el sistema.

## 9.7. La imagen de disco

Aquí hablaremos de la manipulación de imágenes de disco.

### 9.7.1. Creando un archivo de imagen de disco

The disk image file, "`disk.img`", of an unmounted device, e.g., the second SCSI or serial ATA drive "`/dev/sdb`", can be made by one of the following.

    # dd if=/dev/sdb of=disk.img; sync

    # cp /dev/sdb disk.img ; sync

    # cat /dev/sdb > disk.img ; sync

La imagen de disco de un PC tradicional Registro de Arranque Maestro(MBR) (ver Sección 9.6.2, “Configuración del particionado de disco”) que está en el primer sector del disco primario IDE puede hacerse mediante dd(1) lo siguiente.

    # dd if=/dev/sda of=mbr.img bs=512 count=1
    # dd if=/dev/sda of=mbr-nopart.img bs=446 count=1
    # dd if=/dev/sda of=mbr-part.img skip=446 bs=1 count=66

- «`mbr.img`»: MBR con la tabla de particiones

- «`mbr-nopart.img`»: MBR sin la tabla de particiones

- «`mbr-part.img`»: Únicamente la tabla de particiones MBR

Si ha hecho una imagen del disco de la partición del disco original, cambie «`/dev/sda`» por «`/dev/sda1`» etc.

### 9.7.2. Escribiendo directamente en el disco

The disk image file, "`disk.img`" can be written to an unmounted device, e.g., the second SCSI drive "`/dev/sdb`" with matching size, by one of the following.

    # dd if=disk.img of=/dev/sdb ; sync

    # cp disk.img /dev/sdb ; sync

    # cat disk.img >/dev/sdb ; sync

De forma parecida, el archivo imagen de la partición del disco, «`partition.img`» se puede escribir a una partición desmontada, p. ej., la primera partición del segundo dispositivo SCSI «`/dev/sdb1`» con el tamaño correcto, como se muestra.

    # dd if=partition.img of=/dev/sdb1 ; sync

### 9.7.3. Montaje del archivo imagen del disco

La imagen del disco «`partition.img`» que contiene la imagen de una única partición se puede montar y desmontar utilizándolo como dispositivo «loop« como aparece.

    # losetup --show -f partition.img
    /dev/loop0
    # mkdir -p /mnt/loop0
    # mount -t auto /dev/loop0 /mnt/loop0
    ...hack...hack...hack
    # umount /dev/loop0
    # losetup -d /dev/loop0

Este se puede simplificar como se muestra.

    # mkdir -p /mnt/loop0
    # mount -t auto -o loop partition.img /mnt/loop0
    ...hack...hack...hack
    # umount partition.img

Cada partición de una imagen de disco «`disk.img`» que contiene varias particiones se pueden montar utilizando los dispositivos «loop«.

    # losetup --show -f -P disk.img
    /dev/loop0
    # ls -l /dev/loop0*
    brw-rw---- 1 root disk   7,  0 Apr  2 22:51 /dev/loop0
    brw-rw---- 1 root disk 259, 12 Apr  2 22:51 /dev/loop0p1
    brw-rw---- 1 root disk 259, 13 Apr  2 22:51 /dev/loop0p14
    brw-rw---- 1 root disk 259, 14 Apr  2 22:51 /dev/loop0p15
    # fdisk -l /dev/loop0
    Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 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
    Disklabel type: gpt
    Disk identifier: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

    Device         Start     End Sectors  Size Type
    /dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
    /dev/loop0p14   2048    8191    6144    3M BIOS boot
    /dev/loop0p15   8192  262143  253952  124M EFI System

    Partition table entries are not in disk order.
    # mkdir -p /mnt/loop0p1
    # mkdir -p /mnt/loop0p15
    # mount -t auto /dev/loop0p1 /mnt/loop0p1
    # mount -t auto /dev/loop0p15 /mnt/loop0p15
    # mount |grep loop
    /dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
    /dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
    ...hack...hack...hack
    # umount /dev/loop0p1
    # umount /dev/loop0p15
    # losetup -d /dev/loop0

De forma alternativa, se pueden conseguir los mismos efectos utilizando el mapeo de dispositivos de los dispositivos creados por kpartx(8) del paquete `kpartx` como sigue.

    # kpartx -a -v disk.img
    add map loop0p1 (253:0): 0 3930112 linear 7:0 262144
    add map loop0p14 (253:1): 0 6144 linear 7:0 2048
    add map loop0p15 (253:2): 0 253952 linear 7:0 8192
    # fdisk -l /dev/loop0
    Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 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
    Disklabel type: gpt
    Disk identifier: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

    Device         Start     End Sectors  Size Type
    /dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
    /dev/loop0p14   2048    8191    6144    3M BIOS boot
    /dev/loop0p15   8192  262143  253952  124M EFI System

    Partition table entries are not in disk order.
    # ls -l /dev/mapper/
    total 0
    crw------- 1 root root 10, 236 Apr  2 22:45 control
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p1 -> ../dm-0
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p14 -> ../dm-1
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p15 -> ../dm-2
    # mkdir -p /mnt/loop0p1
    # mkdir -p /mnt/loop0p15
    # mount -t auto /dev/mapper/loop0p1 /mnt/loop0p1
    # mount -t auto /dev/mapper/loop0p15 /mnt/loop0p15
    # mount |grep loop
    /dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
    /dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
    ...hack...hack...hack
    # umount /dev/mapper/loop0p1
    # umount /dev/mapper/loop0p15
    # kpartx -d disk.img

### 9.7.4. Limpiando un archivo de imagen de disco

Un archivo de imagen de disco, «`disk.img`» se puede limpiar de archivos borrados en una imagen dispersa limpia «`new.img`» así.

    # mkdir old; mkdir new
    # mount -t auto -o loop disk.img old
    # dd bs=1 count=0 if=/dev/zero of=new.img seek=5G
    # mount -t auto -o loop new.img new
    # cd old
    # cp -a --sparse=always ./ ../new/
    # cd ..
    # umount new.img
    # umount disk.img

Si «`disk.img`» es ext2, ext3 o ext4, también puede utilizar zerofree(8) del paquete `zerofree` como se muestra.

    # losetup --show -f disk.img
    /dev/loop0
    # zerofree /dev/loop0
    # cp --sparse=always disk.img new.img
    # losetup -d /dev/loop0

### 9.7.5. Haciendo un archivo de imagen de disco vacío

La imagen de disco vacío «`disk.img`» el cual puede crecer hasta 5GiB, pude hacerse mediante dd(1) como se muestra.

    $ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

En lugar de usar dd(1), se puede usar aquí fallocate(8) especializado.

Puede crear un sistema de archivos ext4 en la imagen de disco «`disk.img`» utilizando el dispositivo «loop« como se muestra.

    # losetup --show -f disk.img
    /dev/loop0
    # mkfs.ext4 /dev/loop0
    ...hack...hack...hack
    # losetup -d /dev/loop0
    $ du  --apparent-size -h disk.img
    5.0G  disk.img
    $ du -h disk.img
    83M disk.img

Para «`disk.img`», su tamaño de archivo es 5.0 GiB y su utilización real de disco es de sólo 83MiB. Esta discrepancia es posible ya que ext4 se puede representar mediante un archivo disperso.

| Sugerencia
La utilización real de discos que utiliza un archivo disperso crece con los datos que son escritos en el.

Utilizando la misma operación en dispositivos creados por el dispositivo «loop« o el mapeador de dispositivos como Sección 9.7.3, “Montaje del archivo imagen del disco”, puede particionar esta imagen de disco «`disk.img`» utilizando parted(8) o fdisk(8) y puede crear el archivo de sistemas en el utilizando mkfs.ext4(8), mkswap(8), etc.

### 9.7.6. Haciendo un archivo de imagen ISO9660

| Sugerencia
Both genisoimage(1) provided by cdrkit and xorrisofs(1) provided by Libburnia share the same command syntax except for the command name.

El archivo de imagen ISO9660, «`cd.iso`», utilizando como origen el árbol de directorios de «`source_directory`» se puede hacer utilizando genisoimage(1) aportado por cdrkit como se muestra.

    #  genisoimage -r -J -T -V volume_id -o cd.iso source_directory

De igual manera, el archivo imagen ISO9660 arrancable, «`cdboot.iso`», se puede realizar desde el `debian-installer` como el árbol de directorios del «`source_directory`» como se muestra.

    #  genisoimage -r -o cdboot.iso -V volume_id \
       -b isolinux/isolinux.bin -c isolinux/boot.cat \
       -no-emul-boot -boot-load-size 4 -boot-info-table source_directory

Aquí el cargador de arranque Isolinux (ver Sección 3.1.2, “Fase 2: el cargador de arranque”) se utiliza para el arranque.

Puede calcular el valor md5sum y hace la imagen ISO9660 directamente desde el dispositivo CD-ROM como se muestra.

    $ isoinfo -d -i /dev/cdrom
    CD-ROM is in ISO 9660 format
    ...
    Logical block size is: 2048
    Volume size is: 23150592
    ...
    # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
    # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso

| Aviso
Debe evitar cuidadosamente el sistema de archivos ISO9660 debido al problema de lectura adelantada de Linux para obtener el resultado correcto.

### 9.7.7. Escritura directa al CD/DVD-R/RW

| Sugerencia
DVD is only a large CD to wodim(1) provided by cdrkit and xorrecord(1) provided by Libburnia. These commands share the same command syntax except for the command name.

Puede encontrar un dispositivo utilizable como se muestra.

    # wodim --devices

Entonces se inserta el CD-R vacío en el dispositivo CD, y el archivo de imagen ISO9660 , «`cd.iso`» se escribe en el dispositivo, p. ej. «`/dev/sda`», utilizando wodim(1) como se muestra.

    # wodim -v -eject dev=/dev/sda cd.iso

Si se utiliza un CR-RW en lugar de un CD-R, hago lo siguiente en su lugar.

    # wodim -v -eject blank=fast dev=/dev/sda cd.iso

| Sugerencia
Si su sistema de escritorio monta automáticamente los CD, desmóntalo con «`sudo umount /dev/sda`» desde la consola antes de utilizar wodim(1).

### 9.7.8. Montando un archivo imagen ISO9660

Si «`cd.iso`» contiene una imagen ISO9660, entonces lo siguiente sirve para montarlo de forma manual en «`/cdrom`».

    # mount -t iso9660 -o ro,loop cd.iso /cdrom

| Sugerencia
Los sistemas de escritorio modernos pueden montar los medios extraíbles como un CD con formato ISO9660 de forma automática (ver Sección 10.1.7, “Dispositivos de almacenamiento extraíbles”).

## 9.8. Datos binarios

Aquí discutiremos la manipulación directa de datos binarios en medios de almacenamiento.

### 9.8.1. Viendo y editando datos binarios

El método más básico de visualización de datos binarios es la orden «`od -t x1`».

Tabla 9.21. Relación de paquetes para la visualización y edición de datos binarios

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`coreutils` | V:910, I:1000 | 17994 | paquete básico que tiene od(1) para volcar archivos (HEX, ASCII, OCTAL, …)
`bsdmainutils` | V:4, I:131 | 17 | paquete de utilidades que tiene hd(1) para volcar archivos (HEX, ASCII, OCTAL, …)
`hexedit` | V:0.8, I:8.1 | 70 | visor y editor binario (HEX, ASCII)
`bless` | V:0.1, I:1.4 | 924 | editor hexadecimal con funcionalidad completa (GNOME)
`okteta` | V:1, I:10 | 1589 | editor hexadecimal con funcionalidad completa (KDE4)
`ncurses-hexedit` | V:0.1, I:1.3 | 130 | visor y editor binario (HEX, ASCII, EBCDIC)
`beav` | V:0.04, I:0.30 | 137 | visor y editor binario (HEX, ASCII, EBCDIC, OCTAL, …)

| Sugerencia

HEX es un acrónimo del formato hexadecimal con radix 16. OCTAL se utiliza para formato octal con radix 8. ASCII se utiliza para Codificación Americana Estándar para el Intercambio de Información (American Standard Code for Information Interchange), a saber, codificación del inglés normal. EBCDIC es para Extended Binary Coded Decimal Interchange Code utilizado en sistemas operativos de IBM mainframe.

### 9.8.2. Manipular archivos sin el montaje de discos

Existen herramientas para leer y escribir archivos sin montar el disco.

Tabla 9.22. Relación de paquetes para manipular archivos sin montar el disco

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`mtools` | V:7, I:53 | 400 | utilidades para archivos MSDOS sin montarlos
`hfsutils` | V:0.2, I:2.8 | 178 | utilidades para archivos HFS y HFS+ sin montarlos

### 9.8.3. Redundancia de datos

Los sistemas de software RAID del núcleo Linux aportan redundancia en el nivel del sistema de archivos de datos del núcleo con la finalidad de alcanzar alta fiabilidad en el almacenamiento.

Existen herramientas para añadir datos redundados a archivos al nivel de aplicación de programas para conseguir también alta fiabilidad en el almacenamiento.

Tabla 9.23. Relación de herramientas para añadir redundancia de datos a los archivos

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`par2` | V:9, I:116 | 297 | Paridad del conjunto de volúmenes de archivo, para comprobar y reparar archivos
`dvdisaster` | V:0.1, I:1.2 | 1422 | Protección contra pérdida/rotura/vejez de medios CD/DVD
`dvbackup` | V:0.01, I:0.04 | 413 | herramienta de copia de seguridad para MiniDV (aportada por rsbep(1))

### 9.8.4. Recuperación de datos de archivos y análisis forense

Existen herramientas para la recuperación de archivos y análisis forense.

Tabla 9.24. Relación de paquetes para la recuperación de archivos y análisis forense

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`testdisk` | V:2, I:26 | 2276 | utilidades para el escaneado de particiones y recuperaciones de disco
`magicrescue` | V:0.2, I:1.9 | 257 | utilidades para la recuperación de archivos y búsqueda de bytes mágicos
`scalpel` | V:0.2, I:2.4 | 89 | Divisor de archivos ligero y alto rendimiento
`myrescue` | V:0.2, I:2.1 | 81 | recuperación de datos de discos duros dañados
`extundelete` | V:0.5, I:7.8 | 152 | utilidad para recuperar archivos borrados en sistemas de archivos ext3/4
`ext4magic` | V:0.3, I:3.7 | 235 | utilidad para recuperar archivos borrados en sistemas de archivos ext3/4
`ext3grep` | V:0.2, I:2.0 | 299 | herramienta de ayuda a la recuperación de archivos borrados en sistemas de archivos ext3
`scrounge-ntfs` | V:0.2, I:1.7 | 49 | programa de recuperación de datos en sistemas de archivos NTFS
`gzrt` | V:0.02, I:0.47 | 34 | conjunto de herramientas de recuperación gzip
`sleuthkit` | V:2, I:25 | 1119 | herramientas de análisis forense (Sleuthkit)
`autopsy` | V:0.2, I:1.3 | 1026 | interfaz gráfico para SleuthKit
`foremost` | V:0.4, I:4.2 | 101 | aplicación forense para la recuperación de datos
`guymager` | V:0.14, I:0.82 | 1049 | herramienta para el análisis forense de imágenes basado en Qt
`dcfldd` | V:0.3, I:2.8 | 113 | versión mejorada de `dd` para análisis forense y seguridad

| Sugerencia
Puede recuperar archivos borrados en sistemas de archivos ext2 utilizando la `relación_de_inodos_borrados` y la orden `undel` de debugfs(8) en el paquete `e2fsprogs`.

### 9.8.5. División de un archivo grande en archivos de tamaño menor

Cuando los datos son demasiado grandes para guardarlos en un único archivo, puede obtener una copia de seguridad de su contenido dividiéndolo en, p. ej. trozos de 2000MiB y juntarlos más tarde para obtener el archivo original.

    $ split -b 2000m large_file
    $ cat x* >large_file

| Atención
Por favor, asegúrese que no tiene ningún archivo que comience por «`x`» para evitar fallos de nombrado.

### 9.8.6. Limpieza del contenido de los archivos

Para limpiar el contenido de los archivos como los archivos de registro, no utilice rm(1) para borrarlo y crear uno nuevo vacío, ya que puede intentar ser accedido entre ambas operaciones. La forma segura de limpiar el contenido de un archivo es la que se muestra.

    $ :>file_to_be_cleared

### 9.8.7. Archivos «vacíos»

Las órdenes siguientes crean archivos «vacíos».

    $ dd if=/dev/zero    of=5kb.file bs=1k count=5
    $ dd if=/dev/urandom of=7mb.file bs=1M count=7
    $ touch zero.file
    $ : > alwayszero.file

Encontrará lo siguiente tras ejecutar lo anterior.

- «`5kb.file`» que contiene 5KB de ceros.

- «`7mb.file`» que contiene 7MB de datos aleatorios.

- «`zero.file`» puede tener 0 bytes. Si existiera con anterioridad, su `mtime` es actualizado y su contenido y su longitud permanecen sin cambios.

- «`alwayszero.file`» es siempre un archivo de 0 bytes. Si existía con anterioridad, su `mtime` es actualizado y su contenido borrado.

### 9.8.8. Borrando completo de un disco duro

There are several ways to completely erase data from an entire hard disk like device, e.g., USB flash drive at "`/dev/sda`".

| Atención
Check your USB flash drive location with mount(8) first before executing commands here. The device pointed by "`/dev/sda`" may be SCSI hard disk or serial-ATA hard disk where your entire system resides.

Borre todo el contenido del disco poniendo a 0 toda la información como se muestra.

    # dd if=/dev/zero of=/dev/sda

Bórrelo todo escribiendo datos aleatorios como sigue.

    # dd if=/dev/urandom of=/dev/sda

Bórrelo todo sobrescribiendo datos aleatorios de forma eficiente como se muestra.

    # shred -v -n 1 /dev/sda

También puede usar la opción badblocks(8) con la opción `-t random`.

Ya que dd(1) esta disponible en el intérprete de órdenes de muchos CDs de Linux arrancables como el CD instalador de Debian, puede borrar el sistema instalado completamente ejecutando una de las órdenes anteriores desde dicho medio sobre el disco duro del sistema, p. ej.«`/dev/sda`», «`/dev/sda`», etc.

### 9.8.9. Borrar áreas de disco duro no utilizadas

Unused area on an hard disk (or USB flash drive), e.g. "`/dev/sdb1`" may still contain erased data themselves since they are only unlinked from the filesystem. These can be cleaned by overwriting them.

    # mount -t auto /dev/sdb1 /mnt/foo
    # cd /mnt/foo
    # dd if=/dev/zero of=junk
    dd: writing to `junk': No space left on device
    ...
    # sync
    # umount /dev/sdb1

| Aviso
This is usually good enough for your USB flash drive. But this is not perfect. Most parts of erased filenames and their attributes may be hidden and remain in the filesystem.

### 9.8.10. Recuperando archivos borrados pero todavía abiertos

Incluso en el caso de que accidentalmente haya borrado un archivo, mientras que ese archivo sea utilizado por alguna aplicación (en modo lectura o escritura), es posible recuperar dicho archivo.

Por ejemplo, intente lo siguiente

    $ echo foo > bar
    $ less bar
    $ ps aux | grep ' less[ ]'
    bozo    4775  0.0  0.0  92200   884 pts/8    S+   00:18   0:00 less bar
    $ rm bar
    $ ls -l /proc/4775/fd | grep bar
    lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/bar (deleted)
    $ cat /proc/4775/fd/4 >bar
    $ ls -l
    -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar
    $ cat bar
    foo

Ejecute en otro terminal (cuando tenga el paquete `lsof` instalado) como se muestra.

    $ ls -li bar
    2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar
    $ lsof |grep bar|grep less
    less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar
    $ rm bar
    $ lsof |grep bar|grep less
    less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted)
    $ cat /proc/4775/fd/4 >bar
    $ ls -li bar
    2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar
    $ cat bar
    foo

### 9.8.11. Buscando todos los enlaces duros

Los archivos con enlaces duros pueden identificarse mediante «`ls -li`».

    $ ls -li
    total 0
    2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar
    2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz
    2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo

Tanto «`baz`» como «`foo`» tiene una cuenta de «2« (>1) de forma que tiene enlaces duros. Sus números de inodos son comunes «2738404«. Esto significa que son el mismo archivo mediante un archivo duro. Si no se encuentra todos los enlaces duros por casualidad, puede buscarlos mediante el inodo, p. ej. «2738404« como sigue.

    # find /path/to/mount/point -xdev -inum 2738404

### 9.8.12. Consumo invisible de espacio de disco

Todos los archivos borrados pero abiertos consumen espacio de disco aunque no son visibles para el du(1) normal. Estos pueden ser enumerados junto con su tamaño como se muestra.

    # lsof -s -X / |grep deleted

## 9.9. Trucos para cifrar información

Con acceso físico a su PC, cualquiera puede acceder como superusuario y acceder a todos los archivos en él (ver Sección 4.6.4, “Asegurando la contraseña de root”). Esto significa que el sistema de acceso por contraseña puede no asegurar sus datos delicados y privados contra posibles ladrones de su PC. Para hacerlo debe desplegar alguna tecnología de cifrado de información. Aunque GNU privacy guard (ver Sección 10.3, “Infraestructura de seguridad de la información”) puede cifrar archivos , necesita de los esfuerzos del usuario.

Dm-crypt ayuda al cifrado automático de la información de forma nativa por medio de módulos del núcleo Linux con el mínimo esfuerzo por parte del usuario usando device-mapper.

Tabla 9.25. Relación de utilidades para el cifrado de información

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`cryptsetup` | V:35, I:80 | 465 | utilidades para cifrar dispositivos de bloque (dm-crypt / LUKS)
`cryptmount` | V:2.0, I:2.6 | 236 | utilidades para cifrar dispositivos de bloque (dm-crypt / LUKS) centrado en el montaje/desmontaje por usuarios normales
`fscrypt` | V:0.4, I:1.1 | 6545 | utilidades para el cifrado del sistema de archivos de Linux (fscrypt)
`libpam-fscrypt` | V:0.29, I:0.34 | 6594 | Módulo PAM para el cifrado del sistema de archivos de Linux (fscrypt)

| Atención
El cifrado de datos gasta recursos de la CPU, etc. Los datos encriptados se vuelven inaccesibles si se pierde su contraseña. Sopesa sus ventajas y sus costes.

| Nota
El sistema Debian entero puede instalarse en el disco cifrado por el instalador debian (lenny o más nuevo) utilizando dm-crypt/LUKS y initramfs.

| Sugerencia
Ver Sección 10.3, “Infraestructura de seguridad de la información” para la utilización del cifrado del espacio de usuario: GNU Privacy Guard.

### 9.9.1. Cifrado de discos externos con dm-crypt/LUKS

You can encrypt contents of removable mass devices, e.g. USB flash drive on "`/dev/sdx`", using dm-crypt/LUKS. You simply format it as the following.

    # fdisk /dev/sdx
    ... "n" "p" "1" "return" "return" "w"
    # cryptsetup luksFormat /dev/sdx1
    ...
    # cryptsetup open /dev/sdx1 secret
    ...
    # ls -l /dev/mapper/
    total 0
    crw-rw---- 1 root root  10, 60 2021-10-04 18:44 control
    lrwxrwxrwx 1 root root       7 2021-10-04 23:55 secret -> ../dm-0
    # mkfs.vfat /dev/mapper/secret
    ...
    # cryptsetup close secret

Entonces, se puede montar igual que uno normal en "`/media/nombre_usuario/etiqueta_disco`", excepto para pedir la contraseña (ver Sección 10.1.7, “Dispositivos de almacenamiento extraíbles”) bajo el entorno de un escritorio moderno usando el paquete `udisks2`. La diferencia es que todos los datos que se escriben en él están cifrados. La introducción de la contraseña puede automatizarse utilizando llaveros (véase Sección 10.3.6, “Llavero de contraseña”).

Alternativamente, puedes formatear los medios en un sistema de archivos diferente, por ejemplo, ext4 con "`mkfs.ext4 /dev/mapper/sdx1`". Si se utiliza btrfs en su lugar, es necesario instalar el paquete `udisks2-btrfs`. Para estos sistemas de archivos, puede ser necesario configurar la propiedad y los permisos de los archivos.

### 9.9.2. Montaje de disco cifrado con dm-crypt/LUCKS

Por ejemplo, una partición de disco cifrada creada con dm-crypt/LUKS en "`/dev/sdc5`" por el instalador de Debian puede montarse en "`/mnt`" de la siguiente forma:

    $ sudo cryptsetup open /dev/sdc5 ninja --type luks
    Enter passphrase for /dev/sdc5: ****
    $ sudo lvm
    lvm> lvscan
      inactive          '/dev/ninja-vg/root' [13.52 GiB] inherit
      inactive          '/dev/ninja-vg/swap_1' [640.00 MiB] inherit
      ACTIVE            '/dev/goofy/root' [180.00 GiB] inherit
      ACTIVE            '/dev/goofy/swap' [9.70 GiB] inherit
    lvm> lvchange -a y /dev/ninja-vg/root
    lvm> exit
      Exiting.
    $ sudo mount /dev/ninja-vg/root /mnt

## 9.10. El núcleo

Debian distribuye el núcleo de Linux modularizado en paquetes para soportar las arquitecturas.

Si estás leyendo esta documentación, probablemente no necesites compilar el kernel de Linux por ti mismo.

### 9.10.1. Parámetros del núcleo

Muchas funcionalidades de Linux son configurables por medio de parámetros del núcleo como se muestra.

- Los parámetros del núcleo las inicializa el cargador de arranque (ver Sección 3.1.2, “Fase 2: el cargador de arranque”)

- Los parámetros del núcleo cambian mediante sysctl(8) en tiempo de ejecución por aquellos accesibles por medio de sysfs (consulte Sección 1.2.12, “procfs y sysfs”)

- Los parámetros de modprobe(8) se asignan como parámetros del módulo cuando se activa el módulo (ver Sección 9.7.3, “Montaje del archivo imagen del disco”)

Consulta la "Guía del usuario y administrador del kernel de Linux " Parámetros de la línea de comandos del kernel" para obtener más información.

### 9.10.2. Cabeceras del núcleo

La mayor parte de los programas normales no necesitan las cabeceras del núcleo y de hecho puede producir errores si se utiliza directamente para compilar. Estos se deben compilar con las cabeceras en «`/usr/include/linux`» y «`/usr/include/asm`» que están en el paquete `libc6-dev` (creado por el paquete fuente `glibc`) en el sistema Debian.

| Nota
Para compilar algunos programas específicos del kernel, como los módulos del kernel de la fuente externa y el contador automático de daemon (`amd`), debe incluir la ruta a las cabeceras del kernel correspondientes, por ejemplo, "`-I/usr/src/linux-particular-version/include/`", en tu línea de comandos.

### 9.10.3. Compilar el núcleo y los módulos asociados

Debian tiene su propio método para compilar el núcleo y los módulos asociados.

Tabla 9.26. Relación de los paquetes fundamentales para la recompilación del núcleo en los sistemas Debian

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`build-essential` | V:18, I:512 | 17 | paquetes fundamentales para la construcción de paquetes Debian: `make`, `gcc`, …
`bzip2` | V:159, I:972 | 113 | utilidades de compresión y descompresión de archivos bz2
`libncurses5-dev` | I:34 | 6 | bibliotecas de desarrollo y documentación de ncurses
`git` | V:409, I:623 | 52512 | git: sistema de control de versiones distribuido utilizado por el núcleo de Linux
`fakeroot` | V:32, I:514 | 225 | aporta el entorno fakeroot para la construcción de paquetes sin ser «root«
`initramfs-tools` | V:479, I:988 | 49 | herramienta para construir initramfs (propio de Debian)
`dkms` | V:81, I:149 | 235 | soporte del núcleo para módulos dinámico (DKMS, dynamic kernel module support) (genérico)
`module-assistant` | V:1, I:13 | 395 | herramienta de ayuda para crear los paquetes de los módulos (específico de Debian)
`devscripts` | V:5, I:33 | 2766 | archivos de órdenes para el mantenimiento de Paquetes Debian (específico de Debian)

Si utiliza `initrd` en Sección 3.1.2, “Fase 2: el cargador de arranque”, asegurese de leer la documentación asociada en initramfs-tools(8), update-initramfs(8), mkinitramfs(8) y initramfs.conf(5).

| Aviso
No cree enlaces simbólicos en el árbol de directorios del código fuente (p. ej. «`/usr/src/linux*`») de «`/usr/include/linux`» y «`/usr/include/asm`» cuando compile código fuente del núcleo de Linux. (Algunos documentos sin actualizar lo sugieren.)

| Nota

Cuando compile el núcleo de Linux en el sistema Debian `stable` (estable), la utilización las últimas herramientas retroportadas de Debian `unstable` (inestable) pueden ser necesarias.

module-assistant(8) (o su forma abreviada `m-a`) ayuda a los usuarios a construir e instalar fácilmente los paquetes de los módulos para uno o más núcleos personalizados.

El soporte del núcleo a módulos dinámicos (dynamic kernel module support, DKMS) es un marco nuevo de distribución independiente diseñado para permitir la actualización de módulos sueltos sin cambiar el núcleo completo. Esto es utilizado para mantener módulos externos. Esto también facilita la reconstrucción de módulos cuando actualice su núcleo.

### 9.10.4. Compilando el código fuente del núcleo: recomendaciones del Equipo Debian del Núcleo

Para la construcción de paquetes binarios personalizados del núcleo desde el código fuente del núcleo, podría utilizar el objetivo «`deb-pkg`» que se proporciona para ello.

    $ sudo apt-get build-dep linux
    $ cd /usr/src
    $ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v7.x/linux-7.1.7.tar.xz
    $ tar --xz -xvf linux-7.1.7.tar.xz
    $ cd linux-7.1.7
    $ cp /boot/config-7.1.7.config
    $ make menuconfig
     ...
    $ make deb-pkg

| Sugerencia
El paquete linux-source-version contiene el código fuente del núcleo de Linux con los parches de Debian como «`/usr/src/linux-version.tar.bz2`».

Para la construcción de paquetes binarios concretos desde el paquete de código fuente del núcleo de Debian, puede utilizar los objetivos «`binary-arch_architecture_featureset_flavour`» en «`debian/rules.gen`».

    $ sudo apt-get build-dep linux
    $ apt-get source linux
    $ cd linux-7.*
    $ fakeroot make -f debian/rules.gen binary-arch_i386_none_686

Compruebe la información adicional:

- Debian Wiki: KernelFAQ

- Debian Wiki: DebianKernel

- Debian Linux Kernel Handbook: https://kernel-handbook.debian.net

### 9.10.5. Controladores y firware del hardware

El controlador de hardware es el código que se ejecuta en las CPU principales del sistema de destino.. La mayor parte de los controladores de hardware están disponibles como software libre actualmente se incluyen en los paquetes normales del núcleo de Debian en el apartado `main`.

- controlador de GPU

  - Controlador de Intel GPU (`main`)

  - Controladores AMD/ATI GPU (`main`)

  - Controlador NVIDIA GPU (`main` para el controlador nouveau y `non-free` para los controladores binarios aportado por el vendedor.)

El firmware es el código o los datos ubicados en el propio dispositivo (p. ej. CPU microcode, código ejecutable para el «rendering« en GPU, o los datos FPGA / CPLD , …). Algunos paquetes con firmware están disponibles como software libre pero no la mayoría ya que contienen información binaria sin su código fuente. La instalación de estos datos de firmware es esencial para que el dispositivo funcione como se espera.

- Paquetes de datos de firmware que contienen datos cargados en la memoria volátil en el dispositivo de destino.

  - firmware-linux-free (`main`)

  - firmware-linux-nonfree (`non-free-firmware`)

  - firmware-linux-* (`non-free-firmware`)

  - *-firmware (`non-free-firmware`)

  - intel-microcode (`non-free-firmware`)

  - amd64-microcode (`non-free-firmware`)

- El programa de actualización de firmware empaqueta los datos de actualización en la memoria no volátil en el dispositivo de destino.

  - fwupd (`main`): Demonio de actualización de firmware que descarga datos de firmware de Linux Vendor Firmware Service.

  - gnome-firmware (`principal`): interfaz GTK para fwupd

  - plasma-discover-backend-fwupd (`principal`): interfaz Qt para fwupd

Ten en cuenta que el acceso a los paquetes de `non-free-firmware` lo proporcionan los medios de instalación oficiales para ofrecer una experiencia de instalación funcional al usuario desde Debian 12 Bookworm. El área de `firmware no libre` se describe en Sección 2.1.5, “Fundamentos del archivo de Debian”.

Ten en cuenta también que los datos del firmware descargados por fwupd del Servicio de firmware del proveedor de Linux y cargados en el kernel de Linux en la ejecución pueden ser `no libre`.

## 9.11. Sistemas virtualizados

La utilización de sistemas virtualizados nos permite la ejecución de varias instancias del sistema a la vez sobre un único hardware.

| Sugerencia
Ver Debian wiki en SystemVirtualization.

### 9.11.1. Herramientas de virtualización y emulación

Hay varias plataformas de virtualización y emulación.

- Completa los paquetes del hardware de emulación como los instalados por el metapaquete games-emulator

- Principalmente la emulación a nivel de la CPU con algunas emulaciones de dispositivos de E/S como QEMU

- Principalmente la virtualización a nivel de CPU con algunas emulaciones de dispositivos de E/S como Máquina virtual basada en kernel (KVM)

- Virtualización de los contenedores a nivel del sistema operativo con soporte a nivel de kernel como LXC (Linux Containers), Docker, systemd-nspawn(1), ....

- Virtualización del acceso al sistema de archivos a nivel del sistema operativo con la anulación de la llamada a la biblioteca del sistema en la ruta del archivo, como chroot

- Virtualización del acceso al sistema de archivos a nivel del sistema operativo con la anulación de las llamada a la biblioteca del sistema sobre la propiedad del archivo, como fakeroot

- Emulación de API de SO como Wine

- Virtualización a nivel del intérprete, además de la selección de la ejecución y anulaciones de las bibliotecas en el tiempo de ejecución, como virtualenv y venv de Python

La virtualización de los contenedores utiliza Sección 4.7.5, “Características de seguridad de Linux” y es la tecnología backend de Sección 7.7, “Sandbox”.

Aquí tienes algunos paquetes que te ayudarán a configurar el sistema virtualizado.

Tabla 9.27. Relación de herramientas de virtualización

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`coreutils` | V:910, I:1000 | 17994 | Utilidades básicas de GNU que contienen chroot(8)
`util-linux` | V:914, I:1000 | 4758 | miscellaneous system utilities which contain unshare(1)
`systemd-container` | V:74, I:77 | 2726 | herramientas systemd container/nspawn que contienen systemd-nspawn(1)
`schroot` | V:7.6, I:9.5 | 2222 | herramientas especializadas para la ejecución de paquetes binarios en «chroot«
`sbuild` | V:3.8, I:7.2 | 155 | herramientas para la construcción de paquetes binarios desde el código fuente de Debian
`debootstrap` | V:4, I:46 | 331 | sistema de arranque como sistema Debian mínimo (escrito en sh)
`mmdebstrap` | V:8, I:13 | 574 | sistema de arranque de un sistema Debian (escrito en Perl)
`cdebootstrap` | V:0.1, I:1.3 | 114 | sistema de arranque de un sistema Debian (escrito en C)
`cloud-image-utils` | V:1, I:14 | 52 | utilidades para la gestión de las imágenes en la nube
`cloud-guest-utils` | V:5, I:23 | 67 | utilidades para invitados en la nube
`virt-manager` | V:11, I:48 | 2309 | Gestor de Máquinas Virtuales: aplicación de escritorio para la gestión de máquinas virtuales
`libvirt-clients` | V:48, I:72 | 1164 | programas para la biblioteca libvirt
`docker.io` | V:50, I:52 | 81699 | docker: Tiempo de ejecución de contenedores Linux
`podman` | V:33, I:36 | 84895 | podman: motor para ejecutar contenedores basados en OCI en Pods
`podman-docker` | V:2.7, I:3.3 | 270 | motor para ejecutar contenedores basados en OCI en Pods - wrapper para docker
`incus` | V:0.8, I:3.2 | 23 | Incus: contenedor de los sistemas y gestor de máquinas virtuales
`games-emulator` | I:0.19 | 21 | games-emulator: emuladores de Debian para juegos
`bochs` | V:0.05, I:0.62 | 8180 | Bochs: emulador de PC IA-32 PC
`qemu-system` | I:21 | 64 | QEMU: binarios para la emulación de un sistema completo
`qemu-user` | V:5.8, I:9.6 | 471927 | QEMU: binarios para la emulación en modo usuario
`qemu-utils` | V:13, I:113 | 12634 | QEMU: utilidades
`qemu-system-x86` | V:53, I:96 | 69241 | KVM: virtualización completa de hardware x86 con la virtualización asistida por hardware
`virtualbox` | V:2.7, I:3.4 | 151006 | VirtualBox: solución de virtualización x86 en i386 y amd64
`gnome-boxes` | V:1.1, I:6.5 | 7074 | Boxes: Sencilla aplicación de GNOME para acceder a sistemas virtuales
`xen-tools` | V:0.1, I:1.5 | 719 | herramientas para la gestión de debian del servidor virtual XEN
`wine` | V:13, I:56 | 204 | Wine: Implementación de la API Windows (suite estándar)
`dosbox` | V:1, I:12 | 2697 | DOSBox: emulador x86 con gráficos Tandy/Herc/CGA/EGA/VGA/SVGA , sonido y DOS
`lxc` | V:10, I:13 | 1681 | Contenedores Linux herramientas del espacio de usuario
`python3-venv` | V:8, I:153 | 6 | venv para crear entornos virtuales python (biblioteca del sistema)
`python3-virtualenv` | V:7, I:39 | 374 | virtualenv para crear entornos python virtuales aislados
`pipx` | V:8, I:50 | 4412 | pipx para instalar aplicaciones python en entornos aislados

Consulte el artículo de Wikipedia Comparison of platform virtual machines para obtener detalles de la comparación entre diferentes plataformas y soluciones de virtualización.

### 9.11.2. Flujo de trabajo de la virtualización

| Nota
El núcleo de Debian por defecto soporta KVM desde `lenny`.

El flujo de trabajo de la virtualización conlleva varios pasos.

- Crear un sistema de archivos vacío (un árbol de directorios o una imagen de disco).

  - El árbol de directorios puede ser creado mediante «`mkdir -p /ruta/al/entorno//chroot`».

  - El archivo de la imagen de disco en crudo puede ser creado con dd(1) (ver Sección 9.7.1, “Creando un archivo de imagen de disco” y Sección 9.7.5, “Haciendo un archivo de imagen de disco vacío”).

  - qemu-img(1) se puede utilizar para crear y convertir archivos de imagen de disco utilizados por QEMU.

  - Los formatos de archivo crudos y VMDK se pueden utilizar como formato común entre diferentes herramientas de virtualización.

- Monte la imagen de disco con mount(8) en el sistema de archivos (opcional).

  - Para el archivo de imagen de disco crudo, móntelo como un dispositivo «loop« o mapeo de dispositivo (ver Sección 9.7.3, “Montaje del archivo imagen del disco”).

  - Para el soporte de imágenes de disco por QEMU, móntelos como dispositivo de bloque de red (ver Sección 9.11.3, “Montando el archivo de imagen de disco virtual”).

- Llene el sistema de archivos objetivo con la información del sistema.

  - La utilización de programas como `debootstrap` y `cdebootstrap` ayudan en este proceso (ver Sección 9.11.4, “Sistemas chroot”).

  - Utilización de instaladores de los sistemas operativos en la emulación del sistema completo.

- Ejecute un programa en un entorno virtualizado.

  - chroot ofrece un entorno de virtualización básico para compilar programas , ejecutar aplicaciones de consola y ejecutar demonios en él.

  - QEMU ofrece emulación de CPU independiente de la plataforma.

  - QEMU con KVM ofrece un sistema de emulación completo por medio de la virtualización asistida por hardware.

  - VirtualBox ofrece un sistema completo de emulación en i386 y amd64 con o sin la virtualización asistida por hardware.

### 9.11.3. Montando el archivo de imagen de disco virtual

Para un archivo de imagen de disco crudo, ver Sección 9.7, “La imagen de disco”.

Para otros archivos de imágenes de disco virtuales, puede utilizar qemu-nbd(8) para exportarlos utilizando el protocolo de dispositivos de bloque de red y montarlos utilizando el módulo del núcleo `nbd`.

qemu-nbd(8) admite formatos de disco compatibles con QEMU: crudo, qcow2, qcow, vmdk, vdi, bochs, cow (copia al escribir en modo usuario de Linux), parallels, dmg, cloop, vpc, vvfat (virtual VFAT) y «host_device«.

Los dispositivos de bloque de red pueden soportar particiones de la misma manera que los dispositivos «loop« (ver Sección 9.7.3, “Montaje del archivo imagen del disco”). Puede montar la primera partición de «`disk.img`» como se muestra.

    # modprobe nbd max_part=16
    # qemu-nbd -v -c /dev/nbd0 disk.img
    ...
    # mkdir /mnt/part1
    # mount /dev/nbd0p1 /mnt/part1

| Sugerencia
Puede exportar únicamente la primera partición de «`disk.img`» utilizando la opción «`-P 1`» de qemu-nbd(8).

### 9.11.4. Sistemas chroot

Si deseas probar un nuevo entorno Debian desde una consola de terminal, te recomiendo que uses chroot. Esto te permite ejecutar aplicaciones de la consola de Debian `inestable` y `prueba` sin los riesgos habituales asociados y sin reiniciar. chroot(8) es la forma más básica.

| Atención
Los ejemplos de abajo asumen que tanto el sistema padre como el sistema chroot comparten la misma arquitectura de CPU `amd64`.

Aunque puedes crear manualmente un entorno chroot(8) usando debootstrap(1), esto requiere esfuerzos no triviales.

El paquete sbuild para crear paquetes Debian desde el código fuente utiliza el entorno chroot administrado por el paquete schroot. Viene con una secuencia de comandos auxiliar sbuild-createchroot(1). Aprendamos cómo funciona ejecutándolo de la siguiente manera.

    $ sudo mkdir -p /srv/chroot
    $ sudo sbuild-createchroot -v --include=eatmydata,ccache unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian
     ...

Puedes ver como debootstrap(8) rellena los datos del sistema para el entorno `unstable` bajo "`/srv/chroot/unstable-amd64-sbuild`" para un sistema de construcción mínimo.

Puedes acceder a este entorno utilizando schroot(1).

    $ sudo schroot -v -c chroot:unstable-amd64-sbuild

Verás cómo se crea un shell de sistema que se ejecuta en un entorno `inestable`.

| Nota
El fichero "`/usr/sbin/policy-rc.d`" que siempre sale con 101 impide que los programas demonio se inicien automáticamente en el sistema Debian. Consulta "`/usr/share/doc/init-system-helpers/README.policy-rc.d.gz`".

| Nota
Algunos programas en chroot pueden requerir acceso a más archivos del sistema principal para funcionar que los que proporciona `sbuild-createchroot` como se indicó anteriormente. Por ejemplo, "`/sys`", "`/etc/passwd`", "`/etc/group`", "`/var/ run/utmp`", "`/var/log/wtmp`", etc. pueden necesitar ser montados o copiados.

| Sugerencia
El paquete `sbuild` ayuda a construir un sistema chroot y construye un paquete dentro del chroot usando `schroot` como su backend. Es un sistema ideal para verificar las dependencias de compilación. Vea más en sbuild en Debian wiki y ejemplo de configuración de sbuild en la "Guía para administradores de Debian".

| Sugerencia
El comando systemd-nspawn(1) ayuda a ejecutar un comando o SO en un contenedor ligero de forma similar a `chroot`. Es más potente ya que utiliza espacios de nombres para virtualizar completamente el árbol de procesos, IPC, nombre de host, nombre de dominio y, opcionalmente, bases de datos de red y de usuario. Ver systemd-nspawn.

### 9.11.5. Varios sistemas de escritorio

Si deseas probar un nuevo entorno de escritorio GUI de cualquier sistema operativo, te recomiendo que uses QEMU o KVM en un sistema Debian `stable` (estable) para ejecutar múltiples sistemas de escritorio de forma segura usando la virtualización. Esto te permite ejecutar cualquier aplicación de escritorio incluyendo las de Debian `unstable` (inestable) y `testing` (pruebas) sin los riesgos habituales asociados a ellas y sin reiniciar.

Dado que QEMU puro es muy lento, se recomienda acelerarlo con KVM cuando el sistema anfitrión lo soporte.

Gestor de máquinas virtuales también conocido como `virt-manager` es una práctica herramienta GUI para gestionar las máquinas virtuales KVM a través de libvirt.

La imagen de disco virtual «`virtdisk.qcow2`» que contiene una imagen del sistema Debian para QEMU se puede crear utilizando el instalador debian: en pequeños CDs como se muestra.

    $ wget https://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso
    $ qemu-img create -f qcow2 virtdisk.qcow2 5G
    $ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256
    ...

| Sugerencia
Ejecutar otra distribución GNU/Linux como Ubuntu y Fedora de forma virtualizada es un gran manera de aprender formas de configuración. También se pueden ejecutar correctamente SS.OO. propietarios virtualializado sobre GNU/Linux.

Ver más consejos en La Wikipedia de Debian: Virtualización del sistema.

[2] Ejemplos de personalización más elaborados: "Vim Galore", "sensible.vim", ...

[3] vim-pathogen fue popular.

Capítulo 8. I18N y L10N |  | Capítulo 10. Gestión de información