Así es como se hace. Esto funciona con rpi de 1ra, 2da y 3ra generación.
Separé el código en funciones de bash para que sea más legible, espero.
Puede que haya mount
/unmounts
innecesarios, pero la mayoría de las acciones de diskutil
resultan en que los volúmenes se monten automáticamente por MacOS, por lo que necesitamos desmontarlos antes de continuar, de lo contrario los comandos fallarán diciendo que el recurso está ocupado.
Necesitamos instalar algunas dependencias. Esta parte no está tan automatizada como me gustaría.
curl -OL https://raw.githubusercontent.com/yalp/homebrew-core/fuse-ext2/Formula/fuse-ext2.rb
Ahora edita ese archivo y añade después de la sección de caveat
:
patch do
url "https://github.com/alperakcan/fuse-ext2/files/2576060/0001-Fix-new-Xcode-compilation.patch.txt"
sha256 "a2a8ff14f36754aead1745b4b5f53b0333376d1bf6abe659ec4eacdbb232aceb"
end
Ahora instalamos las dependencias:
brew install \
findutils \
e2fsprogs \
pv
brew install --head ./fuse-ext2.rb
sudo cp -pR /usr/local/opt/fuse-ext2/System/Library/Filesystems/fuse-ext2.fs /Library/Filesystems/
sudo chown -R root:wheel /Library/Filesystems/fuse-ext2.fs
sudo cp -pR /usr/local/opt/fuse-ext2/System/Library/PreferencePanes/fuse-ext2.prefPane /Library/PreferencePanes/
sudo chown -R root:wheel /Library/PreferencePanes/fuse-ext2.prefPane
Finalmente, este es el script para formatear la tarjeta SD. Copia y pega este script, hazlo ejecutable chmod a+x FILE
y llámalo con dos argumentos DEVICE
y MODEL
.
El script es lo suficientemente inteligente como para proponerte los valores correctos para DEVICE y MODEL.
#!/bin/bash
function require_device() {
local device="$1"
local usage="$2"
local available_devices=$(get_available_devices)
if [ -z "$available_devices" ]; then
echo "$usage"
echo
echo "No se encontró ningún dispositivo compatible."
exit 1
fi
if [ -z "$device" ] || ! contains "$available_devices" "$device"; then
echo "$usage"
echo
echo "DEVICE debe ser uno de:"
echo "$available_devices"
exit 1
fi
echo "/dev/$device"
}
function get_available_devices() {
diskutil list external physical \
| grep /dev \
| cut -d" " -f1 \
| cut -d/ -f3
}
function require_model() {
local model="$1"
local usage="$2"
local available_models=$(echo -e "rpi\nrpi2\nrpi3")
if [ -z "$model" ] || ! contains "$available_models" "$model"; then
echo "$usage"
echo
echo "MODEL debe ser uno de:"
echo "$available_models"
exit 1
fi
echo "$model"
}
function get_arch_filename() {
local model="$1"
if [ "$model" = "rpi" ]; then
echo 'ArchLinuxARM-rpi-latest.tar.gz'
elif [ "$model" = "rpi2" ]; then
echo 'ArchLinuxARM-rpi-2-latest.tar.gz'
elif [ "$model" = "rpi3" ]; then
echo 'ArchLinuxARM-rpi-3-latest.tar.gz'
else
echo "Modelo no soportado $model"
exit 1
fi
}
function download_archlinux() {
local model="$1"
local filename="$2"
echo "Comprobando si necesitamos descargar la última iso de ArchLinuxARM"
curl --silent --location \
--output "new-md5-$model" \
"http://os.archlinuxarm.org/os/$filename.md5"
local current_md5="$(md5sum "$filename")"
echo "Md5 más reciente:" "$(cat "new-md5-$model")"
echo "Md5 actual:" "$current_md5"
if [ "$(cat "new-md5-$model")" != "$current_md5" ]; then
echo "Sí, descargando en segundo plano..."
(
if curl --silent --location \
--remote-name \
"http://os.archlinuxarm.org/os/$filename"; then
echoerr "Descarga finalizada."
else
echoerr "No se pudo descargar."
fi
)&
local process=$!
else
echo "No es necesario, continuando"
local process=0
fi
return "$process"
}
function wait_for_download() {
local process="$1"
if [ "$process" -ne 0 ]; then
echo "Esperando a que termine la descarga."
wait "$process" || exit 1
fi
}
function untar_and_copy_arch() {
local filename="$1"
local device_dir="$2"
echo 'Descomprimiendo en la root.'
if [ ! -f "$device_dir/root/root/.bootstrap" ]; then
sudo sh -c "pv $filename | bsdtar -xpf - -C $device_dir/root" \
&& sudo touch "$device_dir/root/root/.bootstrap"
fi
sudo mv "$device_dir"/root/boot/* "$device_dir"/boot
echo 'Ejecutando sync, puede llevar unos minutos...'
sync
}
function umount_device() {
local tmp_dir="$1"
local device="$2"
diskutil unmountDisk "$device"
if mount | grep "$tmp_dir/root" > /dev/null \
|| mount | grep "${device}s2" > /dev/null; then
echoerr "Desmontando la root montada."
sudo umount "$p2"
fi
}
function mount_device() {
local tmp_dir="$1"
local device="$2"
echo "Montando la root y el boot de $device en $tmp_dir"
mkdir -p "$tmp_dir/root" "$tmp_dir/boot" || exit 1
sudo diskutil mount -mountPoint "$tmp_dir/boot" "${device}s2" || exit 1
sudo fuse-ext2 "${device}s2" "$tmp_dir/root" -o rw+ || exit 1
}
uso="$0 DEVICE MODELO"
dispositivo="$(require_device "$1" "$uso")" || exit 1
dispositivo_raíz="$("${device}s2")"
modelo="$(require_model "$2" "$uso")" || exit 1
filename="$(get_arch_filename "$modelo")"
download_archlinux "$modelo" "$filename"
proceso="$?"
umount_device "$tmp_dir" "$dispositivo"
diskutil partitionDisk "$dispositivo" 2 MBR \
"MS-DOS FAT32" BOOT 100M \
"MS-DOS FAT32" ROOT R \
|| exit 1
umount_device "$tmp_dir" "$dispositivo"
format_ext4 "$dispositivo_raíz" ROOT || exit 1
wait_for_download "$proceso"
sleep 3
umount_device "$tmp_dir" "$dispositivo"
mount_device "$tmp_dir" "$dispositivo"
untar_and_copy_arch "$filename" "$tmp_dir"
umount_device "$tmp_dir" "$dispositivo"
0 votos
¿Hay disponible una imagen .iso de ArchLinux para la plataforma que necesitas? ¡Haría las cosas mucho más fáciles :-)
0 votos
Intenté buscar uno y no encontré ninguno, pero también obtuve muchos resultados de búsqueda espurios. Encontré un hilo de discusión en un foro (archlinuxarm.org/forum/viewtopic.php?f=47&t=7996) de hace unos años que hacía referencia a descargar un ISO para una plataforma diferente, pero el enlace al que lleva (archlinuxarm.org/platforms/armv7/samsung/…) ya no tiene un ISO.
0 votos
Su enlace es para procesadores de arquitectura ARM. Los Mac utilizan procesadores Intel que tienen una arquitectura x64. ¿Estás seguro de que no querías decir este sitio web?
1 votos
@davidanderson Supongo que el OP quiere usar una Mac para crear una imagen de arranque para un dispositivo ARM en una tarjeta SD.
0 votos
@patrix: Lo descifré. Actualmente estoy ingresando al procedimiento.
0 votos
Sí, @patrix tiene razón. Quería usar macOS para crear una imagen de arranque para un dispositivo ARM en una tarjeta SD.