无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 60787|回复: 34

[原创] 抛砖引玉:优盘EFI Shell 安装系统及脚本的应用

    [复制链接]
发表于 2014-4-24 15:59:23 | 显示全部楼层 |阅读模式
本帖最后由 quya 于 2014-4-28 14:48 编辑

很久没来本论坛发帖了, 因为我不善于灌水。

最近搞了个3T的硬盘, 如何把系统装到该硬盘就成了个问题。

光盘安装自然是没问题的, 但光盘的速度无法恭维, 最要命的是叔已经不用光驱N年了。

优盘安装网上教程很多, 但大多数号称必须要格个4G左右的FAT32才行, FAT32多老的技术啊,我看着就揪心。

怎么办? 能不能FAT32分区少一点, 其他的格成NTFS (或者认为NTF伤优盘的, EXFAT也行啊), 把主要安装文件放在 NTFS或者EXFAT分区上?

经过度娘的搜索, 借鉴各位先行者的探索, 我终于有了个比较满意的方案。


第一步, 先把优盘分成2个区,用那个DiskGenius分, 分好之后很纠结, 只能显示一个分区, 但后来发现真是妙, 另一个分区被无意隐藏了,好得很哪。

以32G优盘为例, 第一个分区分成31G左右, 余下100多MB格式化成FAT32, 其实FAT32 只要几MB就行, 如果想再放个PE,那么几百MB也行。
开始的时候要往FAT32放东西,系统只能显示第一个分区, 那么先把第一个分区删除了, 系统就能认出只有100多MB的FAT32分区了,等把EFI Shell的需要的文件拷贝到FAT32之后, 再恢复第一个分区,第二个分区就被隐藏了,真没想到还有这样的妙用!


网上有很多EFI Shell的下载, 一般这个压缩包根目录有个shell.efi的文件,还有个APPS的子目录,如果下载下来的文件有这样的结构, 那么恭喜你,下对了。

将这些文件拷贝到优盘FAT32的根目录,然后新建个efi\boot目录, 将shell.efi 移到 \efi\boot\, 然后改shell.efi 成 bootx64.efi, 这样就可以从优盘启动EFI Shell了。 至于为什么要这样做,我也不知道, 只知道缺少任何一步,优盘就无法启动EFI Shell。


第二步,让EFI识别NTFS分区,度娘告诉我,本论坛的一个大神发现鬼佬有这么个驱动NTFS.EFI, 只要 load ntfs.efi 就行。我将这个文件拷贝到优盘根目录, 然后期望做个自动执行的脚本,将这句命令拷贝到startup.nsh里, 运行结果告诉我无法找到此文件。我再移到apps子目录, 以为很多命令都在这里,这里可能就是类似windows的system32目录,系统会自动找到,但依旧失望了。分析了运行过程, 发现原来映射的驱动器时时会改变, 一会儿FS0, 一会儿FS1,再来个BLK3之类的,真折腾人啊。 特别是运行了 map -r 之后,整个天翻地覆了, 驱动器到处乱跑,后来的事实证明 map命令根本不需要, 无论加什么参数。

第三步, 将我编制的startup.nsh拷贝到\efi\boot\下,ntfs.efi移到\apps下,(别的目录也行, 只是要修改脚本) 再将windows安装盘拷贝到第一个分区根目录,再多拷贝一个bootmgfw.efi (度娘或者windows安装目录里找)也到根目录, 这样就自动启动windows的安装程序了。

startup.nsh 源程序如下:

echo -off
if exist fs0:\apps\ntfs.efi then
set test "fs0:"
endif
if exist fs1:\apps\ntfs.efi then
set test "fs1:"
endif
if exist fs2:\apps\ntfs.efi then
set test "fs2:"
endif
if exist fs3:\apps\ntfs.efi then
set test "fs3:"
endif
if exist fs4:\apps\ntfs.efi then
set test "fs4:"
endif
if exist fs5:\apps\ntfs.efi then
set test "fs5:"
endif
if exist fs6:\apps\ntfs.efi then
set test "fs6:"
endif
if exist fs7:\apps\ntfs.efi then
set test "fs7:"
endif
if exist fs8:\apps\ntfs.efi then
set test "fs8:"
endif
if exist fs9:\apps\ntfs.efi then
set test "fs9:"
endif
if exist fsa:\apps\ntfs.efi then
set test "fsa:"
endif
if exist fsb:\apps\ntfs.efi then
set test "fsb:"
endif
load %test%\apps\ntfs.efi

