viernes, 25 de abril de 2014

Raspberry Pi: Arranque desde USB

Raspberry Pi: Arranque desde USB

O como pasar nuestro arranque a disco USB

He encontrado este tutorial que me parece de lo mas completo e iré traduciéndolo para aquellos de vosotros que no os manejéis bien con el inglés.
En el artículo se habla de una nueva instalación pero nos da las pistas necesarias para pasar los datos de una Pi en la que usamos la SD a un disco USB para arrancar luego desde él con rsync o clonar esa configuración que tenemos tan pulida a otro disco para no tener que repetir tanta actualización y configuración en nuestro segundo, tercero, cuarto... PI.
También muestra como identificar la partición correcta de arranque cuando tenemos varios discos usb conectados al Pi.
Antes de nada, agradezcamos su trabajo al autor visitando su foro en el que encontrareis otras cosas tan interesantes y bien explicadadas como esto. 

root on usb drive

Postby Richard-TX » Wed Apr 16, 2014 7:15 am
Empezaremos con una nueva tarjeta SD y un nuevo disco USB.
El tamaño y velocidad del la Sd no importa, cualquier tarjeta de 2 gigas nos valdrá (tiene que ser de dos gigas porque vamos a cargar un Debian completo en ella).
El tamaño del disco o pincho USB depende de tus aplicaciones, cualquiera de al menos 2 Gb valdrá. La velocidad importa un poco más aquí, pero no vamos a discutirlo ahora, lo dejamos para otra discusión.
En esta descripción usaré una micro SDHC de 4 Gigas clase 10 porque uso las tarjetas para otras aplicaciones así como tampoco me gustan las SD que sobresalen del raspberry (ya he roto un adaptador de SD o zócalo). También uso un micro disco USB de 8 Gb.
Primero de todo necesitas cargar la imagen del Wheezy Raspbian en la SD (yo usé la imagen del 09-02-2013). Hay mas que suficientes procedimientos y tutoriales de como hacerlo. Yo lo hago con win32disimager en mi portátil con W7.
Una vez conseguido, puedes ponerlos en tu Pi y arrancar.
Si usas la conexión de red Ethernet, ya estas listo. Si lo haces con un Pi sin monitor conectado a WIFI deberás configurarlo primero, como dijimos antes, hay muchos modos y tutoriales de como configurar tu cacharro partículas. Yo uso un adaptador EDIMAX. Obviamente, uso ssh, pero eso no importa mucho.

Antes de nada, debes ejecutar raspi-config con:
sudo raspi-config

sudo raspi-config


Pero SOLO configura lo siguiente:

Configurar el teclado (no es necesario si lo haces en remoto)
Cambiar la clave (puedes dejarlo para luego)
Cambiar la configuración del locale para ponerlo en español (más bonito).
Cambiar la zona horaria.
Ajustar el tamaño de memoria que dejaremos a la GPU (para un raspberry que no se va a conectar a ningún monitor, con 16 megas sobra).
No hagas una actualización en este momento (update ni upgrade) para no llenar la SD de basura que ahora nos conviene evitar.

Después de un reinicio se cargan los nuevos parámetro y estamos listos.
Comprueba el sistema de ficheros:


pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          1.8G  1.4G  247M  86% /
/dev/root       1.8G  1.4G  247M  86% /
devtmpfs        235M     0  235M   0% /dev
tmpfs            49M  248K   49M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            98M     0   98M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  34% /boot
pi@raspberrypi ~ $

Notarás que aunque use una SD de 8 Gigas, el tamaño por defecto es 1,8 porque no hemos expandido la partición raíz (rootfs).
La entrada /dev/mmcblk0p1 es la partición de arranque en el dispositivo mmcblk0 que es la tarjeta SD.

La partición de arranque será la única parte de la tarjeta SD que usaremos una vez hayamos  terminado el proceso y eso es por el particular proceso que sigue la Pi en el arranque. Y es que es el chip  gráfico el primero que arranca cargando los datos de aquí a la memoria de la CPU y arrancándola para que continúe ejecutando este arranque y tome el control.

Ahora conecta el disco USB si es que aún no lo has hecho (lo llamaré disco a partir de ahora)
Comprueba que lo ha reconocido:


pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 006: ID 8644:800b
pi@raspberrypi ~ $
Device 006 es el adaptador USB. El ID muestra un identificador único del fabricante
También comprueba que el sistema operativo ha reconocido el dispositivo (también puedes hacerlo con dmesg).
 
pi@raspberrypi ~ $ tail /var/log/messages
May 18 11:44:31 raspberrypi kernel: [   64.093866] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
May 18 11:44:31 raspberrypi kernel: [   64.093883] usb 1-1.3: Product: Intenso Micro Line
May 18 11:44:31 raspberrypi kernel: [   64.093898] usb 1-1.3: Manufacturer: Intenso
May 18 11:44:31 raspberrypi kernel: [   64.093912] usb 1-1.3: SerialNumber: 12390000000004E2
May 18 11:44:31 raspberrypi kernel: [   64.112228] scsi1 : usb-storage 1-1.3:1.0
May 18 11:44:32 raspberrypi kernel: [   65.113335] scsi 1:0:0:0: Direct-Access     Intenso  Micro Line       1.01 PQ: 0 ANSI: 2
May 18 11:44:32 raspberrypi kernel: [   65.114862] sd 1:0:0:0: [sda] 15669248 512-byte logical blocks: (8.02 GB/7.47 GiB)
May 18 11:44:32 raspberrypi kernel: [   65.115607] sd 1:0:0:0: [sda] Write Protect is off
May 18 11:44:32 raspberrypi kernel: [   65.126062]  sda: sda1
May 18 11:44:32 raspberrypi kernel: [   65.129907] sd 1:0:0:0: [sda] Attached SCSI removable disk
pi@raspberrypi ~ $
Si, el disco USB puede identificarse como /dev/sda.

No hay manera de saber que nombre asignará el sistema operativo al añadir discos adicionales. Si eso es lo que quieres, deberás seguir la versión extendida de este procedimiento que se encuentra a continuación de este.

Si lo que vas a usar es un solo disco USB, empieza aquí:

Crea un sistema de ficheros en el disco USB. Usa "p" para listar las particiones

pi@raspberrypi ~ $ sudo fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 8022 MB, 8022654976 bytes
94 heads, 14 sectors/track, 11906 cylinders, total 15669248 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1              32    15669247     7834608    b  W95 FAT32

Command (m for help):
Hay una partición formateada para Windows. Necesitamos reformatear el disco para Linux.
Teclea "d" para borrar la(s) partición(es).
Nota
Si solo vas a usar el disco para contener la partición de Debian, adelante. Si tienes un disco grande o un disco duro USB, puedes considerar hacer una partición para Debian y otra u otras para cualquier otra cosa. Esto supera el objetivo de este artículo, pero estoy seguro de que puedes hacerte una idea.
Continuaremos con la solución simple, una partición.

Teclea "n" para crear una nueva partición (será la número 1) y usa toda la capacidad pulsando Enter en respuesta a las opciones hasta que termine.
 
Command (m for help): d
Selected partition 1

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-15669247, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-15669247, default 15669247):
Using default value 15669247

Command (m for help):
Ahora graba la información en el disco pulsando "w".


Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
pi@raspberrypi ~ $
Listo, así que ahora podemos formatear la partición:
 
pi@raspberrypi ~ $ sudo mke2fs -t ext4 -L rootfs /dev/sda1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=rootfs
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
490560 inodes, 1958652 blocks
97932 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2009071616
60 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

pi@raspberrypi ~ $
Y ahora deberemos montar la partición si queremos usarla y continuar con el procedimiento.
 
pi@raspberrypi ~ $ sudo mount /dev/sda1 /mnt
pi@raspberrypi ~ $
Veamos lo que por fín hemos conseguido:
 
pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          1.8G  1.4G  247M  86% /
/dev/root       1.8G  1.4G  247M  86% /
devtmpfs        235M     0  235M   0% /dev
tmpfs            49M  248K   49M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            98M     0   98M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  34% /boot
/dev/sda1       7.4G  145M  6.9G   3% /mnt
pi@raspberrypi ~ $
Hemos hecho accesible /dev/sda1 montándolo en el directorio /mnt, así que ahora podremos usarlo.

