Resucitar una instalación Ubuntu (por poner un ejemplo)

En una entrada previa mencionaba como salir del paso para arrancar desde un USB que se pone cabrero ya porque el BIOS del equipo está en nuestra contra o las fuerzas naturales se concentran para fastidiarnos el día.

Allí me dejaba el sabor de que estaba incompleto, y aquí doy algunos consejos y recomendaciones para que todo el proceso de recuperación sea transparente para el usuario (o nosotros) ante un desastre…

Contexto

Cualquier instalación de linux que se ha echado a perder, cada distribución (que no esté basada en Debian, como Ubuntu) puede rescatarse con los comandos pertenecientes a ella.

Otra observación importante es que el disco de la instalación actual esté funcionando y con “buena salud”, ya que tareas forenses para la recuperación de datos son ajenas a este artículo…

Supongo que es un buen momento, también, para reconocer que tener la carpeta home en otro disco no sólo es una buena idea, sino que puede evitarnos llamar a urgencias cardíacas ante un escenario similar. Ya verán porqué.

Preparación

Si no se tiene, es un buen momento para colocar un disco rígido que utilizaremos como home, o de mínima que tenga la suficiente capacidad para alojar la totalidad de la carpeta homeetc y cualquier otra (u archivos) que deseen poner a salvo.

Insisto en la observación que me ocuparé de un caso general, y cada uno debería tomar los recaudos de su caso particular. A los efectos prácticos, lo que se cubre aquí es efectivo en el 99% de las situaciones. Si, lo sé… También soy parte del 1% que no le funciona (llanto).

Este disco, de ahora en más llamado DATOS, debería estar formateado como EXT4 si se va a dejar como home.

El disco del equipo, de ahora en más lo llamaré DISCOACTUAL.

Arrancar con un livecd o livestick el equipo a recuperar. Recuerdo que hablo desde Ubuntu, por lo que algunas partes, con certeza, pueden variar de distribución en distribución.

Al arrancar nos ofrece elegir el idioma, y luego presionar sobre “Probar Ubuntu”. Esperar que levante la imagen, y cuando se muestre el escritorio, estamos listos para empezar.

Montando discos

Es un buen momento para pasarse por la aplicación que trae Ubuntu para administrar los discos. Su nombre es Disks y su ícono es un disco rígido con una llave inglesa. Con ella podremos identificar fácilmente cada uno de los discos y sus particiones para utilizar luego. Tomar nota del nombre que tiene cada una tiene (/dev/sdxn, donde X es una letra y N un número). Sino más adelante explico cómo identificarlos.

Ya en el escritorio, “montar” el disco DATOS, que se encontrará en la ruta /media/ubuntu/DATOS (o la etiqueta que tenga el disco al haberlo formateado). Se logra haciendo un click en el ícono de disco de la barra lateral de Ubuntu.

Finalmente, montamos el disco que veníamos utilizando. Supongamos que se llame DISCOACTUAL, lo encontraremos en /media/ubuntu/DISCOACTUAL. En caso que no tenga nombre, lo montará con el UUID (Universally Unique IDentifier o Identificador Único Universal) que tiene un aspecto como este:
550e8400-e29b-41d4-a716-446655440000
(descarto que se enteraron que, en vuestro caso, será diferente).

En resumen: los dispositivos montados, en un live, se encuentran en /media/ubuntu; y, en el caso que las particiones o discos no tengan una etiqueta, se utilizará el UUID para identificarlos.

Copiando datos

Abrir una terminal o consola con ctrl+alt+t y allí escribir sudo su.

A partir de este momento, tendremos privilegios de superusuario o root, por lo tanto mucho cuidado con lo que se hará de ahora en más.

Las carpetas homeetc las copiaremos como root, y la “simple” razón es que de este modo se conservan los uidgid (user idgroup id, ambos números que veremos luego), aparte de los permisos octales de las carpetas y archivos.

# cp --preserve=all /media/ubuntu/DISCOACTUAL/home /media/DATOS -R

La carpeta home, sabiendo que seré OBVIO, contiene los archivos personales de cada usuario aparte de todas y cada una de las configuraciones, cachés y demás “menudencias” de las aplicaciones que usó y usa el usuario.

