.png)
el lector de tarjetas de mi computadora portátil no quiere funcionar. ¿Puedo usar dd (o alguna otra herramienta) para escribir una imagen en un disco en red?
Estoy intentando reemplazar una distribución Raspberry Pi por otra. La tarjeta SD tiene 6gb libres y usa solo 2gb.
desde la tarjeta SD
$ sudo parted -l
Model: SD SU08G (sd/mmc)
Disk /dev/mmcblk0: 7948MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 95.4MB 94.4MB primary fat16 lba
2 95.4MB 1878MB 1783MB extended
5 96.5MB 1878MB 1782MB logical ext4
3 1878MB 7948MB 6070MB primary ext4
YPor favor, antes de que critiques por qué quiero hacer esto, responde la pregunta... luego dime lo estúpido que soy.
Respuesta1
Puedes canalizar a través de SSH:
dd if=something | ssh host dd of=something
Pero debería tener una mejor razón para usarlo dd
que una simple operación de copia de archivos en la que estará mejor con scp
, rsync
y similares.
Respuesta2
Suponiendo que tiene un servidor SSH en su Raspberry y la tarjeta SD de la Raspberry aparece en /dev/sda
, haría algo como esto:
dd if=SDcardimage.img | ssh -o MACs=hmac-ripemd160 -l raspberry-pi-user <your Raspberry's IP address> 'dd of=/dev/sda'
Yo explico:
dd
genera salida estándar cuando noof
se especifica ningún archivo de salida y lee desde la entrada estándar cuando no se especifica ningún archivo de entrada enif
.- Cuando pasa directamente un comando a SSH, su cliente reenviará su entrada estándar al servidor, y luego el servidor pasa esos datos a la entrada estándar del proceso especificado en el comando enviado al servidor.
- Debido a que la entrada estándar del cliente SSH en este caso proviene de
dd
, y la entrada estándar del control remotodd
proviene del servidor SSH, esto dará como resultado que el par cliente-servidor SSH actuará como un transporte de datos cifrados, uniendo la salida estándar de su localdd
a la entrada estándar de su control remotodd
. (De hecho, así es como SSH realiza el inicio de sesión remoto, con la entrada estándar proveniente de su teclado y el proceso remoto que recibe la entrada estándar siendo un shell UNIX). - La
MACs
opción que paso a SSH obliga a la conexión a utilizar el algoritmo RIPEMD160 como resumen de integridad del mensaje. Hacer esto protege los datos transportados para que se detecte cualquier error de transmisión o manipulación intencional. Esto es importante aquí considerando que estás transmitiendo una imagen de disco usando ondas de radio. Es posible que desee agregaro Ciphers=aes256-cbc
oo Ciphers=aes256-ctr
forzar el cifrado en caso de que Raspberry realice un cifrado más débil de forma predeterminada. -l
indica el usuario que estás usando para iniciar sesión simplemente porque tiendo a usar esa sintaxis.
Respuesta3
Actualizar el sistema en ejecución para que la nueva imagen raíz se utilice en el próximo reinicio es un poco más complicado que simplemente hacer una copia directa a través de la red. Suponiendo que la imagen raíz está activada /dev/mmcblk0p5
(como lo indican el resultado parted -l
y los comentarios anteriores), el OP debería poder copiar la partición raíz de la imagen /dev/mmcblk0p3
sin ningún problema (siempre que, por supuesto, no tenga ningún dato que pueda desea mantener en esta partición). Puedes seguir las instrucciones a continuación.Sin embargo, asegúrese de realizar las comprobaciones sugeridas y cambiar los comandos según corresponda; copiar ciegamente los comandos a continuación es una buena manera de mejorar su sistema.
Asumiré que la partición raíz de la nueva imagen es la partición 5, aunque puede que no lo sea. Puedes imprimir la tabla de particiones de una imagen llamada
pi.img
conparted pi.image print
. Si no está seguro, agregue el resultado a su pregunta.Dado que solo buscamos copiar la imagen de la partición raíz y no la imagen completa del disco (que también contendrá su propia tabla de particiones y partición de inicio), debe separar esto del resto de la imagen. Una forma de hacer esto (en un sistema Linux) es usando
kpartx
:sudo kpartx -av pi.img
Si no hay otros dispositivos de bucle en uso, se utilizará
loop0
; sin embargo, verifique la salida y cambie los comandos adicionales en consecuencia.Asegúrese de que la partición de destino no esté montada en la Raspberry Pi haciendo:
sudo umount /dev/mmcblk0p3
Para el siguiente paso, debe poder canalizar datos a través de ssh.ytener acceso root. Hay algunas formas de hacer esto, pero creo que la más sencilla es simplemente habilitar el inicio de sesión de root. Por lo general, no se recomienda esto, pero como desea cargar una nueva imagen del sistema, no creo que sea un problema. En la Raspberry Pi haz:
sudo passwd root
Luego copie la imagen a la Raspberry Pi (usandoLa sugerencia de RAAK para la integridad de los datos):
sudo dd if=/dev/mapper/loop0p5 | ssh -o MACs=hmac-ripemd160 root@host dd of=/dev/mmcblk0p3
host
puede ser lo que sea que esté en/etc/hostname
la Raspberry Pi (aparentementemypi
para el OP) o la dirección IP de la Raspberry Pi. También recuerde cambiar esto en consecuencia si no está utilizandoloop0
.A continuación, cambie la partición raíz de Raspberry Pi. Por lo que puedo ver (no tengo una Raspberry Pi para probar), debe cambiarla
/boot/cmdline.txt
. Cambiarías la parte que diceroot=/dev/mmcblk0p5
aroot=/dev/mmcblk0p3
.Puede eliminar los dispositivos
loop
ymapper
en el sistema desde el que copió haciendo lo siguiente:sudo kpartx -d pi.img
¡Ahora reinicia la Raspberry Pi y deberías estar usando la nueva imagen!
Respuesta4
¿Qué sucede si inicia Pi usando una imagen USB ARM, se conecta a la red y de esta manera el almacenamiento será lo suficientemente domesticado? No soy un profesional, solo escupo pelotas aquí. Expertos, corrijan si me equivoco.