Para copiar (calcar) los datos de la partición /dev/root al nuevo disco, podemos usar dd, pero dd hace una copia bit a bit y dado que también copia el espacio vacío de la SD, es muy, muy lento.
La mejor manera es usar rsync. Instalémosla antes:
 
pi@raspberrypi ~ $ sudo apt-get install rsync
...
pi@raspberrypi ~ $
Y pongámosla a funcionar. Aunque es mucho más rápida, aún le llevará algún tiempo crear la imagen de la partición en el disco USB. Vamos a copiar todo desde el directorio principal "/" al nuevo disco montado en el directorio /mnt (que no es ni mas ni menos que /dev/sda1).
 
pi@raspberrypi ~ $ sudo rsync -axv / /mnt
...
En mi equipo tardó cerca de 15 minutos. Aseguraté de que no se interrumpe el proceso.
Si lo deseas, puedes abrir otra sesión ssh y continuar con el procedimiento, así no tendrás que esperar a que rsync termine.

Vamos a decirle a Pi, donde encontrar los nuevos datos cuanto arranque Debian.
El fichero que necesitamos cambiar es /boot/cmdline.txt
Antes de hacerlo vamos a crear una copia de seguridad por si queremos volver a como lo teníamos en caso de encontrar algún problema. Debes ser cuidadoso, si estropeas este fichero muy seguramente conseguirás que tu Pi no arranque y deberás empezar de nuevo recargando la imagen.

sudo cp /boot/cmdline.txt /boot/cmdline.orig
El contenido de este fichero es una línea de comando muy larga y necesitamos reemplazar la referencia a la partición de la SD (root=/dev/mmcblk0p2) a la nueva partición en el disco USB (root=/dev/sda1).

Aquí puedes ver el contenido original del fichero:
 
pi@raspberrypi ~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
pi@raspberrypi ~ $
Para estar seguro, hay un comando más que deberemos añadir. Durante el encendido y arranque, puede que a nuestro disco USB le lleve un poco de tiempo estar listo, algo más de lo que el sistema operativo espera. Si añadimos un retraso de 5 segundos, nuestro disco estará listo cuando se le llame.
Puede que no lo necesites o que con un valor inferior sea suficiente, tu sabrás cuan rápido es tu disco. Cuando mi sistema remoto tiene que reiniciarse, quiero estar seguro de que nada falla, unos pocos segundos de más no importan.

Con tu editor favorito, añade estos dos cambios. Yo usaré nano:
 
sudo nano /boot/cmdline.txt

Deberemos dejarlo como este:
 
pi@raspberrypi ~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait rootdelay=5
pi@raspberrypi ~ $
A continuación tenemos que hacer algunos cambios en fichero /etc/fstab que es la tabla de sistemas de ficheros que se montarán (OJO, en el disco USB, no en la SD).
 
sudo nano /mnt/etc/fstab
Añade la siguiente línea:
     /dev/sda1    /   ext4    defaults,noatime  0       1

Y marca la línea que hace referencia a la SD como un comentario con una almohadilla ("#"):
#/dev/mmcblk0p2  /               ext4    defaults,noatime       0       1

Debería quedarnos algo así:
 
proc            /proc           proc    defaults          0       0
/dev/sda1       /               ext4    defaults,noatime  0       1
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that

Esto es todo para la versión sencilla del procedimiento, ahora ya puedes reiniciar el sistema:
sudo reboot
Observa que ahora ya no verás mucha actividad en el LED ACT. Este LED solo indica la actividad de lectura y escritura sobre la SD.
Una vez que el Pi ha arrancado, comprueba el sistema de ficheros:
 
pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.4G  1.6G  5.5G  22% /
/dev/root       7.4G  1.6G  5.5G  22% /
devtmpfs        235M     0  235M   0% /dev
tmpfs            49M  248K   49M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            98M     0   98M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  34% /boot
pi@raspberrypi ~ $
Ahora la raíz "/" está en la partición del disco, fíjate en el tamaño de 7,5 Gigas.




Cambiando el tamaño de la partición SWAP

¿Queréis que siga traduciendo? ¿Os ha quedado claro hasta aquí?

