如何在macOS上为ArchLInux创建可启动驱动器?


4

我试图找出如何在Mac上创建archlinux可启动驱动器的相应说明。(我正在使用Micro SD转USB适配器。)我找到了关于分区闪存驱动器的这些说明,但我不确定如何应用它们,因为我试图“转换”成macOS术语的说明谈到部门,这比我以前工作的水平要低得多。明确地说,我的问题是:我如何使用macOS 10.12.6获得与使用macOS 10.12.6相同的内容?谢谢!


对于您需要的平台,是否有ArchLinux的.iso映像?会让事情变得更容易:-)
nohillside

我试着寻找一个并没有找到一个,但我也得到了很多虚假的搜索结果。几年前我找到了一个讨论论坛帖子(archlinuxarm.org/forum/viewtopic.php?f=47&t=7996),引用了为不同的平台下载ISO,但是它的链接(archlinuxarm.org/platforms / armv7 / samsung / ...)不再有ISO。
Don 01001100

您的链接适用于ARM体系结构处理器。Mac使用具有x64架构的英特尔处理器。你确定你不是指这个网站吗?
大卫安德森

1
@davidanderson我假设OP想要使用Mac为SD卡上的ARM设备创建启动映像。
nohillside

@patrix:我想出来了。我目前正在进入该程序。
大卫安德森

Answers:


4

macOS中没有命令格式化分区以使用linux文件系统。换句话说,Arch Linux mkfs.ext4命令没有等价物。这个问题有很多可能的解决方案。以下是一个这样的解决方案

我建议,完成可启动驱动器创建的最佳方法是在Mac上启动Arch Linux操作系统。这将允许您使用您提供的Web链接中显示的命令。Arch Linux的这个启动将通过1 GB或更大的闪存驱动器完成。使用闪存驱动器的优点是您不必在任何内部驱动器上安装Arch Linux。

创建Mac可启动Arch Linux闪存驱动器的手动方法

注意:您可以以下每个命令复制并粘贴到终端应用程序窗口中。这将减少键入的数量和类型错误的风险。

  1. 下载.iso文件。我选择下载的Mac兼容文件名为archlinux-2017.12.01-x86_64.iso。您可以在Arch Linux网站上找到此文件。此文件已下载到我的“下载”文件夹中。我会假设你也会这样做。
  2. 打开终端应用程序窗口。输入以下命令以导航到“Downloads”文件夹。

    cd  ~/Downloads
    
  3. 将此.iso文件转换为与闪存驱动器兼容的格式。以下命令完成此任务。

    hdiutil  convert  archlinux-2017.12.01-x86_64.iso  -format  UDRW  -o  target.img
    
  4. .dmg字符可被附加到输出的文件名。输入以下命令以检查是否发生了这种情况。

    ls  target.img.dmg
    

    如果target.img.dmg出现文件名,则输入下一个命令以重命名此文件。

    mv  -f  target.img.dmg  target.img
    
  5. 输入以下命令以获取驱动器的列表。

    ls  /dev  |  egrep  ^disk\\d+$
    
  6. 插入闪存驱动器。

  7. 再次输入以下命令以获取驱动器的列表。接下来,确定分配给闪存驱动器的标识符(例如,步骤5中未显示的标识符)

    ls  /dev  |  egrep  ^disk\\d+$
    

    注意:在后续步骤中,请diskN使用分配给闪存驱动器的标识符进行替换。

  8. 输入以下命令以卸载闪存驱动器。

    diskutil  unmountdisk  diskN
    

    注意:如果看到错误Unmount of diskN failed: at least one volume could not be unmounted,请打开“磁盘工具”应用程序并卸载卷(不要弹出)。

  9. 输入以下命令以复制target.img到闪存驱动器。

    sudo  dd  if=target.img  bs=1m  of=/dev/diskN
    

    请注意以下事项:

    • 此命令将要求您输入登录密码。
    • 要查看复制操作的进度,请在执行命令时按control+ T键。
    • 使用/dev/rdisk而不是/dev/disk更快。
    • 如果看到错误dd: Invalid number '1m',则表示您正在使用GNU dd命令。使用相同的命令但替换bs=1mbs=1M
    • 如果看到错误dd: /dev/diskN: Resource busy,请确保未使用该驱动器。打开“磁盘工具”应用程序并卸载卷(不弹出)。
  10. 'dd'命令完成后,您将收到以下弹出消息。您应该选择“忽略”。

    E1

    注意:您的计算机可以读取磁盘(闪存驱动器)。该消息应该说:“您插入的磁盘不能被macOS读取。”

    要继续执行此过程的下一部分,您需要将闪存驱动器插入。如果确实需要弹出闪存驱动器,可以使用“磁盘工具”应用程序或输入下面给出的命令。

    diskutil  eject  /dev/diskN
    