Para etc se procede del siguiente modo (el “\” que verán en la siguiente línea tiene como propósito indicarle a bash que al dar enter se continuará escribiendo, lo hago a los efectos que sea más sencillo leer los comandos que exceden el ancho de la pantalla):

# cp --preserve=all /media/ubuntu/DISCOACTUAL/etc \
/media/ubuntu/DATOS/etcViejo -R

En caso que utilizaran MySQL, es buena idea también poner a salvo los archivos de datos:

# cp --preserve=all /media/ubuntu/DISCOACTUAL/var/lib/mysql \
/media/ubuntu/DATOS/mysqlViejo -R

Doy por descartado que en algún momento guardaron la lista de lo instalado con esta orden:

dpkg --get-selections > paquetesInstalados.log

¿Cómo que no lo hicieron?… Ok, desde un livecd se procede así:

Abrimos una terminal, si no la tuviéramos abierta (debería estarlo, si llegaron paso a paso por aquí), y obtenemos privilegios de superusuario:

$ sudo su
#

Le indicamos que nos abra un nuevo shell con otra raíz (nótese el cambio del prompt para saber dónde se está parado):

[email protected]:/home/ubuntu# chroot /media/ubuntu/DISCOACTUAL
[email protected]:/#

Y guardamos la lista de paquetes instalados manualmente:

[email protected]:/# dpkg --get-selections > paquetesInstalados.log
[email protected]:/# exit

Con exit volvemos a la raíz del live. A continuación, copiamos la lista recién obtenida para utilizarla luego:

# cp /media/ubuntu/DISCOACTUAL/paquetesInstalados.log \
/media/ubuntu/DATOS/.

Listo, salimos de la terminal escribiendo exit y presionando enter hasta que se cierre. Un método más práctico es presionar ctrl+d tantas veces como sea necesario… Pero, va en gustos.

Repasemos:

  • copiamos el contenido de la carpeta home, y etc (incluímos los de mysql de ser necesario) del disco que veníamos utilizando a su nuevo destino preservando sus uidgid y permisos;
  • adicionalmente, obtuvimos el listado de paquetes instalados a lo largo del tiempo de uso.

Verificamos lo anterior, que tenemos todo a resguardo en otro disco y una vez confirmado, procederemos a instalar Ubuntu siguiendo los pasos usuales.

IMPORTANTE: al momento de elegir el disco donde se instalará nuevamente Ubuntu, estar muy atento a indicar el que veníamos utilizando (DISCOACTUAL) y no el que contiene nuestra copia de respaldo (DATOS). Acá es útil haber utilizado la aplicación Disks para identificarlos por su dirección /dev/sdaxn, como vimos antes.

Si se tuvieran dudas, es preferible apagar el equipo y desconectar el disco que contiene los datos y, al terminar la instalación, volver a conectarlo para continuar con esta guía.

Otro punto a destacar es utilizar el mismo nombre de usuario administrador y de equipo (el que pide al principio la instalación) para conservar así su configuración, sino cambiarlo luego será más complejo, pero para nada imposible.

Restaurando la instalación

Al finalizar la instalación, pedirá que retiremos lo que utilizamos para ella (CD, DVD o dispositivo USB) y procederá a reiniciar el equipo. Si desconectamos el disco que tiene nuestros DATOS resguardados, es ahora cuando hay que volver a conectarlo antes de encender el equipo.

Empezamos a “reconstruir” nuestro sistema.

Resucitando Usuarios, Claves y Grupos

Es el momento de echar mano a lo “rescatado” del etc anterior. En el siguiente ejemplo, supongo este escenario:

  • En la instalación se creo el usuario administrador,
  • El equipo se lo nombró como miPC,
  • Y en la instalación anterior existían otros dos usuarios (aparte de administrador): Miguel y Pablo.
  • En lo que respecta de la clave para las operaciones con sudo, es la que se indicó en la instalación; ya que hasta que no se le indique otros, para Ubuntu, el usuario creado en la instalación es el único que puede ejecutar sudo y éste, según el escenario planteado, es administrador.

Como primer paso, montaremos la partición DATOS tal como hicimos cuando utilizábamos el live al inicio: click en el ícono correspondiente de la barra lateral de Ubuntu. Ahora, para acceder a ellos, la ruta será /media/administrador/DATOS.

En Ubuntu, los usuarios creados (el administrador y subsiguientes) tienen un uidgid que coinciden y son iguales o mayores a 1000; excepto algunos creados por determinados procesos o paquetes cuyo gid coincide con 65534, que es un grupo especial y pertenece al usuario nobody.