No hay necesidad de enredarse  con las particiones swap en la Pi, están implementadas dirente a otros Linux. Raspbian usa dphys-swapfile, que es un sistema de de swap basado en fichero en vez de en particiones que es lo estandar en otras distribuciones. También resulta más facil cambiar su  tamaño sin tener que reparticionar el disco
There is no need to mess with swap partitions on the Pi, this is implemented differently from other Linux systems. Raspbian uses dphys-swapfile, which is a swap-file based solution instead of the "standard" swap-partition solution. It is also much easier to change the size of the swap.

Si necesitas cambiar el tamaño, hazlo así:
If you need to change the swap file size, proceed as follows:

Busca primero los datos de swap usando el comando:
Look at the swap data first by using the top command:
pi@raspberrypi ~ $ top
top - 13:28:20 up 3 min,  1 user,  load average: 0.18, 0.37, 0.18
Tasks:  66 total,   1 running,  65 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.0 sy,  0.0 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem:    497544 total,    55700 used,   441844 free,     5432 buffers
KiB Swap:   102396 total,        0 used,   102396 free,    27592 cached

102396 is 100MB of swap space

El fichero de configuración es: /etc/dphys.swapfile
The configuration file for the swap space is: /etc/dphys-swapfile

Su contenido es muy sencillo. Por defecto Raspbian tiene 100MB de espacio swap.
The content is very simple. By default Raspbian has 100MB of swap space:
 
pi@raspberrypi ~ $ cat /etc/dphys-swapfile
CONF_SWAPSIZE=100
pi@raspberrypi ~ $
Si quieres cambiar su tamaño, necesitas modificar el número y redimensionar y reiniciar  el servicio (demónio en linux) dphys-swapfile:
If you want to change the size, you need to modify the number and then resize and restart the dphys-swapfile:

 
pi@raspberrypi ~ $ sudo nano /etc/dphys-swapfile
pi@raspberrypi ~ $
Yo cambié el tamaño de 100 a 512MB, el tamaño total de mi RAM.
Despues de cambiar el tamaño en el ficherro ejecuta:
I changed the size from 100 MB to 512MB, the full amount of RAM.
After the parameter in the file has been changed run:
 
pi@raspberrypi ~ $ sudo dphys-swapfile setup
want /var/swap=512MByte, checking existing: deleting wrong size file (104857600), generating  swapfile ... of 512MBytes
pi@raspberrypi ~ $
Para cargar el nuevo tamaño, necesitamos parar el proceso swapfile:
To load the new size, we need to stop the swapfile process:
 
pi@raspberrypi ~ $ sudo /etc/init.d/dphys-swapfile stop
Stopping dphys-swapfile swapfile setup ..., done.
pi@raspberrypi ~ $
Y volverlo a iniciar:
And restart it:
 
pi@raspberrypi ~ $ sudo /etc/init.d/dphys-swapfile start
Starting dphys-swapfile swapfile setup ...
want /var/swap=512MByte, checking existing: keeping it
done.
pi@raspberrypi ~ $
Y ahora podemos volver a ver y comprobar que los cambios con top:
And now we can check it again with top:
 
top - 13:37:22 up 12 min,  1 user,  load average: 0.01, 0.08, 0.12
Tasks:  64 total,   1 running,  63 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    497544 total,    57016 used,   440528 free,     5556 buffers
KiB Swap:   524284 total,        0 used,   524284 free,    28604 cached
Hecho!
Ahora que todo funciona en el disco USB, es hora de actualizar Debian (mejor dicho Raspbian ;)):
Done!
Now that you have everything running on the USB stick, it's time to update and upgrade Debian:
 
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get autoremove
Y ya está...
And off you go...

