|
利用dd命令传递参数的方法与应用
众所周知,BCDW有传递参数的功能,遗憾的是,只能用于光盘/ISO启动。
grub4dos作为一个启动管理器,功能强大,但可惜没有传递参数的功能。
最新版grub4dos新增了一个用于文件复制的命令-dd。
dd命令的用法原文为:
Usage:
dd if=IF of=OF [bs=BS] [count=C] [skip=IN] [seek=OUT]
Copy file IF to OF. BS is blocksize in bytes, default to 512. C is blocks to copy, default is total blocks in IF. IN specifies number of blocks to skip when read, default is 0. OUT specifies number of blocks to skip when write, default is 0. Skipped blocks are not touched. Both IF and OF must exist.
dd is dangerous, use at your own risk. To be on the safe side, you should only use dd to write a file in memory.
In some cases when writing a file in NTFS, dd might fail.
注意:
dd 目前不支持创建文件,也不支持改变文件的长度,所以,不存在的文件是不能写入的。
把一个大的文件写入一个小的文件,这个小的文件不会变长。多余的部分扔掉了。
把一个小的文件写入一个大的文件,这个大的文件不会变短。未写的部分保持不变。
利用此命令,可以做到从文件到文件,扇区到扇区,文件内的字节到字节以及他们之间相互的任意位置写入。
可用于在grub4dos下直接备份和恢复MBR或者分区的引导扇区,也可用于参数的传递。
A, 下面是我在最新版“GGhost硬盘安装器”中使用的用于参数传递的简单例子。
要实现的是Windows运行“GGhost硬盘安装器”时,把一些参数写入硬盘上的设置文件A(源),在重启时通过grub4dos传递给文件B(目标),然后在dos下读取文件B,根据读取的参数执行相应的命令。
grub4dos的菜单写法示例:
title 0. GGhost 2009
find --set-root /ggui/gghost.img
map --mem /ggui/gghost.img (fd0)
map --hook
dd if=()/ggui/setw.ini of=(fd0)/gghost/setd.ini
chainloader (fd0)+1
rootnoverify (fd0)
这里:
/ggui/setw.ini表示硬盘上ggui目录下的设置文件setw.ini(源),
(fd0)/gghost/setd.ini表示gghost.img文件中gghost目录下的文件setd.ini(目标),
通过dd命令就把硬盘上的文件写入了img中的文件,从而实现参数的传递功能。
提示:img文件中必须存在目标文件,位于NFTS分区的文件,要求不小于2k。
B, 以下内容引用自时空论坛zw2312914的帖子。详情参看此帖
dd是一个强大的命令,个人认为是继仿真功能后grub4dos中最为强大的实用功能。
灵活使用bs skip seek 等参数可以做到从文件到文件,扇区到扇区,文件内的字节到字节以及他们之间相互的任意位置写入。可以理解为任意字节的复制 和粘贴 操作。
(需注意两点:1。要实现完整写入,必须使目标文件大于或等于源文件的字节数,2.目前版本,目标文件需存在于设备中,目标文件的内容是什么倒无关)
比如,(fd0)下的一dos脚本 path.bat,其内容是:
set string=abcdefghijklmnopqrstuvwxyz
set path=¥:
goto main
:main
...
...
....
goto end
...
:end
确定第一行37个字节(实际,行末还存在回车或换行符的字节,但这里仅演示dd 的应用,故从略),第二行11个字节,
那么可以将第一行的任意一个字符写到第二行,
比如希望替换掉第二行的字符¥,为指定的盘符,那么:
dd if=(fd0)/path.bat of=(fd0)/path.bat bs=1 skip=11 count=1 seek=46
执行后,就把path.bat文件的第二行替换为set path=a:
(bs=1 代表以一个字节为单位读写,count=1 代表只写一个由bs参数指定单位的块,这里就代表只写一个字节,skip=11 即读时跳过11个字节,其中空格也是一个字节,即从第一行的第12个字符 a 开始读。seek=46 用来指定写入时跳过46个字节,即写到第47个字节¥的位置。)
因此,作为应用之一的参数传递,dd 命令显得更直接和高效的。
当然直接用dd if=/pe.img of=(fd0) 这样的方式来制作启动盘,或者通过dd if=(cd0) of=/cd.iso 来制作光盘镜像,dd if=(hd0,0)+1 of=/dos.img 来为镜像写入引导,也是非常简单方便的。
|
|