Necesitaremos de aquel 3 archivos: passwdshadowgroup. Procedemos del siguiente modo, observando las diferencias pertinentes, consiste en lo siguiente:

Nos convertimos en superusuario:

[email protected]:~$ sudo su
[sudo] password for administrador:

Resguardar el archivo nuevo y limpio, por si nos equivocamos:

# cd /etc
/etc# cp passwd passwd.bkp
/etc# cp shadow shadow.bkp
/etc# cp group group.bkp

Alterar el archivo en cuestión con la información que tenemos de la instalación anterior, procederemos así:

Con lo siguiente listaremos los usuarios mayores a 1000 (administrador), cuyo grupo sea el propio, que teníamos en la instalación anterior:

# cd /media/administrador/DATOS/etcViejo
etcViejo# awk -v UID=1000 -F: '($3>UID) && ($3!=65534)' passwd
miguel:x:1001:1001:Miguel,,,,:/home/miguel:/bin/bash
pablo:x:1003:1003:Pablo,,,:/home/pablo:/bin/bash

Habiendo verificado que es correcto, lo copiamos en passwd nuevo:

etcViejo# awk -v UID=1000 -F: '($3>UID) && ($3!=65534)' \
passwd >> /etc/passwd

IMPORTANTE: utilizar >> para que la salida anterior se AGREGUE al archivo y no lo reemplace.

Hacemos lo propio con group y shadow, éste último es algo más complejo (la salida de shadow se ha modificado para su mejor legibilidad dado que luego de $6$ continúa una serie de caracteres que es la clave del usuario cifrada):

etcViejo# awk -v UID=1000 -F: '($3>UID) && ($3!=65534)' group
miguel:x:1001:
pablo:x:1003:

etcViejo# awk -v UID=1000 -F: '($3>UID) && ($3!=65534)' \
group >> /etc/group

etcViejo# awk -v UID=1000 -F: '($3>UID) && ($3!=65534) {print $1}' \
passwd | tee - | egrep -f - shadow
miguel:$6$.../:15439:0:99999:7:::
pablo:$6$...:15357:0:99999:7:::

etcViejo# awk -v UID=1000 -F: '($3>UID) && ($3!=65534) {print $1}' \
passwd | tee - | egrep -f - shadow >> /etc/shadow

Puede resultarles interesante copiar (por ejemplo) el contenido de la carpeta /etcViejo/ssh (de la instalación anterior), en particular los archivos sshd_config y los ssh_host* para conservar la configuración del demonio del OpenSSH y las claves generadas para no perder acceso a locaciones remotas ni tener que volver a pasar las nuevas, entre otras incomodidades.

Y así como hacemos con la configuración de OpenSSH, se puede repetir con otras que necesite cada caso particular. Entre otras observables: la de MySQL, el archivo /etc/sudoers y su carpeta /etc/sudoers.d para indicar otros usuarios que pueden ejecutar sudo entre otras configuraciones….

Si resguardamos los archivos de MySQL, los restauramos de este modo:

# cp --preserve=all /home/mysqlViejo /var/lib/mysql -R

Otra consideración a tener en cuenta son los orígenes de paquetes, alojados en los archivos /etcViejo/apt/sources.list y los contenidos en /etcViejo/apt/sources.list.d/. Ellos podrán ser consultados al terminar este proceso y, antes de reinstalar los paquetes previamente listados y guardados, volver a configurar los repositorios para su uso.

Indicando el nuevo home

Es momento de editar un archivo “ilustre y desconocido”: fstab

En él se indica los dispositivos a montar en nuestra estructura de directorios.

Para eso necesitaremos conocer el UUID del disco que contiene la copia de home realizada previamente y, el del futuro swap en caso de haber decidido utilizar otra partición.

Lo averiguamos de este modo (supongo que seguimos siendo superusuario, sino volver a serlo):

# ls -go /dev/disk/by-uuid/
total 0
drwxr-xr-x 2 100 jun 15 15:15 ./
drwxr-xr-x 6 120 jun 15 15:15 ../
lrwxrwxrwx 1  10 jun 15 15:15 1508795f-173c-4f36-8255-7f77d8dbed4a -> ../../sdb1
lrwxrwxrwx 1  10 jun 15 15:15 3ec742c5-1fdc-4028-ac8a-83fccaad50a3 -> ../../sda1
lrwxrwxrwx 1  10 jun 15 15:15 efa58117-995b-4381-be70-fe2d83ef1607 -> ../../sda5