if exist blk0:\bootmgfw.efi then
set test1 "blk0:"
endif
if exist blk1:\bootmgfw.efi then
set test1 "blk1:"
endif
if exist blk2:\bootmgfw.efi then
set test1 "blk2:"
endif
if exist blk3:\bootmgfw.efi then
set test1 "blk3:"
endif
if exist blk4:\bootmgfw.efi then
set test1 "blk4:"
endif
if exist blk5:\bootmgfw.efi then
set test1 "blk5:"
endif
if exist blk6:\bootmgfw.efi then
set test1 "blk6:"
endif
if exist blk7:\bootmgfw.efi then
set test1 "blk7:"
endif
if exist blk8:\bootmgfw.efi then
set test1 "blk8:"
endif
if exist blk9:\bootmgfw.efi then
set test1 "blk9:"
endif
if exist blka:\bootmgfw.efi then
set test1 "blka:"
endif
if exist blkb:\bootmgfw.efi then
set test1 "blkb:"
endif
%test1%\bootmgfw


为什么需要这么多的endif,我以为只要一个, 发现运行错误, 只能怪这个2b的shell脚本了。我本来还以为只要一个变量,只要重新赋值就行,后来证明我也错了, 所以不要怪我编这么繁琐的难看的脚本, 不是我的错。

本程序也只能应付大多数情况, 对于有好多硬盘,优盘,光盘的机器, 恐怕要修改下脚本了。因为脚本的编写只有这么几条简陋的命令, 没有dos里边 find for 之类的高级命令。 哦, 我错了, for命令也有, 只是...

2个疑问:

1. 本来按我的设想, 我在第一个分区建若干个子目录, 分别是win7, win8 之类的, 将安装盘分别拷入,然后只要执行类似 fsx:\win7\bootmgfw.efi 就能启动win7, fsx:\win8\bootmgfw.efi就能启动win8。 结果发现不行, \bcd 错误, 估计要改变 bcd 路径, 留待大家开发。懒惰的我还是这样布局的, 想换系统的时候直接将子目录的安装文件移到根目录,完了再移回去, 反正在一个分区, 移一下就2-3秒时间。

2. 启动efi shell, 有个1T的硬盘未分区,windows安装文件无法找到硬盘, 后来将它创建分区才可以(我随便创建了个MBR分区)。 当然我知道切换出去用diskpart可以创建分区,但不知道为什么会这样,这是个例还是所有未分区的都不能被EFI SHELL启动的windows安装程序识别? 留待大家验证, 并希望有人找到解决之道。


本文给大家提供个比较新颖的思路,希望大家加以完善。

如对以上内容感兴趣, 请点击 优盘实现 EFI+传统BIOS多重启动的粗浅思路

评分

参与人数 2无忧币 +10 收起 理由
Anson4 + 5 赞一个!
chishingchan + 5 很给力!

查看全部评分

 楼主| 发表于 2014-4-24 16:53:51 | 显示全部楼层
本帖最后由 quya 于 2014-4-24 18:22 编辑

补充下,经Faikee同学提醒,脚本应该可以简化成下面这样, 但尚未测试过

echo -off

for %test% in fs0 fs1 fs2 fs3 fs4 fs5 fs6 fs7 fs8 fs9 fsa fsb
if exist %test%:\apps\ntfs.efi then
load %test%:\apps\ntfs.efi
endif
endfor

for %test1% in blk0 blk1 blk2 blk3 blk4 blk5 blk6 blk7 blk8 blk9 blka blkb
if exist %test1%:\bootmgfw then
%test1%:\bootmgfw
endif
endfor