Deshaciendo el camino, volver a usar la tarjeta SD.
Si alguna vez tienes problemas arrancando desde el disco USB, pueder volver a la configuración original del fichero /boot/cmdline.txt poniendo la tarjeta en otro pc, usando el explorador de ficheros para copiar el actual con otro nombre (por ejemplo: /boot/cmdline.usb) y copiando el fichero que guardamos en los pasos anteriores: /boot/cmdline.orgi a /boot/cmdline.txt (atención, cópialo, así tendrás siempre un original y asegurate de que a la copia la renombras como cmdline.txt y windows no hace una de las suyas llamándolo cmdline.txt.txt)
Si tu sistema aún arranca con el disco USB, tambíén puedes montar la partición de arranque de la SD y hacer los cambios desde Debian.
Changing the process back to the SD card
If you ever run into problems booting from the USB stick, you can try to move the original /boot/cmdline.txt back by putting the SD card back into your PC, and use the Filemanager to copy the file /boot/cmdline.txt to something else (/boot/cmdline.usb) and copy the name of /boot/cmdline.orig to /boot/cmdline.txt. (watch out: do not use rename, because Windows may rename the file called cmdline.txt to cmdline.txt.txt !)
If your system still works with the USB stick, you can also mount the windows partition on the SD card and make the changes to the cmdline files from within Debian.

De todas formas, recuerda que hemos modificado el fichero /etc/fstab en la SD y luego movido al disco USB. Necesitamos devolverlo a su estado original  antes de  reiniciar con la SD.
Si seguiste el procedimiento anterior, haz lo siguiente:
Before you do that however, remember that we modified the /etc/fstab file on the SD card and then moved it to the USB stick. We need to change the contends back on the SD card to the original settings before we can easily change the filesystem back to the SD card.
If you followed the procedure above, do the following:
 
pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.4G  2.5G  4.6G  36% /
/dev/root       7.4G  2.5G  4.6G  36% /
devtmpfs        235M     0  235M   0% /dev
tmpfs            49M  240K   49M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            98M     0   98M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  33% /boot
Usa el nombre del dispositivo sin la partición (mmcblk0 sin p1)
Use the device name without the partition (p1)
 
pi@raspberrypi ~ $ sudo fdisk /dev/mmcblk0

Command (m for help): p

Disk /dev/mmcblk0: 4035 MB, 4035969024 bytes
4 heads, 16 sectors/track, 123168 cylinders, total 7882752 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00014d34

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     7882751     3879936   83  Linux

Command (m for help): q
Ahora que sabemos cual es la partición de Linux, podemos montarla.
So now that we know what the Linux file system partition is (p2), we can mount it.
 
pi@raspberrypi ~ $ sudo mount /dev/mmcblk0p2 /mnt
Y comprobarlo
And check it
 
pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.4G  2.5G  4.6G  36% /
/dev/root       7.4G  2.5G  4.6G  36% /
devtmpfs        235M     0  235M   0% /dev
tmpfs            49M  240K   49M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            98M     0   98M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  33% /boot
/dev/mmcblk0p2  3.7G  1.7G  1.9G  47% /mnt
Vale, ahora podemos editar el fichero fstab de la SD para que aparezca de nuevo como la original.
OK, now we can edit the fstab file on the SD card so it looks like the original version again.
 
pi@raspberrypi ~ $ sudo nano /mnt/etc/fstab
Guardamos y comprobamos.
And check it.
 
pi@raspberrypi ~ $ sudo cat /mnt/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
#filesystem on USB stick

pi@raspberrypi ~ $

Con un poco de suerte, simplemente haciendo una copia del fichero /boot/cmdline apropiado de la SD deberías ser capaz de arrancar desde la SD o desde el disco USB, si no, hay suficiente información aquí para ayudarte, espero ;)
With a bit of luck, by just doing a copy of the right /boot/cmdline version on the Windows partition of the SD card, you will be able to change the booting process from the SD card. If not, there is enough information in this procedure to help you out I hope. ;)


Procedimiento extendido (¿?) JUGANDO A SER UNOS PROFESIONALES
Como necesitamos forzar a Debian a que arranque del disco USB correcto en el caso de tener conectados varios discos, necesitamos asignarles un identificador único antes que fiarnos de los nombres que el sistema les dá cómo /dev/sda o /dev/sdb.

Extended procedure:
Because we must force Debian to boot from the right USB device, we need to assign unique identifiers for the partition and the filesystem, rather than the names the system gives to the USB devices, like /dev/sda.