初始化Micro SD卡

您引用的说明假设micro SD卡未初始化或已进行MBR初始化而没有分区。您可能需要执行以下步骤以确保您的micro SD卡已正确初始化。

  1. 输入以下命令以获取驱动器的列表。

    ls  /dev  |  egrep  ^disk\\d+$
    
  2. 使用适配器,将micro SD卡插入Mac。

  3. 再次输入以下命令以获取驱动器的列表。接下来,确定分配给micro SD卡的标识符(例如,步骤1中未显示的标识符)

    ls   /dev  |  egrep  ^disk\\d+$
    

    注意:在后续步骤中,请diskN使用分配给micro SD卡的标识符进行替换。

  4. 输入以下命令初始化micro SD卡。

    diskutil  partitiondisk  diskN  1  mbr  free  none  r
    
  5. 输入以下命令卸载micro SD卡。

    diskutil  eject  diskN
    

启动你的Mac到Arch Linux

  1. 如果未插入Mac可启动Arch Linux闪存驱动器,请立即执行此操作。
  2. 重新启动Mac并立即按住option键,直到出现启动管理器。
  3. 选择标有“EFI Boot”的图标,然后选择标签下方的箭头。
  4. 选择“Arch Linux archiso x86_64 UEFI CD”或等待这种情况自动发生。

关于驱动器标识符的注意事项

运行Linux,Unix,macOS和传统OS X操作系统的计算机使用的硬件具有字符串设备标识符。在您的问题的上下文中,我们只处理驱动器设备。macOS操作系统diskN用于识别HDD,SSD,SD卡,micro SD卡,USB闪存驱动器等。该值N是大于零的某个整数。Arch Linux操作系统使用不同的方案。这里,驱动器标识符的形式是sdX,其中X是英文字母表中的小写字母。

Micro SD卡创建