点评

还没有人测试么???  详情 回复 发表于 2015-8-28 18:21

评分

参与人数 1无忧币 +5 收起 理由
fujianabc + 5

查看全部评分

回复

使用道具 举报

发表于 2014-4-24 19:15:51 | 显示全部楼层
感谢楼主抛砖引玉,希望能逐渐普及efi shell脚本知识,以后有取代dos批处理的趋势
回复

使用道具 举报

发表于 2014-4-25 00:04:29 | 显示全部楼层
支持分享,学习了
回复

使用道具 举报

发表于 2014-4-25 21:20:47 | 显示全部楼层
不错,后面的那个真是精简了代码啊。。。
回复

使用道具 举报

发表于 2014-4-25 21:42:34 | 显示全部楼层
本帖最后由 ali88home 于 2014-4-28 13:24 编辑

简化的。。我测试过,怎么木有成功。

回复

使用道具 举报

发表于 2014-4-26 00:09:54 | 显示全部楼层
作为菜鸟不能只是观望,我选择用力的往上顶!
回复

使用道具 举报

发表于 2014-4-28 17:19:42 | 显示全部楼层
很高兴看到这样的脚本。
如果是为了安装系统,可以不必这样做,因为安装系统也是在PE下进行的。我是这样解决的,UEFI启动X64的Win8PE,用PE内嵌微软的ISO挂载系统安装盘镜像(双击即可挂载),然后双击镜像内的setup.exe,后面的过程就跟从光盘启动安装系统的过程一模一样了。

点评

你确定这样能装成efi启动的系统吗? 似乎装的还是传统方式的吧, 如果运行setup的话。  详情 回复 发表于 2014-4-28 18:51
回复

使用道具 举报

 楼主| 发表于 2014-4-28 18:51:50 | 显示全部楼层
本帖最后由 quya 于 2014-4-28 18:55 编辑
yaojy 发表于 2014-4-28 17:19
很高兴看到这样的脚本。
如果是为了安装系统,可以不必这样做,因为安装系统也是在PE下进行的。我是这样解 ...


你确定这样能装成efi启动的系统吗? 似乎装的还是传统方式的吧, 如果运行setup的话。当然我没这样试过, 只是猜测。

如果真如你说, 我的方法是多次一举了。

还有, 我试了2个efi x64pe, 都无法从我的第四分区启动, 所以无法验证运行setup能否如你所说,能否告知我你用的哪个pe? 谢谢。

点评

当PE时uefi方式启动的时候,安装的系统就是uefi启动方式  详情 回复 发表于 2014-4-28 22:10
我就是这样安装x64的Win7/8/8.1的(UEFI+GPT/MBR)。 x64的Win7/8的PE/RamOS经测试都可以成功安装的。所用的PE是我自己利用论坛的脚本做的。 其它人做的PE行不行我不知道,不过从论坛的反馈帖看,某些PE因为精简问  详情 回复 发表于 2014-4-28 20:50
回复

使用道具 举报

发表于 2014-4-28 20:50:07 | 显示全部楼层
quya 发表于 2014-4-28 18:51
你确定这样能装成efi启动的系统吗? 似乎装的还是传统方式的吧, 如果运行setup的话。当然我没这样试过 ...


我就是这样安装x64的Win7/8/8.1的(UEFI+GPT)。
x64的Win7/8的PE/RamOS经测试都可以成功安装的。所用的PE是我自己利用论坛的脚本做的。
其它人做的PE行不行我不知道,不过从论坛的反馈帖看,某些PE因为精简问题,导致安装时出现DISM方面错误而失败。

点评

谢谢答复。 问题是我下的2个pe, 在uefi启动下, 一个直接跳回bios logo 死掉, 一个出现黑屏,鼠标点击之后只出现鼠标图案, 无法操作。 等我找到个合适pe, 再试一下, 再次感谢。  详情 回复 发表于 2014-4-28 20:59
回复

使用道具 举报

 楼主| 发表于 2014-4-28 20:59:02 | 显示全部楼层
