无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 475734|回复: 3156
打印 上一主题 下一主题

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
跳转到指定楼层
#
发表于 2010-11-5 18:03:03 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖主要为对grub4dos的建议,或是bug的反馈,问题请去问题专帖。          by  sratlf

===================================================================

cat命令的语法是这样的:
cat [--hex] [--skip=S] [--length=L] [--locate=STRING] [--locate-align=A] FILE

--locate=STRING :查找文件中指定字符串的位置,有几个就输出几个
如文件内容:
PCI$
$PCI\VEN_1000&DEV_0050=lsi_sas                  <----------占30+2个字节=0x20
$PCI\VEN_1000&DEV_0056=lsi_sas   
$PCI\VEN_1000&DEV_005A=lsi_sas
$PCI\VEN_1000&DEV_0062=lsi_sas
$PCI\VEN_1000&DEV_0054=lsi_sas
$PCI\VEN_1000&DEV_0058=lsi_sas
$PCI\VEN_1000&DEV_005E=lsi_sas
-----------
--locate=$PCI,会输出16进制的数值,用空格分开,上面回车换行占2个字节:
6 26 46 66 86 a6 c6


[--skip=S]  跳过多少字节开始,这里S是10进制数或16进制数

----------------------------------
问题1:--locate=STRING如果输出16进制,建议输出格式改成0x6 0x26 0x46 ...
问题2:--skip=S 与上面对应为16进制。
问题3:希望加个参数,STRING不分大小写
...

[ 本帖最后由 zhaohj 于 2010-11-11 09:48 编辑 ]
推荐
发表于 2010-11-6 19:14:06 | 只看该作者
原帖由 zhaohj 于 2010-11-6 16:14 发表


inifile  a:\txtsetup.oem [aaaa]>f6.tmp
DOS下就这么简单提取出了[aaaa]段落的内容


尽量运用现有的功能达到目的,避免重复开发,
我将批处理改了下,算是一个通用的外部命令了
用法:
WENV set INIFILE=INI文件 [段名]
GETSECT.BAT

GETSECT.rar (707 Bytes, 下载次数: 137)

目前只能在11-03版的grldr上运行(11-04以后的版本批处理有BUG,新版正常后批处理还可以简化,并且可以将通过参数指定一个文件名,将结果写入文件)



!BAT设置变量INIFILE=INI文件名 [段名],打印该段内容

:参数检查
WENV get INIFILE || kernel
WENV reset _ini_*

