无忧启动论坛

标题: grub4dos利用dd命令传递参数的方法与应用 [打印本页]

作者: lianjiang    时间: 2009-1-17 15:37
标题: grub4dos利用dd命令传递参数的方法与应用
利用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 来为镜像写入引导,也是非常简单方便的。

作者: yichya    时间: 2009-2-3 18:00
这么说GRUB用来写文件的大多数问题解决了?


这可太好了,这下不只传送参数,甚至可以用来不进入系统进行比如BOOT.INI的修改这类的简单修复,再不需要进入DOS或PE了。

[ 本帖最后由 yichya 于 2009-2-3 18:06 编辑 ]
作者: jnax    时间: 2010-1-23 22:49
将近一年了,才知道原来GRUB4DOS有DD的功能,这篇文章太好了,收藏学习。
作者: sowind    时间: 2010-1-24 00:27
DD命令跟cat命令确实是方便了很多人,当然其它的命令也很有用。
作者: tegl    时间: 2010-1-24 07:42
好文章,学习了~
作者: lianjiang    时间: 2010-1-24 10:50
原帖由 zhxy9804 于 2010-1-24 10:31 发表
建议lianjiang重新更新grub4dos说明,那个说明也算是经典了。


新增的那些命令,都是些高级用法,我一点不懂。基础太差,没办法跟进。
那些高级命令,能熟练使用的,世界上估计不足10人。
作者: lianjiang    时间: 2010-1-24 10:53
有基础的人,看看chenall等的帖子及grub4dos的说明文件就可以了。
没基础的人看了也很难理解,无法做到灵活运用。
作者: lianjiang    时间: 2010-1-24 16:27
原帖由 zhxy9804 于 2010-1-24 13:04 发表
说不超过10人是过了,毕竟使用这些命令,属于另一种层次了
层次到了,自然就会有更高的要求。


呵呵,纯属猜测。

活跃在时空,无忧的那几个高手的帖子,就是grub4dos高级用法的最好教程。
作者: lsp19880301    时间: 2010-1-29 22:49
高难度呀,我只看了大概,看来还得潜水深造喽
作者: atoms    时间: 2010-9-20 20:10
标题: 怎样dd xx+yy (hd)
怎样dd xx+yy (hd)
xx为img文件在硬盘的启始扇区数
yy为img文件占用扇区数
作者: winlong102    时间: 2012-4-26 20:34
dd的确很难理解,我获取了磁盘的分区号比如1:1,并将其赋予变量值%p%,但不知道怎么将此变量通过dd 传入镜像,必须写临时文件然后再在dos读取这些变量吗?




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3