yaojy 发表于 2014-4-28 20:50
我就是这样安装x64的Win7/8/8.1的(UEFI+GPT)。
x64的Win7/8的PE/RamOS经测试都可以成功安装的。所用 ...

谢谢答复。

问题是我下的2个pe, 在uefi启动下, 一个直接跳回bios logo 死掉, 一个出现黑屏,鼠标点击之后只出现鼠标图案, 无法操作。

等我找到个合适pe, 再试一下, 再次感谢。
回复

使用道具 举报

发表于 2014-4-28 22:10:55 | 显示全部楼层
quya 发表于 2014-4-28 18:51
你确定这样能装成efi启动的系统吗? 似乎装的还是传统方式的吧, 如果运行setup的话。当然我没这样试过 ...

当PE时uefi方式启动的时候,安装的系统就是uefi启动方式

点评

你似乎也是做PE的, 我过2天试试你的PE。 反正无垠和hpy的pe在我的机子上不行, 难道需要把pe放在第一分区? 不能在其他分区? 最近的pe热衷用一些什么native,0pe 技术等等, 兼容性大大降低,如果用老的pe,  详情 回复 发表于 2014-4-28 22:32
回复

使用道具 举报

 楼主| 发表于 2014-4-28 22:32:38 | 显示全部楼层
阿弥陀佛 发表于 2014-4-28 22:10
当PE时uefi方式启动的时候,安装的系统就是uefi启动方式

你似乎也是做PE的, 我过2天试试你的PE。

反正无垠和hpy的pe在我的机子上不行, 难道需要把pe放在第一分区? 不能在其他分区?

最近的pe热衷用一些什么native,0pe 技术等等, 兼容性大大降低,如果用老的pe, 软件什么的也都是老的, 不爽啊。

我强烈建议pe不要搞什么极速啊,加载各类莫名其妙的驱动啊之类的, 毕竟用它装系统的时候多, 除了网卡驱动局域网内有点用, 其他声卡,显卡, 甚至raid(只在特定小范围)有啥用啊。

点评

声显卡我也觉得没必要搞。raid还是有必要集成的。其实我是很懒,久久才更新一次,所以我那个PE驱动有些不足。有空考虑多整合一些驱动。  发表于 2014-4-29 07:41
回复

使用道具 举报

发表于 2014-5-1 12:01:23 | 显示全部楼层
本帖最后由 ali88home 于 2014-5-1 12:03 编辑

UEFI进入PE,使用WinNTSetup安装,试试看

这种UEFI安装方式,容易找不到U盘光盘驱动, 我试过了。
回复

使用道具 举报

发表于 2014-8-3 22:24:00 | 显示全部楼层
我实现了在一个U盘上分别启动win7和win8.1的安装的。也挺简单的。一个EFI文件夹,一个win7文件夹,一个win8.1文件夹。主要是要修改BCD配置文件以分别对应win7和win8.1的路径及启动文件。但是唯一遗憾的是启动菜单是英文的,我想了很久也没办法弄成支持中文的,呵呵。

点评

也正在弄U盘多系统安装,想知道你是怎么修改BCD配置文件的?  详情 回复 发表于 2015-8-15 08:21
中文支持其实很容易,就加(替换)几个文件,不过也不用分别启动win7/8的boot.wim。貌似x86的boot.wim也可以安装X64的系统,因为本质是释放install.wim和生成启动,所以是通用的。可以将win7/8的install.wim整合到一  详情 回复 发表于 2014-8-4 18:36
回复

使用道具 举报

发表于 2014-8-4 18:36:39 | 显示全部楼层
dxx_2014 发表于 2014-8-3 22:24
我实现了在一个U盘上分别启动win7和win8.1的安装的。也挺简单的。一个EFI文件夹,一个win7文件夹,一个win8 ...

中文支持其实很容易,就加(替换)几个文件,不过也不用分别启动win7/8的boot.wim。貌似x86的boot.wim也可以安装X64的系统,因为本质是释放install.wim和生成启动,所以是通用的。可以将win7/8的install.wim整合到一起,调整一下说明文件,就可以用boot.wim选择安装所需的版本。

