在Ubuntu挂载apfs文件系统的硬盘

在我将mac的代码硬盘迁移到服务器时,发现ubuntu不支持apfs格式的硬盘,于是在搜索中得知apfs-fuse的应用可以解决,但过程踩坑较多,相关文章也少,在此记录以备后用

1 首先安装需要的文件

请确保指令库中包含main或universe仓库,防止文件缺失

1
2
3
4
sudo apt update
sudo apt upgrade

sudo apt install build-essential git cmake libfuse-dev libattr1-dev

2 下载apfs-fuse, 并初始化

1
2
3
4
5
6
7
8
9
10
11
git clone git@github.com:sgan81/apfs-fuse.git

# 进入克隆的目录
cd apfs-fuse

# 编译和安装
mkdir build
cd build
cmake ..
make
sudo make install

cmake可能出现的错误

1
2
3
# 缺失 3rdparty/lzfse/src/lzfse.h
CMake Error: Cannot determine link language for target "lzfse".
CMake Error: CMake can not determine linker language for target: lzfse

解决

1
2
3
4
5
6
7
8
9
10
11
12
# 返回apfs-fuse根目录
cd /apfs-fuse
git submodule init
git submodule update

# 重新编译cmake
cd build
cmake ..
# 如果编译成功 继续完成编译与安装
make
sudo make install
#

make可能出现的问题 1

1
2
3
4
5
6
7
# 缺少 bzlib.h 头文件,bzlib.h 是 bzip2 压缩库的头文件,apfs-fuse 项目依赖这个库来完成某些功能。
CMakeFiles/apfs.dir/build.make:566: recipe for target 'CMakeFiles/apfs.dir/ApfsLib/Util.cpp.o' failed
make[2]: *** [CMakeFiles/apfs.dir/ApfsLib/Util.cpp.o] Error 1
CMakeFiles/Makefile2:181: recipe for target 'CMakeFiles/apfs.dir/all' failed
make[1]: *** [CMakeFiles/apfs.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2

解决

1
2
3
4
5
6
7
8
9
# 安装此开发包
sudo apt install libbz2-dev

# 重新编译
cd /apfs-fuse/build
make

# 如果成功
sudo make install

make可能出现的问题 2

1
2
3
4
5
6
7
# 缺少 fuse3 的开发包。apfs-fuse 需要 fuse3 库来支持文件系统挂载
CMakeFiles/apfs-fuse.dir/build.make:62: recipe for target 'CMakeFiles/apfs-fuse.dir/apfsfuse/ApfsFuse.cpp.o' failed
make[2]: *** [CMakeFiles/apfs-fuse.dir/apfsfuse/ApfsFuse.cpp.o] Error 1
CMakeFiles/Makefile2:259: recipe for target 'CMakeFiles/apfs-fuse.dir/all' failed
make[1]: *** [CMakeFiles/apfs-fuse.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2

解决

1
2
3
4
5
6
7
8
9
# 安装fuse3的开发包
sudo apt install libfuse3-dev

# 重新编译
cd /apfs-fuse/build
make

# 如果成功
sudo make install

3 挂载apfs格式的硬盘

扫描出盘符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fdisk -l 或 lsblk


Disk /dev/sdb:465.8 GiB,500107862016 字节,976773168 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
磁盘标识符:956A8929-D89C-4268-BE1D-F2FB36B1F32A

设备 起点 末尾 扇区 大小 类型
/dev/sdb1 34 32767 32734 16M Microsoft 保留
/dev/sdb2 32768 976773127 976740360 465.8G 未知


sdb 8:16 0 465.8G 0 disk
├─sdb1 8:17 0 16M 0 part
└─sdb2 8:18 0 465.8G 0 part

则 dev/sdb 为该硬盘位 可以看到 dev/sdb2

如果直接挂载

1
2
3
4
sudo apfs-fuse /dev/sdb2 ~/RenCCCP

# 可能报错
Unable to get volume!

需要指定vol参数后再挂载

1
2
3
4
apfs-fuse -o vol=1 /dev/sdb2 ~/RenCCCP
cd ~/RenCCCP/
ls
private-dir root

则此时挂载成功