:文件名、段名
WENV set _ini_fn=${INIFILE% }
WENV set _ini_sc=${INIFILE## }

:保存当前debug状态,打开回显,否则管道命令可能失败
debug status | WENV set -t _ini_db= && WENV set _ini_db=${_ini_db## } && debug 1

:记录偏移1
WENV call cat --locate=${_ini_sc} ${_ini_fn} | WENV set -t _ini_s1=
WENV get _ini_s1 || WENV echo -e not found sect ${_ini_sc}\n && WENV call debug ${_ini_db} && WENV reset _ini_* && kernel
WENV set _ini_s1=0x${_ini_s1}
WENV check " "<-"${_ini_s1}" set _ini_s1=${_ini_s1%% }

:记录偏移2
WENV calc _ini_tmp=_ini_s1+1
WENV call cat --skip=${_ini_tmp} --locate=[ ${_ini_fn} | WENV set -t _ini_s2=
WENV set _ini_s2=0x${_ini_s2}
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2%% }

:没有找到下一个段时,设置为文件长度
WENV check ${_ini_s2,?}==2 && WENV call cat --length=0 ${_ini_fn} | WENV set -t _ini_s2=
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2## }

:起始位置, 字节计数
WENV calc _ini_s1=_ini_s1+${_ini_sc,?}
WENV calc _ini_s2=_ini_s2-_ini_s1

:直接显示, 首尾可能有换行(如果内容较短,可通过变量中转显示去掉首尾换行)
WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn}

:恢复环境
WENV call debug ${_ini_db}
WENV reset _ini_*
回复

使用道具 举报

推荐
 楼主| 发表于 2010-11-5 22:13:01 | 只看该作者
原帖由 chenall 于 2010-11-5 19:12 发表
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能 ...


[aaaa]
sgrhgjhm
zbgnhgj
[bbbb]
sytrhy
hnh
-------------------
我的目的很简单,如:INIFILE 文件名 [aaaa]
显示[aaaa]段录内容
回复

使用道具 举报

推荐
发表于 2010-11-5 21:18:08 | 只看该作者
@zhaohj
问题1

可以这样解决
cat --locate=... | WENV set a=
WENV set a=0x${a! = 0x}   # 最前面加上0x,然后将空格替换为空格0x

[ 本帖最后由 tuxw 于 2010-11-5 21:23 编辑 ]
回复

使用道具 举报

推荐
发表于 2010-11-5 19:12:01 | 只看该作者
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能想办法去实现。
回复

使用道具 举报

推荐
发表于 2010-11-6 19:40:03 | 只看该作者

1105bug

11-05 版批处理BUG

随便写一个简单的语句集合的批处理文件,运行正常

在中间任意位置加一句
WENV check 1==2 echo ok
再运行批处理将在这句后退出

应该是只要有一条语句返回0就终止了
比如插入 WENV calc 1-1 && WENV echo ok 也一样
回复

使用道具 举报

推荐
发表于 2010-11-6 19:22:03 | 只看该作者
我比较希望的用法是这样的
WENV read GetSect.env inifile [aaaa]
回复

使用道具 举报

推荐
 楼主| 发表于 2010-11-6 16:14:26 | 只看该作者
原帖由 tuxw 于 2010-11-6 15:59 发表
可以先查找 [aaaa] 再查找 [
如果  不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的


inifile  a:\txtsetup.oem [aaaa]>f6.tmp
DOS下就这么简单提取出了[aaaa]段落的内容
回复

使用道具 举报

3129#
发表于 2024-3-5 19:37:02 | 只看该作者
使用fbinsttool 创建的启动盘

重新创建一个efi引导软盘,然后替换。至于怎么创建,怎么加载,在本板块有答案。
回复

使用道具 举报

3128#
发表于 2024-3-5 15:39:59 来自手机 | 只看该作者
这个回复也太长了吧。。。
回复

使用道具 举报

3127#
发表于 2024-2-20 11:52:56 | 只看该作者
本帖最后由 2010guoguo 于 2024-2-20 11:54 编辑

使用fbinsttool 创建的启动盘,映射了 efi分区,在EFI分区内用G4E启动WIN10PE 时遇到如下错误,ISO未解开无法启动,而虚拟机可以正常启动,菜单是这样的:title [01]启动64位WIN10PE系统\n      
  find --set-root /efi/imgs/win10pe_x64.iso
         map  /efi/imgs/win10pe_x64.iso (0xff) || map --mem /efi/imgs/win10pe_x64.iso (0xff)
        chainloader (0xff)

ISO解开后使用NTBOOT NTLOADER也可以启动wim,G4E用的最新版 1129


回复

使用道具 举报

3126#
发表于 2024-1-28 10:34:22 | 只看该作者
2011yaya2007777 发表于 2024-1-26 18:30
关键是不加载到内存能不能用?如果能用,干嘛要加载到内存?加载到内存难道不占用内存?悖论。

PC是老电脑了,系统加载至内存是因为在内存中运行得更快,同时不怕中病毒和木马,也不怕各种软件搞坏系统。
回复

使用道具 举报

3125#
发表于 2024-1-28 10:34:10 | 只看该作者
2011yaya2007777 发表于 2024-1-26 18:30
关键是不加载到内存能不能用?如果能用,干嘛要加载到内存?加载到内存难道不占用内存?悖论。

PC是老电脑了,系统加载至内存是因为在内存中运行得更快,同时不怕中病毒和木马,也不怕各种软件搞坏系统。
回复

使用道具 举报

3124#
发表于 2024-1-26 18:30:09 来自手机 | 只看该作者
关键是不加载到内存能不能用?如果能用,干嘛要加载到内存?加载到内存难道不占用内存?悖论。
回复

使用道具 举报

3123#
发表于 2024-1-26 18:16:08 | 只看该作者
2011yaya2007777 发表于 2024-1-26 17:04
map --mem --top 修改为  map 试一试

感谢指点,按这方法启动后,可用空间倒是也变成6.6GB,但这样就没有将系统加载至内存的功效了。
回复

使用道具 举报

3122#
发表于 2024-1-26 17:04:35 来自手机 | 只看该作者
map --mem --top 修改为  map 试一试
回复

使用道具 举报

3121#
发表于 2024-1-26 11:32:46 | 只看该作者
请教楼主,同一VHD文件,用不同方法启动,为何可用空间区别很大?
第一种方法启动:
title win10 HD
uuid (hd0,2)
chainloader /efi/grub/ntloader initrd=/efi/grub/initrd.lz1 uuid=%?_UUID% file=/win10/win10.vhd启动完成后可用空间为6.5GB

第二种方法启动
title win10 --mem(hd)
map --mem --top (hd0,2)/win10/win10.vhd (hd)
chainloader (hd-1)
启动完成后可用空间就变为985MB

请问如何解决这个?谢谢!


回复

使用道具 举报

3120#
发表于 2024-1-12 18:01:02 | 只看该作者

十分感谢!这个已经可以了。
我关注这个功能是在实验在硬盘上安装多个linux系统并启动。其中内核参数需要boot=/dev/sda13这样的参数,但是不方便的,具体办法是查找uuid传递给内核boot=uuid=xxxxxxxx之类的。
具体办法:一、用find发现一个自己预先建立的标识文件,再用uuid查找该分区的uuid再传递给内核;二、预先设置卷标,用vol查找分区,再用uuid查找uuid值再传递给内核;三、预先查找linux分区的uuid,用变量传递给内核。其中办法二最方便,用磁盘工具给linux分区设置一个唯一卷标就行,这样安装几种linux也可以轻松启动了。
回复

使用道具 举报

3119#
发表于 2024-1-12 15:27:49 | 只看该作者
这次应当可以了。

grldr.rar

175 KB, 下载次数: 13, 下载积分: 无忧币 -2

回复

使用道具 举报

3118#
发表于 2024-1-12 11:10:09 | 只看该作者

vol和uuid返回(hd44#)这样的值,其中#是类似各种制表符的怪符号。还是有问题的。官网的只要不超过10个分区不会出错。
回复

使用道具 举报

3117#
发表于 2024-1-11 16:20:56 | 只看该作者
本帖最后由 2011yaya2007777 于 2024-1-12 15:28 编辑
用find命令查找一个文件ISO等,再用vol和uuid查找label和uuid没问题。如:一个ISO文件在(hd0,13),

试一试这个。
回复

使用道具 举报

3116#
发表于 2024-1-9 09:25:22 | 只看该作者
2011xnsfgw 发表于 2023-12-11 17:49
2023-11-27官网的grldr问题依旧,你发的grldr变了,但仍有问题。
find命令正常:(hd0,0)一直到(hd0,14) ...

用find命令查找一个文件ISO等,再用vol和uuid查找label和uuid没问题。如:一个ISO文件在(hd0,13),
vol (hd0,13)返回label卷标,uuid (hd0,13)返回UUID值是正确的。
但如果已知(hd0,13)的卷标为yyzz,则vol yyzz返回的值则不是(hd0,13)而是(hd0,%)等值,导致%@root%值错误。同理,如果已知uuid,则UUID xxxxx-yyyy返回的值导致%@root%值错误。
回复

使用道具 举报

3115#
发表于 2023-12-11 17:49:06 | 只看该作者
2011xnsfgw 发表于 2023-12-11 17:29
使用的是grub4dos.chenall.net下载的grldr,编译时间是2022-01-18.
你新编译的我试一下,有无问题我再 ...

2023-11-27官网的grldr问题依旧,你发的grldr变了,但仍有问题。
find命令正常:(hd0,0)一直到(hd0,14),共15个分区,输出正常。
vol和uuid命令:(hd0,0)一直到(hd0,9)正常,后面输出(hd0,b),(hd0,c),(hd0,d),(hd0,e),还是少一个分区,输出仍然不正确。应该和find命令一样,输出的分区表示应为(hdx,y),x和y均为数字。(hd0,b)在grub4dos中是不认的。
回复

使用道具 举报

3114#
发表于 2023-12-11 17:29:44 | 只看该作者
不点 发表于 2023-12-8 15:29
下载次数为 0,——咦?—— 难道说,积分少的人,没法下载?嗯??

想到一个办法,用 email。

使用的是grub4dos.chenall.net下载的grldr,编译时间是2022-01-18.
你新编译的我试一下,有无问题我再反馈。
回复

使用道具 举报

3113#
发表于 2023-12-8 16:35:09 | 只看该作者
2011xnsfgw 发表于 2023-12-8 09:31
BUG反馈:
启动硬盘上的Linux系统,需要查找内核所在分区,以及向内核传递参数。kennel (hdx,y)/vmlinuz   ...

如果因为权限问题不方便上传图片,可以去github上提issue
回复

使用道具 举报

3112#
发表于 2023-12-8 16:12:41 | 只看该作者
分区类型有:fat32,ntfs,exfat,ext4等。

所问非所答。

你不是反馈:
“vol和uuid命令发生错误,可以发现(hd0,0)到(hd0,9)这些分区,而后面的分区成了如:(hd0,;),(hd0,<),(hd0,=)....."
这个问题解决否?
回复

使用道具 举报

3111#
发表于 2023-12-8 15:29:20 | 只看该作者
本帖最后由 不点 于 2023-12-8 15:32 编辑

下载次数为 0,——咦?—— 难道说,积分少的人,没法下载?嗯??

想到一个办法,用 email。

回复

使用道具 举报

3110#
发表于 2023-12-8 15:27:08 | 只看该作者
2011xnsfgw 发表于 2023-12-8 15:13
分区类型有:fat32,ntfs,exfat,ext4等。

你在打什么哑谜?
回复

使用道具 举报

3109#
发表于 2023-12-8 15:13:43 | 只看该作者

分区类型有:fat32,ntfs,exfat,ext4等。
回复

使用道具 举报

3108#
发表于 2023-12-8 10:54:22 | 只看该作者
请测试
回复

使用道具 举报

3107#
发表于 2023-12-8 10:49:53 | 只看该作者

0.4.6a (Legacy BIOS)
回复

使用道具 举报

3106#
发表于 2023-12-8 10:42:42 | 只看该作者
本帖最后由 2011yaya2007777 于 2023-12-8 10:49 编辑
BUG反馈:

legacy bios?
uefi?

grldr.rar

175.13 KB, 下载次数: 6, 下载积分: 无忧币 -2

点评

下载次数为 0,——咦?—— 难道说,积分少的人,没法下载?嗯??  详情 回复 发表于 2023-12-8 15:29
0.4.6a (Legacy BIOS)  详情 回复 发表于 2023-12-8 10:49
回复

使用道具 举报

3105#
发表于 2023-12-8 09:31:30 | 只看该作者
BUG反馈:
启动硬盘上的Linux系统,需要查找内核所在分区,以及向内核传递参数。kennel (hdx,y)/vmlinuz  root=/dev/sda? #或root=LABEL=%label1%  或 root=UUID=%uuid_1%
内核参数问题:
1、root=/dev/sda?这个在分区不变时没问题,但在改变分区个数(增加或减少)时,该值会发生变化,需要重新确定。
2、root=LABEL=%label1% 这个在不改变卷标时没问题,但改变或删除卷标会发生问题。
3、 root=UUID=%uuid_1%这个是最稳定的,只要不重新格式化该分区,UUID是确定的。
比如:
1、通过在安装好的linux分区建立一个空文件(如:centos9.txt),查找该文件,确定(hdx,y),如(hd0,7),再确定该分区卷标或UUID传递给Linux内核。
2、通过查找卷标,确定(hdx,y),如(hd0,7),并将卷标传递给Linux内核。
3、通过查找UUID,确定(hdx,y),如(hd0,7),并将UUID传递给Linux内核。
4、如上,root=/dev/sda?并不好用,因为是需要预先确定,而且GNU Grub2和grub4dos以及Linux内核对分区表示方法并不一致。
现在可以通过GNU Grub2的search和probe组合可以实现上述目的,而grub4dos for legacy bios最新版用find和vol以及uuid命令时发生问题,有BUG的。
因反复对分区改变,改变大小或增加分区,分区增加到10多个,grub4dos的vol和uuid命令发生错误!图片发不上来,文字描述一下!
find命令正常,可以发现(hd0,0)到(hd0,13)所有分区,--set-root是正常的。
而vol和uuid命令发生错误,可以发现(hd0,0)到(hd0,9)这些分区,而后面的分区成了如:(hd0,;),(hd0,<),(hd0,=),并丢了一个分区。也就是说这两个命令对第十一个(含)以后的分区返回的分区值是错误的。如需要截图,加QQ:1121621061,可以反馈截图。
希望修正错误!
另外,在legacy bios下的grub4dos已很好用,个人认为grub4dos for UEFI开发重点应放在和原grub4dos重要功能相同或相似功能上面,比如像a1ive grub2的map功能,以及网络功能的开发。而目前开发者对windows的VHD、wim文件的支持花费了大量精力,其实对wim的支持能够利用ipxe的wimboot即可,因为windows对自身的vhd和wim支持已相当完善,只是菜单不好看需要编辑BCD而已。也可以增加或借用ventoy的linux vhd的支持。
回复

使用道具 举报

3104#
发表于 2023-12-8 07:48:53 | 只看该作者
论坛级别不够,发不了新贴,如何反馈BUG?
回复

使用道具 举报

3103#
发表于 2023-11-3 22:44:57 来自手机 | 只看该作者
谢谢yaya大佬解答,那我如果是通过别的引导器引导它,是否也可以放在盘任意分区呢还是只能放在第一分区?
回复

使用道具 举报

3102#
发表于 2023-10-31 10:24:02 | 只看该作者
我想问一下yaya大大,grub4dos启动文件必须放在U盘第一分区且分区格式必须为fat格式吗?

bios模式:
1. grub.mbr启动:任意。
2. grub.pbr启动:1)在mbr激活引导分区。2)在pbr使用grub4dos引导代码。3)分区根目录有grldr.