Si previamente tomamos nota de la ubicación de cada partición dentro de /dev será sencillo tomar nota del UUID que necesitamos. Sino, bueno, echemos un poco de luz consultando uno a uno:

# blkid /dev/sda1
/dev/sda1: UUID="3ec742c5-1fdc-4028-ac8a-83fccaad50a3" TYPE="ext4" PARTUUID="89d6addc-01"
# blkid /dev/sda5
/dev/sda5: UUID="efa58117-995b-4381-be70-fe2d83ef1607" TYPE="swap" PARTUUID="89d6addc-05"
# blkid /dev/sdb1
/dev/sdb1: LABEL="DATOS" UUID="1508795f-173c-4f36-8255-7f77d8dbed4a" TYPE="ext4" PARTUUID="9465b211-01"

¡Listo! Ya sabemos el UUID de la partición que tiene nuestro home resguardado, la que tiene la etiqueta (label) “DATOS”.

A editar fstab:

# nano /etc/fstab

Y agregamos, al final, como se lee:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=3ec742c5-1fdc-4028-ac8a-83fccaad50a3 / ext4 errors=remount-ro 0 1
# swap was on /dev/sda5 during installation
UUID=efa58117-995b-4381-be70-fe2d83ef1607 none swap sw 0 0

#---- AGREGAR DESDE AQUÍ UTILIZANDO EL UUID CORRESPONDIENTE
# el home esta en /dev/sdb1
UUID=1508795f-173c-4f36-8255-7f77d8dbed4a /home ext4 defaults 0 2

Ya está casi todo listo: al reiniciar, la carpeta /home del disco de sistema (el que era DISCOACTUAL) será reemplazada por la partición que encontrará en el disco DATOS, como copiamos la información respectiva de los usuarios, sus grupos y claves; para cualquiera de ellos (y nosotros) será “transparente”.

La hora de la verdad: reiniciar.

Si todos los pasos se realizaron correctamente, en este momento nuestro sistema está utilizando la partición del disco agregado como home, y podemos verificarlo abriendo cualquier navegador de archivos (nautilus es por defecto en Ubuntu), subir un nivel y verificar que hay otras dos carpetas aparte de la de administrador: miguel y pablo. Ambas vuelven a indicar que pertenecen a sus propietarios originales (hasta antes, sólo indicaban números para usuario y grupo). Aparte del archivo paquetesInstalados.log, la carpeta etcViejomysqlViejo, si la hubiéramos resguardo.

Si no es así, a revisar los archivos log para entender que ocurrió y repasar lo realizado hasta aquí. No pasa nada, nada se ha perdido, pero hay algo mal que no se hizo bien.

Instalando los paquetes “adicionales”

Si efectivamente todo está como se supone que debe estar, continuamos al próximo paso: instalar lo que falta para que la recuperación sea completa. Pero, antes de continuar, pasarse por las conclusiones y leer mi punto de vista sobre este particular.

Tenemos un listado de lo instalado manualmente en la raíz de, lo que ahora, es home. Y en la carpeta /home/etcViejo/apt/sources.lists.d tenemos los orígenes (adicionales) que habíamos utilizado en la instalación anterior.

No habría inconveniente en copiarlos al nuevo /etc salvo por un detalle:

  • Si en la instalación anterior, teníamos la misma versión de la distribución (supongamos que era Ubuntu 16.04, cuyo nombre es Xenial), copiar directamente (previa copia, más vale prevenir):
[email protected]:~$ sudo su
[sudo] password for administrador: 
[email protected]:/home/administrador# cd /etc
[email protected]:/etc# mv apt apt.ori
[email protected]:/etc# cp --preserve=all /home/etcViejo/apt . -R
  • En caso que cambiemos de versión habrá que reemplazar el identificador. Supongamos que fuera Trusty (14.04) o Zesty (17.04), y ahora instalamos Xenial (16.04). Siempre en minúsculas, en todos y cada uno de los archivos sources.list y los contenidos en sources.lists.d habrá que reemplazar esos nombres por xenial. Y luego, ir refrescando las claves de cada repositorio…
    Lo tomaría con calma, e iría agregando uno a uno por los métodos usuales para no complicar las cosas y terminar con el riesgo de romper algo nuevamente.

