如何更改 vfat 分区 UUID?

fri*_*mle 24 linux filesystems partitioning uuid

如何更改vfat分区的 UUID ?

对于ext2 / ext3 / ext4,这是通过一个简单的:

tune2fs -U <new-uuid> /dev/<partition>
Run Code Online (Sandbox Code Playgroud)

是否有类似的vfat分区命令?

小智 31

FAT32 的卷 ID 存储在第一个扇区的偏移量 67 (0x43) 处,对于 FAT16,它位于 39 (0x27)。可以使用dd命令读取它(替换/dev/sdc1为您的真实分区):

dd bs=1 skip=67 count=4 if=/dev/sdc1 2>/dev/null \
| xxd -plain -u \
| sed -r 's/(..)(..)(..)(..)/\4\3-\2\1/'
Run Code Online (Sandbox Code Playgroud)

而且,当然,您还可以存储一个新的 UUID(替换1234-ABCD为您想要的值):

UUID="1234-ABCD"
printf "\x${UUID:7:2}\x${UUID:5:2}\x${UUID:2:2}\x${UUID:0:2}" \
| dd bs=1 seek=67 count=4 conv=notrunc of=/dev/sdc1
Run Code Online (Sandbox Code Playgroud)

参考:FAT 物理结构(卷序列号偏移):https ://technet.microsoft.com/en-us/library/cc776720( v= ws.10) .aspx#w2k3tr_fat_how_gkxz

  • 太棒了!如果您想在 Android 设备上更换外部 micro sd 卡并希望新卡与旧卡匹配相同的路径,这将特别方便。 (2认同)
  • 请注意,对于 FAT12/FAT16 卷,偏移量是 39,而不是 67!如果您的分区非常小(我的是 256M microSD),则可能会发生这种情况。如果在尝试写入分区之前将 `dd` 的读数与 `blkid` 的输出进行比较,则可以进行完整性检查。 (2认同)

Rod*_*ith 15

了解您为什么要这样做可能会有所帮助。我不知道有什么工具可以做你想做的事,但可能还有其他选择......

从技术上讲,FAT 分区没有 UUID;它们有序列号,一些 Linux 工具和文件(例如mount/etc/fstab)可以使用序列号代替 UUID。在 GPT 磁盘上,保存 FAT 文件系统的分区具有 GUID,它(在足够多的 Linux 发行版上)可以在mount和 中称为 PARTUUID /etc/fstab。这两个FAT文件系统和(GPT磁盘),它也可以通过使用含有它们也可以有名字的分区,mount/etc/fstab。这些功能中的任何一个都可以用来代替 FAT 序列号。

虽然我不知道有什么工具可以更改 FAT 分区的序列号,但可以在通过-i选项创建文件系统时设置它们mkdosfs,如下所示:

mkdosfs -i ABCD1234 /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

本示例将 的序列号设置/dev/sdc1为 ABCD-1234。如果文件系统足够小,您可以备份它,使用所需的序列号创建一个新的文件系统,然后恢复它。如果您尝试将序列号设置为磁盘或安装设置脚本的一部分,则mkdosfs可能只需要通过设置它。

您可以使用gdisk或更改分区的 GUID sgdisk。使用后者,您可以通过-u选项完成工作,如下所示:

sgdisk -u 1:BC87D91A-02F3-4C52-87CD-536A3DF2A074 /dev/sdc
Run Code Online (Sandbox Code Playgroud)

本示例将 GUID 设置/dev/sdc1为 BC87D91A-02F3-4C52-87CD-536A3DF2A074。(请注意,-u采用冒号分隔的一组选项,其中第一个是分区号,第二个是 GUID 值。整个磁盘设备的设备文件名 [不是分区] 是最后一个选项。)

根据您的需要,这些方法之一可能有效。移到更广泛的领域,您可以使用该dosfslabel工具设置文件系统的标签;或者您可以使用sgdisk's-c选项更改 GPT 分区的名称,其工作方式与 非常相似-u,但采用名称而不是 GUID。

  • 可以通过 [mtools](https://www.gnu.org/software/mtools/) 的 mlabel 命令更改 vfat 设备的服务编号。 (7认同)
  • 以下是使用 `mlabel` 命令的示例:`sudo mlabel -i /dev/mmcblk0p1 -N 12345678` (2认同)

Luc*_*iti 7

通常,人们可能希望为 vfat 分区设置一个新的随机 UUID(而不是设置特定的 UUID),例如为了避免在使用dd. 在这种情况下,一个简单的解决方案是使用gparted:右键单击分区,然后单击“新建 UUID”。

@tarabyte 建议大多数人来到此页面寻找一种无 GUI(例如命令行)的方式在无头服务器上执行此操作。如果是这种情况,则gparted表明执行上述操作时它在后台运行的命令类似于:

    sudo mlabel -s -n :: -i /dev/nvme0n1p6
Run Code Online (Sandbox Code Playgroud)

  • 我认为我们大多数人都对在无头服务器上执行此操作的无 GUI(例如命令行)方式感兴趣。 (3认同)

小智 5

根据上面Tommy 的回答,exFAT 驱动器的偏移量是 100。除此之外,更改 exFAT 驱动器 ID 的命令几乎与 FAT16/32 驱动器的命令一字不差地进行,只是在fsck最后保存了一小部分。请记住,必须使用 root shell 提升命令sudo或在 root shell 中运行命令,并且/dev/sdc1应更改示例中使用的命令以匹配您设备的块 ID。

您可以使用以下命令检查卷 ID:

dd bs=1 skip=100 count=4 if=/dev/sdc1 2>/dev/null \
| xxd -plain -u \
| sed -r 's/(..)(..)(..)(..)/\4\3-\2\1/'
Run Code Online (Sandbox Code Playgroud)

写入新 ID 的命令变为:

UUID="1234-ABCD"
printf "\x${UUID:7:2}\x${UUID:5:2}\x${UUID:2:2}\x${UUID:0:2}" \
| dd bs=1 seek=100 count=4 conv=notrunc of=/dev/sdc1
Run Code Online (Sandbox Code Playgroud)

最后,我不得不重新计算校验和,这fsck -a对我来说完成了

fsck -a /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

我非常感激,汤米,谢谢你。