uefi模式:
1. 启动分区一般必须是fat格式,除非你主板的启动芯片支持从其他格式的分区启动,或者你自己注入驱动。
2. 在启动分区有 efi -> boot -> bootx64.efi(即G4E)
回复

使用道具 举报

3101#
发表于 2023-10-30 23:09:36 来自手机 | 只看该作者
但是我看ventoy第一个分区就是为exfat格式,它的bios启动方法是不是通过将启动文件写入分区前的1m间隙空间里来达到启动的目的,那么grub4dos是否也可以在exfat分区前弄弄一个1m间隙放grub4dos的启动文件来达到在exfat分区里也能启动grub4dos呢?另外,我看见有的pe把grub4dos放在第二个分区,分区格式为fat32,也就是说bios启动文件和uefi启动文件都放在第二个区,bios模式也能启动,不知道是怎么做到的?
回复

使用道具 举报

3100#
发表于 2023-10-30 23:01:28 来自手机 | 只看该作者
我想问一下yaya大大,grub4dos启动文件必须放在U盘第一分区且分区格式必须为fat格式吗?我用bootice写入引导,当分区格式为exfat格式时启动不了,但是通过grub2调用grldr文件时可以启动。或者我把U盘分为两个区,第二个区为UEFI区,分区格式为fat32,我把启动文件放在这个区里,用bootice写入引导也启动不了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-20 10:54

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表