[GRUB4DOS] 未公开特性:扇区序列文件的长度指定,精确到字节
发表于我觉得这是一个未公开的特性,因为我从未在其它地方见到过有关这一特性的描述。
在 grub 中,我们可以用 (hd0)12345+8 或者 (hd0,0)2+20,33+5,87+300 之类的表达法来表示一个磁盘文件。这种表示法,就是扇区序列表示法。既然是扇区序列,那么这样的文件,就只能以扇区对齐(也即必须为
512
的整数倍),也就是说,不可能表示一个256
字节的文件,也不可能表示一个513
字节的文件。对于内存文件来讲,也是如此,(md)xxxxx+yyyyy 和 (rd)xxxxx+yyyyy 这类表达法都是表示扇区的整数倍,这样大小的文件。
然而有时候,我们确实需要精确到字节的扇区序列文件。比如在硬盘上(或内存中)有一个 image.gz 文件,如果你不指定这个文件的精确大小,那么
grub
就不能正常解压这个文件,这是因为解压程序依赖于这个 gz 的精确长度,你多一个字节或少一个字节,都可能会失败的。怎样指定扇区序列的精确长度呢?这可能是
GNU GRUB
早期的开发者早就开发的功能了,只是没有公开,也许是因为开发者觉得这个功能的实现方法以后说不定会改变,就不适合公开了。扇区序列的精确长度(以字节计),是直接加在扇区序列表达法之后的,用逗号与扇区序列隔开。例如,你想打印出 MBR 中开头的466
个字节,就可以这样:cat --hex (hd0)+1,466
其中 (hd0)+1 是扇区序列,
466
表示只从扇区序列中取出466
字节作为文件的长度。再举一例:
cat --hex (hd0)+63,800+63,64400
如果没有结尾的“
,64400
”,那么,“(hd0)+63,800+63
”就表示不连续的两个扇区序列所组成的文件,每个连续的序列都有63
个扇区,所以文件总共有126
个扇区。文件的长度就是 126x512=64512 字节。加上了结尾的“,64400
”之后,文件变小了,它表示的文件长度为64400
。当然你不应该指定一个长度,使得它比扇区序列的总长度还要大。但是,如果你想只访问 MBR 中的分区表,那是不行的,这种表达法不支持从扇区序列的中间截取文件,只支持从扇区序列的最开头截取一定长度的文件。
由于这种表达法也是有缺点的,因此我们也仍然不公开这一特性。今后说不定会出现一种更合理的表达方式。