linglongx 发表于 2016-4-17 22:24:09

GRUB2增强型模块发布 GRUB2.02~beta3-for-windows(完美一键定制)

本帖最后由 linglongx 于 2016-9-9 18:06 编辑

2016-9-9
GRUB2.02~beta3制成BIOSUEFI_X32 UEFI_X64三启光盘镱像一键生成,下载好附件解压后按照里面的说明文本生成即可.

https://pan.baidu.com/s/1bpwRaGJ#path=%252F%25E5%2588%2586%25E4%25BA%25AB%25E6%2596%2587%25E4%25BB%25B6%25E5%25A4%25B9%252FGRUB2



2016-4-25
grub2制成 DELL slicV2.3 引导.
希望大家测试并反馈一下。
用法:


把系统根目录下的 bootmgr 文件改名为 boormgr7 下载的文件解压后更名为 bootmgr 放到 系统盘根目录

如果不想直接引导进系统则将系统原来的 boormgr更改为其它名称 再自己用 GRUB2.02~beta3-for-windows 生成光盘版引导文件
把生成的 boot文件夹复制到系统盘覆盖系统盘的boot文件夹,注意看看系统盘中的Boot文件夹,如果第一个字母是大写B则改为小写的boot
之后编辑boot\grub\grub-bios.cfg 加入引导原boormgr改名后的启动项(也即启动系统)


欢迎喜欢拆腾的人加入 GRUB2编译与定制QQ群 512143502



2016-4-19
   这几天研究grub2,发现grub2中有个date命令很好用,可以在grub2控制台或配置文件用来修改系统日期与时间,在控制台中还能输出系统当前时间。

date命令的语法是: date 不带参数   在控制台输出系统当前日期与时间
                              date yyyy-mm-dd hh:mm:ss 修改系统当前日期与时间
                              date yyyy-mm-dd                修改系统当前日期
                              date hh:mm:ss                  修改系统当前时间



但是如果我要根据日期或时间来判断什么时间或日期开启什么功能或菜单项该怎么办呢,官方的date模块命令只能在控制台中输出系统当前日期与时间,

无法放到变量中用来作判断条件。默认grub2所有命令的返回值只有0与1,即成功与否。

如是下载了一份grub原码重新改写了一下date模块原码,加入了 h 参数 ,用来返回系统当前日期。在ubuntukylin-15.10-desktop编译通过;

编译出的date模块在grub-2.02-for-windows中使用通过。


使用方法如下:

