|
本帖最后由 hzican 于 2016-4-7 23:16 编辑
用了几年内存操作系统,一直偷懒,没有认真研究系统的精简,可是发现新的的操作系统体积庞大,又没有出现让人感兴趣的新功能,一直感叹主持微软操作系统开发的带头人一代不如一代!
想一直坚持用老的系统,可是因为商业规则的限制,老的系统,没有人提供新的硬件驱动开发,逼迫用户强行升级,无奈呀!也许以后,我会不得不使用Linux之类的可定制系统...
好了,闲话不说,看到论坛上面没有人公布精简Windows的方法,我来提供一个方法:
1. 跟踪系统启动引导过程,定制极致小的引导文件清单,这个简单.
2.跟踪使用功能,定制极致小的功能文件清单,这会是个很耗费时间的过程.
原理分析:
因为微软的操作系统是闭源的,所以没有办法通过源代码来分析系统引导流程,只能通过外部监视来反推,这就需要一个有力的监视软件来捕捉这个流程!
这里推荐一个工具: Process Monitor, 又是一个被有钱的微软收购的.
我们会使用到其中的 enable boot logging 功能,中文的意思就是"启用引导日志",我们看看截图:
不用选择监视线程,我们现在关注的是文件,直接ok启用该功能,Process Monitor会在系统注入一个文件名为 PROCMON23.SYS 的驱动文件,用来监视系统下次启动过程的内容。
这里要提示的是,在这个驱动加载之前的内容是监视不到的,所以,我后面会补充几个启动必须的文件.
精简步骤(我用VPC2007虚拟机安装三烦精简的239m的Win7,一个是VPC2007软件体积小,另外一个主要是虚拟硬盘格式为VHD文件,Win7可以直接挂载操作):
- 虚拟机里面安装好系统,Process Monitor 设置好boot logging以后,重启系统。C:\Windows\System32\Drivers\PROCMON23.SYS 就会不停的监视系统,把日志写到
C:\Windows\Procmon.pmb 日志文件里面,所以为了避免监视太多无关的内容,造成日志文件过大,进入系统,直接点击关机或重启,不要等待,也不要操作其他动作。
- 因为 PROCMON23.SYS 关机前会自动删除自身,以及清理相关注册表内容,所以再次进入系统,就不会继续监视系统了,
再次打开 Process Monitor 会提示保存日志文件为新的pml格式的日志文件,看看截图:
- 关闭虚拟机,主机Win7挂载VHD文件,在主机里面运行 Process Monitor 打开虚拟机里保存的pml格式日志文件,默认配置会看不到Boot阶段的日志,要设置一下,看截图:
为了生产精简的文件清单,我们还要设置过滤条件,过滤一些与精简文件目的无关的内容。过滤条件为:文件路径以 C:\Windows\ 开头, 排除和 Process Monitor相关的
两个文件:C:\Windows\Procmon.pmb, C:\Windows\System32\Drivers\PROCMON23.SYS, 以及排除所有带 "*"的文件路径。继续看截图:
- 保存文件列表清单,因为有很多重复的文件名,所以我们点击 count occurrences 菜单合并文件路径,看截图:
Column:选择Path,再点Count合并计数,最后保存路径清单。
- 上一步里保存的路径清单里面除了文件还包括目录,所以,我们要执行一个 cmd 命令排除这些目录,得到真正的Windows目录下面的文件清单。
我们先假设刚才保存的路径清单文件名为: z:\paths.csv ,虚拟机的vhd硬盘文件挂载盘符为: E: ,生产新的文件列表清单文件名为: z:\files.txt ,具体cmd命令为:
- (for /f "usebackq skip=1 delims=," %I in ("z:\paths.csv") do @for /f "tokens=2 delims=:" %J in (%I) do @for /f %K in ("E:%J") do @if exist %K echo %~aK|findstr "^d" >nul||echo %J)>z:\files.txt
复制代码
*提示:如果是实体机操作,一个盘符 C: 的话,可以简单语法:(另外如果要保存到批处理文件里面执行,要把%变成两个%,即%%,我看有些朋友不太熟悉,提醒一下)
- (for /f "usebackq skip=1 delims=," %I in ("C:\paths.csv") do @if exist %I echo %~aI|findstr "^d" >nul||echo %pnxI)>C:\files.txt
复制代码
打开新的文件列表清单文件: z:\files.txt ,添加没有监视到的启动相关文件,以及最精简的用户文件:
- \windows\fonts\vgaoem.fon
- \windows\inf\errata.inf
- \windows\system32\c_936.nls
- \windows\system32\l_intl.nls
- \windows\system32\winload.exe
- \programdata\microsoft\user account pictures\user.bmp
- \users\administrator\ntuser.dat
- \users\administrator\appdata\local\microsoft\windows\usrclass.dat
复制代码
- 现在我们可以做试验了,看看效果如何,先把原系统的四个目录:Windows, Users, ProgramData, Program Files 剪切到新目录下,假设为: E:\0 , 执行新的 cmd 命令复制文件:
- for /f "usebackq delims=" %I in ("z:\files.txt") do @(echo f|xcopy "E:\0%I" "E:%I" /h) >nul
复制代码
看看截图:
没有错误的话就可以卸载vhd虚拟硬盘文件,启动虚拟机了。
当然,前面制作的步骤,启动的是个最小化的Windows, 没有更多的图形操作功能 因为我们在虚拟机里操作的原因,除了模拟administratorm关机没有进行任何操作,所以监视的内容比较少,
大家可以多模拟一下,比如点击计算机图标等等其他操作,可以多监视一些文件!
最后祝大家精简的开心!
也希望大家总结,把每个功能模块需要的文件清单,提炼出来,最后形成一个个真正组件定制化的Windows系统!
补充内容:
1. 关于 Process Monitor 一打开就开始监视,并且要求确认过滤条件的现象,如果要避免的话,可以创建一个快捷方式, 然后加上参数:/noconnect /quiet,看截图:
2. 关于启用“boot loggong”, "C:\Windows\System32\Drivers\PROCMON23.SYS"写入失败的原因,我分析了一下原因,是因为直接打开Process Monitor, 默认就开始监视系统,所以会自动先写入这个驱动,再次写入的时候,因为这个驱动已经在使用中就覆盖不了,这样就造成了这样的现象,如果像补充内容1那样建立一个快捷方式不默认直接监视的话,是不会有这样的情况发生的,这个应该是它的一个Bug吧,Process Monitor应该判断,如果已经写入驱动,就不要再次写入了,只要修改注册表,让这个驱动下次系统启动的开始监控就可以了,正是没想到高手也有这样低级的bug产生,因为我的习惯一直是我不想用的东西,你就不要给我默认开启,所以一直以来都是用快捷方式打开的,还正是没有发现这样的bug存在,处理方法很多,简单点,直接补充注册表内容,帮ProcessMonitor完成这一步;或者驱动文件不能覆盖或者删除的情况下,是可以改名的,再写入就不会报错了,不过下次启动后不要忘了删除僵尸文件;另外重启系统,用快捷方式打开再启用Boot logging功能也是可以的。
想补充注册表的看这里:- Windows Registry Editor Version 5.00
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\PROCMON23]
- "Group"="FSFilter Activity Monitor"
- "SupportedFeatures"=dword:00000003
- "Start"=dword:00000000
- "Type"=dword:00000001
- "ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
- 72,00,69,00,76,00,65,00,72,00,73,00,5c,00,50,00,52,00,4f,00,43,00,4d,00,4f,\
- 00,4e,00,32,00,33,00,2e,00,53,00,59,00,53,00,00,00
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\PROCMON23\Instances]
- "DefaultInstance"="Process Monitor 23 Instance"
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\PROCMON23\Instances\Process Monitor 23 Instance]
- "Altitude"="385200"
- "Flags"=dword:00000000
复制代码 |
评分
-
查看全部评分
|