这类似于此处提出的问题:
唯一的区别是我想将其更改为特定值,而不是随机值。hfs.util似乎只是随机的。
我考虑过修改hfs.util源,以允许我指定值。当我四处浏览代码以寻找从哪里开始进行更改时,我想起了为什么C不是我最喜欢的语言。几次编译错误和段错误之后,我失去了尝试修改此工具的热情。休息一会后,我愿意再次尝试。但是,我认为必须有一种更简便的方法来更改我不知道的卷的UUID。
因此,在我再浪费时间之前,没有人知道一种简单的方法吗?还是有任何C专家愿意加入我的努力,使hfs.util将UUID更改为指定值?
这是我为了能够从源OS X 10.6.8编译该工具而进行的更改:
hfsutil_jnl.c:
47: #include <hfs_fsctl.h>
hfsutil_main.c:
80: #include <uuid/uuid.h>
81: /* REMOVED */
并且,如本文所述,将fs.c中第166行的以下内容添加到hfsutil_main.c中(因为namespace.h在系统上不存在):
static unsigned char kFSUUIDNamespaceSHA1[] = {0xB3,0xE2,0x0F,0x39,0xF2,0x92,0x11,0xD6,0x97,0xA4,0x00,0x30,0x65,0x43,0xEC,0xAC};
最后,我抓取了此文件并将其添加到工作目录http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/hfs/hfs_fsctl.h
我尚未研究hfs.util的源代码,可能对您来说有用为时已晚,但我认为我可以提供一些有用的信息。
用于HFS +卷的UUID似乎是UUID规范涵盖的所有变体,并且是版本3类型,即名称空间和名称,通过MD5转换为UUID(请参阅Wikipedia上的详细信息)。
实际的磁盘标识符(在规范中代替名称)似乎只有64位,可以通过在Apple用作卷标识符的名称空间的UUID之前添加,然后根据规范转换为128位UUID MD5哈希。
这不涉及计算机组件值,当前时间等。这些值用于其他类型的UUID。但是,它确实涉及一个“名称空间” UUID(以标识我们正在“命名”磁盘卷的事实),然后是一个“名称”(磁盘的实际标识符)。
让我想到的一件事不仅是@chriv的声明,它的代码似乎仅使用64位,还包括SuperDuper附带的“秘密”实用程序处理UUID的方式!
超级骗子!Mac OS X的备份实用程序具有一个“隐藏”命令行工具,该工具可让您检索和设置卷UUID。但它同时检索并将其设置为64位序列(以十六进制表示)。看来这些位与Apple磁盘实用程序报告的实际值完全不同。
有关更多信息,请参见:
http://www.shirt-pocket.com/forums/archive/index.php/t-1186.html
http://www.shirt-pocket.com/forums/archive/index.php/t-6173.html
注意:请通读这些支持讨论,因为似乎有些陷阱,例如有时需要重新启动。
更新
我看了一眼苹果公司的消息。我确认我上面写的内容。磁盘上保存的是该卷的64位标识符(它是通过获取一组伪随机数据位的SHA1哈希的前64位来随机生成的:正常运行时间,引导时间,主机ID,主机名,内核发行版)字符串,内核版本字符串,平均负载,VM统计信息和当前时间)。
在版本3 UUID中,这是一个“名称”。因此,磁盘上保存的是卷的64位“名称”,而不是UUID。
这些工具报告的128位UUID不会保存,出于显示目的,每次都会从“名称”和“命名空间”(命名空间是固定的,并且OP必须手动将其添加到kFSUUIDNamespaceSHA1常量)中进行计算。源,因为缺少包含它的标头:它表示卷“名称”的“名称空间”,这是实际保存在卷上以标识它们的64位内容)。
从“名称”到UUID很容易(基本上,您将标准算法应用于版本3 UUID),但是从UUID回到“名称”基本上是不可能的。换句话说,OP的答案是:可能知道卷的“名称”(例如,如果要将备份还原到新磁盘,并且已经保存了其名称以及数据) ,但如果您只知道UUID,则不会。正确设置名称将得到预期的UUID,但是您需要该名称,并且无法根据UUID进行计算。
关于苹果代码的注释(阅读这些代码并看一下代码,一切都会变得很清楚):
如我所写,磁盘上所有的都是“名称”。仅使用第3版算法(用于“名称空间”中“名称”的UUID)来计算UUID,以用于可视化。
根据当前是否安装了卷,设置和获取“名称”到磁盘是不同的。“名称”存储在该卷的“查找器信息”中。可以使用getattrlist和setattrlist来获取和设置已装载卷的“ Finder Info”数据,但是如果未装载该卷,它们将直接访问该卷数据(毕竟,这是unix,而未装载的卷是一个块可以通过根目录作为文件访问的设备)。
然后是实现该工具功能的“高级”功能:
因此,您可以做的最好的事情就是重新编码嵌入在Shirt Pocket的SuperDuper中的小命令行工具的相同功能!(请参阅我上面发布的链接)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句