我试图找出如何在Mac上创建archlinux可启动驱动器的相应说明。(我正在使用Micro SD转USB适配器。)我找到了关于分区闪存驱动器的这些说明,但我不确定如何应用它们,因为我试图“转换”成macOS术语的说明谈到部门,这比我以前工作的水平要低得多。明确地说,我的问题是:我如何使用macOS 10.12.6获得与使用macOS 10.12.6相同的内容?谢谢!
我试图找出如何在Mac上创建archlinux可启动驱动器的相应说明。(我正在使用Micro SD转USB适配器。)我找到了关于分区闪存驱动器的这些说明,但我不确定如何应用它们,因为我试图“转换”成macOS术语的说明谈到部门,这比我以前工作的水平要低得多。明确地说,我的问题是:我如何使用macOS 10.12.6获得与使用macOS 10.12.6相同的内容?谢谢!
Answers:
macOS中没有命令格式化分区以使用linux文件系统。换句话说,Arch Linux mkfs.ext4
命令没有等价物。这个问题有很多可能的解决方案。以下是一个这样的解决方案
我建议,完成可启动驱动器创建的最佳方法是在Mac上启动Arch Linux操作系统。这将允许您使用您提供的Web链接中显示的命令。Arch Linux的这个启动将通过1 GB或更大的闪存驱动器完成。使用闪存驱动器的优点是您不必在任何内部驱动器上安装Arch Linux。
注意:您可以将以下每个命令复制并粘贴到终端应用程序窗口中。这将减少键入的数量和类型错误的风险。
.iso
文件。我选择下载的Mac兼容文件名为archlinux-2017.12.01-x86_64.iso
。您可以在Arch Linux网站上找到此文件。此文件已下载到我的“下载”文件夹中。我会假设你也会这样做。打开终端应用程序窗口。输入以下命令以导航到“Downloads”文件夹。
cd ~/Downloads
将此.iso
文件转换为与闪存驱动器兼容的格式。以下命令完成此任务。
hdiutil convert archlinux-2017.12.01-x86_64.iso -format UDRW -o target.img
该.dmg
字符可被附加到输出的文件名。输入以下命令以检查是否发生了这种情况。
ls target.img.dmg
如果target.img.dmg
出现文件名,则输入下一个命令以重命名此文件。
mv -f target.img.dmg target.img
输入以下命令以获取驱动器的前列表。
ls /dev | egrep ^disk\\d+$
插入闪存驱动器。
再次输入以下命令以获取驱动器的后列表。接下来,确定分配给闪存驱动器的标识符(例如,步骤5中未显示的标识符)
ls /dev | egrep ^disk\\d+$
注意:在后续步骤中,请
diskN
使用分配给闪存驱动器的标识符进行替换。
输入以下命令以卸载闪存驱动器。
diskutil unmountdisk diskN
注意:如果看到错误
Unmount of diskN failed: at least one volume could not be unmounted
,请打开“磁盘工具”应用程序并卸载卷(不要弹出)。
输入以下命令以复制target.img
到闪存驱动器。
sudo dd if=target.img bs=1m of=/dev/diskN
请注意以下事项:
- 此命令将要求您输入登录密码。
- 要查看复制操作的进度,请在执行命令时按control+ T键。
- 使用
/dev/rdisk
而不是/dev/disk
更快。- 如果看到错误
dd: Invalid number '1m'
,则表示您正在使用GNUdd
命令。使用相同的命令但替换bs=1m
为bs=1M
。- 如果看到错误
dd: /dev/diskN: Resource busy
,请确保未使用该驱动器。打开“磁盘工具”应用程序并卸载卷(不弹出)。
'dd'命令完成后,您将收到以下弹出消息。您应该选择“忽略”。
注意:您的计算机可以读取磁盘(闪存驱动器)。该消息应该说:“您插入的磁盘不能被macOS读取。”
要继续执行此过程的下一部分,您需要将闪存驱动器插入。如果确实需要弹出闪存驱动器,可以使用“磁盘工具”应用程序或输入下面给出的命令。
diskutil eject /dev/diskN
您引用的说明假设micro SD卡未初始化或已进行MBR初始化而没有分区。您可能需要执行以下步骤以确保您的micro SD卡已正确初始化。
输入以下命令以获取驱动器的前列表。
ls /dev | egrep ^disk\\d+$
使用适配器,将micro SD卡插入Mac。
再次输入以下命令以获取驱动器的后列表。接下来,确定分配给micro SD卡的标识符(例如,步骤1中未显示的标识符)
ls /dev | egrep ^disk\\d+$
注意:在后续步骤中,请
diskN
使用分配给micro SD卡的标识符进行替换。
输入以下命令初始化micro SD卡。
diskutil partitiondisk diskN 1 mbr free none r
输入以下命令卸载micro SD卡。
diskutil eject diskN
运行Linux,Unix,macOS和传统OS X操作系统的计算机使用的硬件具有字符串设备标识符。在您的问题的上下文中,我们只处理驱动器设备。macOS操作系统diskN
用于识别HDD,SSD,SD卡,micro SD卡,USB闪存驱动器等。该值N
是大于零的某个整数。Arch Linux操作系统使用不同的方案。这里,驱动器标识符的形式是sdX
,其中X
是英文字母表中的小写字母。
注意:由于您正在启动Arch Linux的“Live”版本,因此我对您引用的过程进行了一些更改。
dmesg | tail
)umount /dev/sdX*
或umount /dev/mmcblk*
)开始fdisk
分区SD卡:
fdisk /dev/sdX
在fdisk
提示符下,创建新分区:
一个。键入n
,然后p
输入primary,1
驱动器上的第一个分区,return接受默认起始扇区的键,以及+100M
结束扇区。
湾 键入t
以设置类型,然后c
将其设置为FAT。
C。键入n
,然后键入p
primary,2
作为第二个分区,然后按return两次键以接受默认值。
d。键入退出w
。
创建并挂载vfat文件系统:
mkfs.vfat /dev/sdX1
mkdir boot
mount /dev/sdX1 boot
创建并挂载ext4文件系统:
mkfs.ext4 /dev/sdX2
mkdir root
mount /dev/sdX2 root
下载并解压缩根文件系统:
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
将引导文件复制到引导分区:
cp root/boot/* boot
卸载分区:
umount boot root
从计算机中取出Micro SD卡,然后将其插入前面板上的Utilite
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.
bsdtar
,其中),但这是一次学习经历!
bsdtar
命令失败,但我没有ARM机器可以测试。
这就是你如何做到的。这适用于第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
,并用两个参数调用它DEVICE
和MODEL
。
该脚本非常智能,可以为您提供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"