注意:由于您正在启动Arch Linux的“Live”版本,因此我对您引用的过程进行了一些更改。

  1. 将micro SD卡插入计算机并记录它是哪个设备标识符(dmesg | tail
  2. 确保没有安装(umount /dev/sdX*umount /dev/mmcblk*
  3. 开始fdisk分区SD卡:

    fdisk  /dev/sdX
    
  4. fdisk提示符下,创建新分区:

    一个。键入n,然后p输入primary,1驱动器上的第一个分区,return接受默认起始扇区的键,以及+100M结束扇区。

    湾 键入t以设置类型,然后c将其设置为FAT。

    C。键入n,然后键入pprimary,2作为第二个分区,然后按return两次键以接受默认值。

    d。键入退出w

  5. 创建并挂载vfat文件系统:

    mkfs.vfat  /dev/sdX1
    mkdir  boot
    mount  /dev/sdX1 boot
    
  6. 创建并挂载ext4文件系统:

    mkfs.ext4  /dev/sdX2
    mkdir  root
    mount  /dev/sdX2 root
    
  7. 下载并解压缩根文件系统:

    cd  ~/root
    wget  http://os.archlinuxarm.org/os/ArchLinuxARM-utilite-latest.tar.gz
    cd  ~
    bsdtar  -xpf  root/ArchLinuxARM-utilite-latest.tar.gz  -C  root
    rm  root/ArchLinuxARM-utilite-latest.tar.gz
    
  8. 将引导文件复制到引导分区:

    cp  root/boot/*  boot
    
  9. 卸载分区:

    umount  boot  root
    
  10. 从计算机中取出Micro SD卡,然后将其插入前面板上的Utilite


我真的很感激这个彻底的答案。由于我可以访问运行Linux的计算机(带有Gallium OS的Chromebook),而不是为我的Mac创建可启动的USB驱动器,因此我能够使用它。答案中最有用的部分是There is no command in macOS to format a partition to use a linux file system. In other words, there is no equivalent for the Arch Linux mkfs.ext4 command.
Don 01001100

当然,我遇到了与分区无关的问题(错误的版本bsdtar,其中),但这是一次学习经历!
Don 01001100

我没有得到任何迹象表明bsdtar命令失败,但我没有ARM机器可以测试。
大卫安德森

0

这就是你如何做到的。这适用于第1代,第2代和第3代的rpi。

我将bash函数中的代码分开,以使其更具可读性。

可能存在无关mount/ unmounts,但是大多数diskutil操作导致MacOS自动挂载卷,因此我们需要在继续之前卸载它们,否则命令会导致资源忙。

我们需要安装一些依赖项。这部分并不像我希望的那样自动化。

curl -OL https://raw.githubusercontent.com/yalp/homebrew-core/fuse-ext2/Formula/fuse-ext2.rb

现在编辑该文件并在以下caveat部分后添加到该文件:

  patch do
    url "https://github.com/alperakcan/fuse-ext2/files/2576060/0001-Fix-new-Xcode-compilation.patch.txt"
    sha256 "a2a8ff14f36754aead1745b4b5f53b0333376d1bf6abe659ec4eacdbb232aceb"
  end

现在我们安装依赖项:

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

最后,这是格式化SD卡的脚本。复制粘贴此脚本,使其可执行chmod a+x FILE,并用两个参数调用它DEVICEMODEL

该脚本非常智能,可以为您提供DEVICE和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 compatible device found."
        exit 1
    fi
    if [ -z "$device" ] || ! contains "$available_devices" "$device"; then
        echo "$usage"
        echo
        echo "DEVICE must be one of:"
        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 must be one of:"
        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 "Unsupported model $model"
        exit 1
    fi
}
function download_archlinux() {
    local model="$1"
    local filename="$2"

    echo "Checking if we need to download the latest ArchLinuxARM iso"
    curl --silent --location \
         --output "new-md5-$model" \
         "http://os.archlinuxarm.org/os/$filename.md5"
    local current_md5="$(md5sum "$filename")"

    echo "Newest md5:" "$(cat "new-md5-$model")"
    echo "Current md5:" "$current_md5"

    if [ "$(cat "new-md5-$model")" != "$current_md5" ]; then
        echo "We do, downloading in the background..."
        (
            if curl --silent --location \
                    --remote-name \
                    "http://os.archlinuxarm.org/os/$filename"; then
                echoerr "Download done."
            else
                echoerr "Failed to download."
            fi
        )&
        local process=$!
    else
        echo "We don't, continuing"
        local process=0
    fi

    return "$process"
}

function wait_for_download() {
    local process="$1"

    if [ "$process" -ne 0 ]; then
        echo "Waiting for download to finish."
        wait "$process" || exit 1
    fi
}

function untar_and_copy_arch() {
    local filename="$1"
    local device_dir="$2"

    echo 'Untaring into 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 'Running sync, can take a few minutes...'
    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 "Unmounting mounted root."
        sudo umount "$p2"
    fi
}

function mount_device() {
    local tmp_dir="$1"
    local device="$2"

    echo "Mounting $device root and boot on $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
}

usage="$0 DEVICE MODEL"

device="$(require_device "$1" "$usage")" || exit 1
device_root="$("${device}s2")"

model="$(require_model "$2" "$usage")" || exit 1
filename="$(get_arch_filename "$model")"


download_archlinux "$model" "$filename"
process="$?"

umount_device "$tmp_dir" "$device"


diskutil partitionDisk "$device" 2 MBR \
        "MS-DOS FAT32" BOOT 100M \
        "MS-DOS FAT32" ROOT R \
        || exit 1
umount_device "$tmp_dir" "$device"

format_ext4 "$device_root" ROOT || exit 1

wait_for_download "$process"

sleep 3
umount_device "$tmp_dir" "$device"
mount_device "$tmp_dir" "$device"

untar_and_copy_arch "$filename" "$tmp_dir"

umount_device "$tmp_dir" "$device"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.