Y actualizamos…

[email protected]:/etc# apt-get update

Con los repositorios ya ajustados y actualizados, procedemos a “importar” el listado de los paquetes que guardamos previamente,  de este modo

[email protected]:/etc# dpkg --set-selections < /home/packages
[email protected]:/etc# apt-get dselect-upgrade

Observar que puede haber errores: por dependencias no resueltas, paquetes que no existen porque no están disponibles para la versión que instalamos (si hicimos un upgrade downgrade)… En ese caso, habrá que ir resolviendo uno a uno los problemas.

Cuando todo esté en su lugar, ya podremos reiniciar y el equipo estará listo para ser utilizado.

Conclusiones

Tiempos
A pesar de parecer “largo”, lo que tomó más tiempo fueron la copia de la carpeta home y la instalación del sistema operativo (unos 20′ para la copia y unos 15′ para la instalación). Es decir que en una escasa hora el equipo estaría operativo. ¡Nada mal! ¿Eh?.

Esto se redujo pues los usuarios y grupos, como otras configuraciones que demandan tiempo, fueron rescatadas de la instalación anterior.

Paquetes
Respecto de las aplicaciones, he de confesar que si bien he respetado la parte de resguardar el listado de lo instalado, lo utilicé más como un “ayuda memoria” (por no utilizar otro término como chuletamachete).

Dado que las configuraciones de cada usuario están en su carpeta personal (rescatada) y la carpeta etc también la tenemos a salvo (etcViejo), “creo” que es una buena idea ir agregando lo que falte según se vaya necesitando; excepto, claro está, aquello que se necesite a diario (supongamos Chrome o VirtualBox, u otro paquete) y lo tenemos bien presente.

Si nos vimos en la necesidad de realizar una instalación desde cero, es probable que haya sido porque el equipo estaba lento, se “rompió” la instalación, llevaba ya varias actualizaciones de la distribución y se recomienda hacerlo cada tanto… En fin, sea la razón que fuere, hay una buena chance que heredemos algún problema si procedemos a copiar los repositorios y seleccionamos los paquetes previamente guardados.

Excepto que estén “experimentando”, sepan muy bien lo que se hace, estén atentos a los mínimos detalles o la instalación previa estuviera muy “afinada”, puede ahorrarnos un tiempo… Caso contrario, lo más sano, es agregar lo que haga falta según se necesite y evitar momentos de amargo desconcierto.

Comandos “raros” utilizados
chroot, awk, tee, egrep fueron utilizados y si algo me fastidia es que no expliquen para que sirven. Si, ya sé aquello de RTFM (Read The F*g Manual, lée el maldito manual); pero, ya que estamos, ¿por qué no poner una mínima idea? No lo hice “en línea” pero lo hago aquí:

chroot
Ejecuta un shell cambiando el directorio raíz al indicado, para él y los shell “hijos” que se invoquen. De esa manera, podremos realizar operaciones que de otro modo no podríamos, por ejemplo, recuperar la lista de lo instalado en otro disco.

[email protected]:/home/ubuntu# chroot /media/ubuntu/DISCOACTUAL

A partir de este momento, la carpeta raíz será /media/ubuntu/DISCOACTUAL, es decir, nosotros veremos:

[email protected]:/#

A partir de este momento, todas las operaciones que necesiten acceder a la estructura del disco, tomarán a /media/ubuntu/DISCOACTUAL como nivel superior. Por ejemplo, dpkg buscará dentro de ella y no dentro de la estructura montada por la versión live en uso.

awk: este “comando” en realidad es un intérprete (un enlace a mawk), al cual le hemos pasado como parámetros, las acciones a realizar sobre el archivo indicado.
En este artículo, se lo utilizó del siguiente modo (tomo el caso más completo)

awk -v UID=1000 -F: '($3>UID) && ($3!=65534) {print $1}' archivo

-v UID=1000 definir la variable UID con el valor de 1000,
-F: el separador de campos es el “:”,
'($3>UID) && ($3!=65534) {print $1}' si el 3er campo de cada línea/registro es mayor  a UID (1000) y diferente al valor 65534, imprime el valor del campo,
archivo el nombre del archivo a procesar