Asumo que después de leer lo anterior nos podemos poner un poco mas ¿tersos? (jajajaja, digamos serios, profesionales, arremangarnos, echarnos la manta a la cabeza, echar "pá lante" o como queráis).
En vez de usar la utilidad normal de fdisk, usaremos una versión más moderna: gdisk
Podemos instalarla con:
I'm assuming that after reading the above, we can be a little more terse.
Instead of using the standard fdisk command, we will use the more modern version gdisk.
We can install gdisk with:
 
sudo apt-get install gdisk
Empezamos a particionar con:
We start the partitioning with:
 
sudo gdisk /dev/sda
Y usamos la misma secuencia que con fdisk. Primero "d" para borrar, luego "n" para nueva y "w" para escribir. De nuevo aceptamos los parametros por defecto. Si quieres más particiones, este es el momento.
And we actually use the same sequence as with fdisk. First "d" for delete, then "n" for new and "w" to write it all out. Again use the defaults by hitting return. If you want more partitions, now is the time.

Cuando usas el comando "i" (de información), puedes ver los siguientes detalles:
When you use the "i" command (information), you can see the following details:
 
pi@raspberrypi ~ $ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.5

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): i
Using 1
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: 2C7FD5E5-5CC4-434C-BFF6-F45336F7140B
First sector: 2048 (at 1024.0 KiB)
Last sector: 15669214 (at 7.5 GiB)
Partition size: 15667167 sectors (7.5 GiB)
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

Command (? for help):

Eso es lo que necesitamos: Partition unique GUID: 2C7FD5E5-5CC4-434C-BFF6-F45336F7140B
Esta información (PARTUUID)  se debe poner en el fichero /boot/cmdline.txt like para que quede así:
And this is what we need: Partition unique GUID: 2C7FD5E5-5CC4-434C-BFF6-F45336F7140B
This information (PARTUUID) goes into the /boot/cmdline.txt like so:
 
pi@raspberrypi ~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=PARTUUID=2C7FD5E5-5CC4-434C-BFF6-F45336F7140B rootfstype=ext4 elevator=deadline rootwait rootdelay=5
pi@raspberrypi ~ $
¡No olvides poner el rootdelay! (algunos discos, especialmente los clasicos discos duros tardan unos segundos en estar listos para su uso después de proveerles de alimentación)
Don't forget to add the rootdelay!

Ahora continuamos con el formateo, montaje, instalación de rsync y duplicado:
We now continue with formatting, mounting, installing rsync and the mirroring:
 
sudo mke2fs -t ext4 -L rootfs /dev/sda1
sudo mount /dev/sda1 /mnt
sudo apt-get install rsync
sudo rsync -axv / /mnt
Ahora obtenemos el identificador único para el fichero fstab de la inforamación del disco:
Now we need to get a unique identifier for the fstab drive information:
 
pi@raspberrypi ~ $ sudo tune2fs -l /dev/sda1
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name:   rootfs
Last mounted on:          /
Filesystem UUID:          3d2cb3c9-7e2b-4255-ac63-863bd3ad7993
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
...
pi@raspberrypi ~ $
Ahí esta lo que necesitamos:  Filesystem UUID: 3d2cb3c9-7e2b-4255-ac63-863bd3ad7993
And this is what we need: Filesystem UUID: 3d2cb3c9-7e2b-4255-ac63-863bd3ad7993

El siguienta paso es añadir esta información en el fichero con la lista de particiones que se monotarán cuando arranquemos de este disco, así que modificaremos el fichero /etc/fstab que está en el disco USB. Añade la siguiente línea:
Next we can enter the information into the filesystem table, /etc/fstab (on the stick, not the SD card). Add the following line:
 
/dev/disk/by-uuid/3d2cb3c9-7e2b-4255-ac63-863bd3ad7993    /   ext4    defaults,noatime  0       1
Y pon un comentario delante de la linea que se refería a la partición de la SD:
And put a comment in front of the reference on the SD card:
 
#/dev/mmcblk0p2  /               ext4    defaults,noatime       0       1
Y ya está. Si has revisado todos los cambios (no confiundas el identificador único de la partición o GUID con el identificador único del sistema de ficheros.
And that's it. If you are done checking everything (don't mix up the partition GUID and the filesystem UUID!!!) , you can reboot now and check if all is well.
A divertitse
Have fun! :)