1.用本模块替换grub2模块目录中的date模块。或是替换grub-2.02-for-windows中 i386-pc 中的date模块,再自行生成启动映像。
(不会的可以看 本论坛

極限驅動的帖子
http://bbs.wuyou.net/forum.php?m ... 9411&extra=page%3D1

2012angelkyo   的帖子
http://bbs.wuyou.net/forum.php?m ... 5871&extra=page%3D1


2.控制台中测试

进入控制台普通模式(在启动菜单介面按 C 或是 Ctrl + C 进入控制台命令模式)

grub>date h
grub>vv=$?
grub>echo $vv
grub>20160417
grub>


(注:vv 为声明的个人环境变量,用来保存 date h 命令返回的日期,名称可以自定义,不过不能与grub2的原字符与保留字相同;
         $ 为变量引用运算符,后面紧跟变量名即获得变量值; 而 $? 即为获得上一命令的返回值,那么 vv=$? 当然就是把 date h 的
          返回值保存到变量 VV 中;echo $vv即是输出变量的值;这儿还要注意一点的就是vv=$? 这儿的赋值表达式,grub2同很多
         编程语言的宽松赋值格式不同, vv=$? 中的 = 号两边一定不能有空格。)


2.菜单中应用

   在菜单中可以这样写:


date h
hh=$?

if [ "${hh}" -gt "20160101" ]; then
   #判断系统时期是否大于 20160101
echo "system is 20s stdudown"
#显示提示信息,注:这儿不能使用中文,使用中文乱码
   
   sleep -v 20
#设置20秒延时并显示倒计时

   halt
#关闭计算机
fi

#这儿的 fi 不能漏了

#严格注意语法,不然会出错.
#if [ "${hh}" -gt "20160101" ]; then 这一句是这么个格式的   if空格[空格"${hh}"空格-gt空格"20160101"空格];空格then
#
#
还可以这样写:

date h
hh=$?

if [ "${hh}" -gt "20160101" ]; then
   #判断系统时期是否大于 20160101
echo "system is 20s stdudown"
#显示提示信息,注:这儿不能使用中文,使用中文乱码
   
   sleep -v 20
#设置20秒延时并显示倒计时

   halt
#关闭计算机


else

menuentry "启动 MaxDos7强化版(各种DOS下的磁盘、BIOS及网克工具)" --class osx --class frugalware {
      insmod part_msdos
      insmod fat
      linux16 /boot/grub/memdisk img raw
      initrd16 /boot/grub/imgs/MAXDOS.IMG
}


fi


如果使用 if....else....fi   语句,记得 else 与 fi 之间一定要有命令内容,不然也会出错。



最后要注意的是不能在内嵌菜单中使用.加载内嵌菜单时很多模块没有加载使用,所以很多命令不能用,
这儿的内嵌菜单是指使用grub-mkimage.exe -d i386-pc -C auto -c out\grub-bootstrap-bios-hd.cfg -p /boot/grub -o .\out\core.img -O i386-pc -v biosdisk part_msdos fat ntfs search_fs_file

命令生成启动映像时的 grub-bootstrap-bios-hd.cfg这儿的菜单



本增强模块暂时只加入了返回日期的功能,有时间再加上返回时间的功能



附上 GRUB2 中脚本的条件判断运算符

其实同 Bosh 脚本语言差不多,不过因为 < 与 > 在grub2中属于保留字符,所以下面这些条目中带 < 或 > 的条目不能直接用
< 可以用-lt      ,   <=    >    >= 可以按下面的相关运算符代替。

在菜单中还可以用转义符/来代替 ,如<可以使用/< 代替
不过在控制台就无法使用转义符.





string1 == string2

string1 != string2


string1 < string2
string1 <= string2
string1 > string2
string1 >= string2


integer1 -eq integer2

integer1 -ge integer2

integer1 -gt integer2

integer1 -le integer2

integer1 -lt integer2

integer1 -ne integer2

prefixinteger1 -pgt prefixinteger2 [剔除非数字字符首部之后,integer1 大于
integer2]

prefixinteger1 -plt prefixinteger2 [剔除非数字字符首部之后,integer1 小于
integer2]

file1 -nt file2

file1 -ot file2

-d file

-e file

-f file

-s file

-n string

string

-z string

( expression )将 expression 视为一个整体(分组)

! expression非(NOT)

expression1 -a expression2与(AND)

expression1 -o expression2或(OR)



编译自用的 GRUB2.02~beta3-for-windowsi386-pc   i386-efix86_64-efi 三个平台的模块都已加入本增强型date.mod模块。


要的朋友在这儿下:

http://pan.baidu.com/s/1bpwRaGJ



devilma 发表于 2016-4-18 07:24:09

谢谢!学习一下了……

青青草 发表于 2016-4-18 10:21:45

帮顶一下!

pky317 发表于 2016-4-18 13:02:16

楼主能为grub2添加一个SLIC模块吗?
下面是grub4dos的SLIC补丁源码
https://github.com/liudongmiao/grub4dos-patch

青青草 发表于 2016-4-19 17:28:01

本帖最后由 青青草 于 2016-4-19 17:29 编辑

if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then
好像不起作用!

青青草 发表于 2016-4-20 00:05:26

本帖最后由 青青草 于 2016-4-20 00:08 编辑

不是设备名的问题!
用极限驱动定制的或者用2012angelkyo定制的,则
if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then
都不起作用!
但用神雕定制的,却能起作用!
不知何故?

linglongx 发表于 2016-4-20 00:19:38

刚才在控制台中测试了一下,test [ -f ($device)/bootmgr ] -a [ -f ($device)/boot/bcd ]也不行 ,只会判断-f ($device)/bootmgr 是否成立,如果这个条件成立,后面的条件就无效。

不过我使用test [ 6 -gt 5 -a 6 -gt 2 ] 是能成功返回的。只要把5或2改成大于或等于6的数返回就是1 .   test [ -f ($device)/bootmgr ] 也是成立的,只要文件存在就返回0不存在就返回1 。 可能是grub2不支持太长的条件式吧。

你可以变通一下.

test [ -f ($device)/bootmgr ]
#测试bootmgr文件是否存在
a=$?
#把测试返回值保存到变量a中
test [ -f ($device)/boot/bcd ]
#测试bcdr文件是否存在
b=$?
#把测试返回值保存到变量b中
if [ $a -eq 0-eq $b -eq 0] ; then

linglongx 发表于 2016-4-20 00:30:39

青青草 发表于 2016-4-20 00:05
不是设备名的问题!
用极限驱动定制的或者用2012angelkyo定制的,则
if test -f ($device)/bootmgr -a - ...

可能是那两个定制版加载的模块不全吧。你有没有试试神雕定制的环境下 如果第二个文件不存在是否会起作用,我测试 test [ -f ($device)/bootmgr ] -a [ -f ($device)/boot/bcd ],只会判断-f ($device)/bootmgr 是否成立,如果这个条件成立,后面的条件就无效

青青草 发表于 2016-4-20 00:37:07

linglongx 发表于 2016-4-20 00:30
可能是那两个定制版加载的模块不全吧。你有没有试试神雕定制的环境下 如果第二个文件不存在是否会起作用 ...

试了,神雕定制的环境下 如果第二个文件不存在能起作用。

linglongx 发表于 2016-4-20 00:44:37

青青草 发表于 2016-4-20 00:37
试了,神雕定制的环境下 如果第二个文件不存在能起作用。

在我这儿的GRUB2环境中 test [ -f ($device)/bootmgr ] -a [ -f ($device)/boot/bcd ] 只要bootmgr存在就返回0不存在就返回1, bcd文件存不存在都不影响返回值.如果如你所说那可能神雕编译出来的GRUB2修复了官方的BUG,我这儿环意是我用GRUB2官方源码定制的

linglongx 发表于 2016-4-20 01:29:34

青青草 发表于 2016-4-20 00:37
试了,神雕定制的环境下 如果第二个文件不存在能起作用。

刚下了grub-2.02~beta3的源码重新编译测试 test -f ($device)/bootmgr -a -f ($device)/boot/bcd 通过,只要其中一个文件不存在就返回1

把编译出来的模替换 极限驱动与2012angelkyo发过的 GRUB2 for windows中 I386-PC 全部模块 定制出来的GRUB2启动镱像也能通过测试

青青草 发表于 2016-4-20 07:22:01

linglongx 发表于 2016-4-20 01:29
刚下了grub-2.02~beta3的源码重新编译测试 test -f ($device)/bootmgr -a -f ($device)/boot/bcd 通过, ...

可否提供一下grub-2.02~beta3的下载地址?

窄口牛 发表于 2016-4-20 07:50:13

下载容易,不会用。

青青草 发表于 2016-4-20 09:19:06

linglongx 发表于 2016-4-20 01:29
刚下了grub-2.02~beta3的源码重新编译测试 test -f ($device)/bootmgr -a -f ($device)/boot/bcd 通过, ...

或者直接把你重新编译的I386-PC 、i386-efi、x86_64-efi全部模块发上来,可以吗?先谢谢了!

pky317 发表于 2016-4-20 10:01:21

模拟SLIC的软件,无论是针对BIOS还是UEFI,网上都有下载,不过还没有发现有基于grub2的,其实那个GRUB4DOS补丁能否移到grub2,我也不懂,楼主如果感兴趣有时间,不妨研究一下,没时间就算了

窄口牛 发表于 2016-4-20 12:32:54

青青草 发表于 2016-4-20 09:19
或者直接把你重新编译的I386-PC 、i386-efi、x86_64-efi全部模块发上来,可以吗?先谢谢了!

这个可以有。下载地址晚上回去发,我那停电,出门了

linglongx 发表于 2016-4-20 20:36:04

青青草 发表于 2016-4-20 07:22
可否提供一下grub-2.02~beta3的下载地址?

grub2最新的发布版本的源代码可从ftp://alpha.gnu.org/gnu/grub/获得

青青草 发表于 2016-4-20 20:51:23

linglongx 发表于 2016-4-20 20:36
grub2最新的发布版本的源代码可从ftp://alpha.gnu.org/gnu/grub/获得

不是WINDOWS的,我没有编译环境。能否把你重新编译的I386-PC 、i386-efi、x86_64-efi全部模块共享一下?
谢谢了!

窄口牛 发表于 2016-4-20 21:17:16

期待楼主共享mod包。

linglongx 发表于 2016-4-20 22:57:39

本帖最后由 linglongx 于 2016-4-21 18:22 编辑

青青草 发表于 2016-4-20 20:51
不是WINDOWS的,我没有编译环境。能否把你重新编译的I386-PC 、i386-efi、x86_64-efi全部模块共享一下?
...

正在编译中。


欢迎喜欢拆腾的人加入 GRUB2编译与定制QQ群 512143502

青青草 发表于 2016-4-21 02:21:06

谢谢分享!
你编译的 GRUB2.02~beta3-for-windowsi386-pc   i386-efix86_64-efi 三个平台的模块,解决了:
(1)if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then 失效问题;
(2)在BIOS环境下,关闭计算机命令halt 失效问题。
再次谢谢了!

窄口牛 发表于 2016-4-21 07:25:34

感谢楼主的共享。

窄口牛 发表于 2016-4-21 07:25:40

感谢楼主的共享。

窄口牛 发表于 2016-4-21 08:43:52

是不是设置号码不找到

devilma 发表于 2016-4-21 09:03:29

你这个群号对吗?楼主

linglongx 发表于 2016-4-21 18:24:28

那个群是以前做其它用的,很久不用了,不知道为什么现在用不了,刚弄了个新群 512143502

窄口牛 发表于 2016-4-22 08:29:00

为什么没有Linuxefi.mod?这个命令是有验证签名功用。

窄口牛 发表于 2016-4-22 08:29:03

为什么没有Linuxefi.mod?这个命令是有验证签名功用。

窄口牛 发表于 2016-4-22 08:31:47

官网上有这个命令的介绍,为什么包里都没有?

linglongx 发表于 2016-4-22 13:46:37

窄口牛 发表于 2016-4-22 08:31
官网上有这个命令的介绍,为什么包里都没有?

好像现在看到的GRUB2编译版都不带这个模块,源码包中也没有相关的模块代码。官网哪儿有介绍这个模块?发个网址我去看看。
页: [1] 2 3 4 5 6
查看完整版本: GRUB2增强型模块发布 GRUB2.02~beta3-for-windows(完美一键定制)