无忧启动论坛

 找回密码
 注册
搜索
一次装机 终生领工资最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
诚聘PE工具开发技术员QQ:1607112133系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
查看: 39530|回复: 29

[原创] 抛砖引玉:优盘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多重启动的粗浅思路

评分

参与人数 1无忧币 +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
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2019-4-20 16:54

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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