En los casos de los archivos passwdgroup se necesitaban las líneas completas cuyo UID fuera mayor que 1000 y diferente de 65534, en el caso de shadow se necesitaban los nombres de los usuarios que satisfacen esa condición para buscarlos en dicho archivo, por tal motivo se buscan en ṕasswd para luego procesar shadow.

tee: es un comando que se encarga de “leer” el standard output (la pantalla, en nuestro caso) y alimentar el standard input de otro proceso y/o guardarlo en un archivo.

awk -v UID=1000 -F: '($3>UID) && ($3!=65534) {print $1}' passwd \
| tee - | egrep -f - shadow >> /etc/shadow

Aquí se utilizó para que la salida de awk pase al siguiente comando (egrep); esa salida es el primer campo de cada registro, el nombre del usuario como explicara antes. ¿Y el guión? Sirve para indicar que no hay un archivo de destino, y sólo debe alimentar al standard input.

egrep: es lo mismo que grep -E y se utiliza para buscar coincidencias con una expresión regular provista.

awk -v UID=1000 -F: '($3>UID) && ($3!=65534) {print $1}' passwd \
| tee - \
| egrep -f - shadow >> /etc/shadow

En este caso, se utilizó para buscar las líneas que contienen los nombres de los usuarios que awk halló, y tee está transfiriendo. Con el parámetro F que le indica que el contenido del archivo indicado, shadow, sea considerado como texto plano y evitar que interprete los caracteres de su contenido como los especiales utilizados en las expresiones regulares. El guión que aparece solitario será reemplazado por lo ofrecido por tee.

¿Se puede hacer lo mismo con otras carpetas como se hizo con home?
Confieso que mi objetivo, en un principio, era “relocalizar” la carpeta /etc y la partición swap. Pero desistí por estas razones:

  • swap: una búsqueda rápida con Google mostrará tropecientas notas al respecto, casi diría que en ciertos contextos de antaño (cuando los discos y las memorias eran prohibitivos) era de libro ponerlo en práctica. Hoy en día, la mayoría de las veces, el swap viene apagado por defecto. Por lo tanto, lo dejo como tarea para el curioso y/o exquisito.
  • etc: bueno, aquí si me di las narices contra mi propia ambición. Al pensar en escribir esta entrada, me dije: “ya que muevo home, ¿por qué no mover etc? ¡Claro! No habría de preocuparme por las configuraciones ante un desastre“. Y no fué hasta el momento que explicaba lo de fstab que me di cuenta de un pequeño detalle: ¿Cuándo se entera el proceso de arranque que el fstab a tener en cuenta está en otro lugar y no dentro del etc que está utilizando para arrancar?. Peor aún, ¿cuándo se entera el proceso general de arranque que debe utilizar otra carpeta etc que no está en la carpeta raíz?. Si bien es posible y luego de haber leído cómo se logra, prefiero crear una tarea programada que haga una copia de resguardo de etc, y quedarme tranquilo que ante un eventual desastre estará a salvo.

Ventajas de home en otro disco

  • No perder nada en una nueva instalación, temor recurrente dado que las instalaciones (con el asistente) formatean por completo el disco. Especialmente útil para los distro hoppers.
  • Si bien actualmente es mínima la ganancia, se nota una mejora en la velocidad al abrir archivos por ser diferentes discos de dónde se leen los binarios (programas) y los archivos del usuario. Era más notable antaño, hoy casi ni se aprecia.
  • Si cambiamos de equipo o debe llevarse a laboratorio para su reparación, basta con conservar el disco promovido a home, no hace falta explicar mucho la ventaja de esto.

Respaldar MySQL
Reconozco que el respaldo de MySQL enunciado antes, no es el óptimo. Al menos no es el que se recomienda y se conoce como cold backup (resguardo en frío). Como esta guía es útil en un escenario donde el sistema operativo es inestable, impredecible o no funciona; es oportuno conocer esta técnica.

Caso contrario, si el sistema operativo aún fuera funcional y confiable, utilizar métodos menos “groseros” (mysqldumpphpmyadmin, etc) es lo recomendable…

Creo que no se me ha escapado nada… ¡Que lo disfruten!…

Esta entrada fue publicada en Instalar linux, Linux y etiquetada . Guarda el enlace permanente.

Deja un comentario