点评

后来找到了一个bootx64.efi支持中文的,体积比直接从win8.1提取的要小一点,不知道为什么。我是自己电脑安装了win7和win8.1,所以制作了一个U盘,把win7和win8.1都复制在U盘上了,搞了这么个安装选择启动器,只能想  详情 回复 发表于 2014-8-4 19:05
回复

使用道具 举报

发表于 2014-8-4 19:05:37 | 显示全部楼层
yaojy 发表于 2014-8-4 18:36
中文支持其实很容易,就加(替换)几个文件,不过也不用分别启动win7/8的boot.wim。貌似x86的boot.wim也 ...

后来找到了一个bootx64.efi支持中文的,体积比直接从win8.1提取的要小一点,不知道为什么。我是自己电脑安装了win7和win8.1,所以制作了一个U盘,把win7和win8.1都复制在U盘上了,搞了这么个安装选择启动器,只能想这些笨办法,嘿嘿。

点评

自己感觉好就行......  发表于 2014-8-6 10:37
回复

使用道具 举报

发表于 2015-8-15 08:21:40 | 显示全部楼层
dxx_2014 发表于 2014-8-3 22:24
我实现了在一个U盘上分别启动win7和win8.1的安装的。也挺简单的。一个EFI文件夹,一个win7文件夹,一个win8 ...

也正在弄U盘多系统安装,想知道你是怎么修改BCD配置文件的?
回复

使用道具 举报

发表于 2015-8-28 18:21:29 | 显示全部楼层
quya 发表于 2014-4-24 16:53
补充下,经Faikee同学提醒,脚本应该可以简化成下面这样, 但尚未测试过

echo -off

还没有人测试么???
回复

使用道具 举报

发表于 2017-6-25 10:41:26 | 显示全部楼层
楼主,有没有办法实现删除ntfs中的文件,我发现加载ntfs.efi后只能读取而不能删除
回复

使用道具 举报

发表于 2018-12-7 21:27:36 | 显示全部楼层
好文章,正好是需要了解的。。
回复

使用道具 举报

发表于 2019-1-31 14:13:06 | 显示全部楼层
为什么做成grub2光盘,进入EFI SHELL查看文件,永远只有一个文件夹:efi\boot\;而且只有bootia32.efi 和bootx64.efi两个文件,其它目录文件都看不到。
QQ截图20190131121755.jpg
回复

使用道具 举报

发表于 2019-1-31 14:34:36 | 显示全部楼层
RUFUS 用这个吧,简单粗暴,支持MBR与EFI同时存在
回复

使用道具 举报

发表于 2020-8-1 11:30:28 | 显示全部楼层
2010haiven86 发表于 2019-1-31 14:13
为什么做成grub2光盘,进入EFI SHELL查看文件,永远只有一个文件夹:efi\boot\;而且只有bootia32.efi 和bo ...

有找到办法吗,同有这个问题
回复

使用道具 举报

发表于 2020-8-5 20:19:40 | 显示全部楼层
学习了。
回复

使用道具 举报

发表于 2022-2-9 15:08:54 | 显示全部楼层
ali88home 发表于 2014-4-25 21:42
简化的。。我测试过,怎么木有成功。

echo -off
for %a in fs0 fs1 fs2 fs3 fs4 fs5 fs6 fs7 fs8 fs9 fsa fsb
if exist %a:\Apps\ntfs.efi then
set test "%a:"
endif
endfor
load %test%\Apps\ntfs.efi

for %a in blk0 blk1 blk2 blk3 blk4 blk5 blk6 blk7 blk8 blk9 blka blkb
if exist %a:\bootmgfw.efi then
set test1 "%a:"
endif
endfor
%test1%\bootmgfw.efi
回复

使用道具 举报

发表于 2022-11-19 16:02:39 | 显示全部楼层
还有这法,学习了。
回复

使用道具 举报

发表于 2022-12-5 14:04:19 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 04:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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