惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Register - Security
The Register - Security
IT之家
IT之家
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
I
InfoQ
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
博客园 - Franky
C
Check Point Blog
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
美团技术团队
The Cloudflare Blog
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
V
V2EX
aimingoo的专栏
aimingoo的专栏
GbyAI
GbyAI
G
Google Developers Blog
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
罗磊的独立博客
量子位
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
D
Docker
人人都是产品经理
人人都是产品经理

方永、南天紫雲

linux透明代理 技术的边界 停机问题通俗说明 Rust与oracle、redis集群的纠结 学习能力的增长 微信调试的原语 mac外接移动硬盘安装ArchLinux linux的死机问题 linux下全键盘操作 漂亮又好用的bspwm linux本机透明代理 ssh、mosh、autossh linux不能待机又一例 从WordPress切换到Hugo 折腾电脑开机 linux系统QQ新思路 Arch Linux的字体渲染 svn管理之submin OpenWrt自动fucking墙記錄 二维码(qrcode)名片的一些事儿 用lua nginx module搭建一个二维码(qr code)生成器 CentOS 7 安裝註記 php程序連接MySQL时只能127.0.0.1而localhost無法連接的問題 ThinkPad之FAN_ERROR、hi fi聲卡 jetty多端口部署 OpenWrt簡單暴力限網 linux中cron之PATH变量 OpenWrt的WDS無線橋接模式 再敘OpenWrt下的rtl8187無線中繼 sed之模擬tail 終端進化之二零一三 linux下的郵件服務器:postfix_dovecot_roundcube 一次性密碼/動態口令卡原理 xl2tp之VPN靜態地址分配 rtl2838U2832试用记 linux中pptp协议VPN搭建 glances监控工具安装 CentOS6.4硬盘安装 Debian Wheezy硬盤/U盤安裝小記 Kirby小試 zsh shell怎么打开常用的目录? OpenWrt SSH免密码使用密钥登录 linux中的vsftpd的匿名(anonymous)用户配置 無光驅無USB無軟驅,怎麼修復硬盤MBR? 那些個人網站 linuxFreeBSD下的dnspod动态域名客户端 Windows系统盘的32K之殇 一枚Chrome插件引起的大量磁盤IO問題 用批處理切換網卡的IP(適用Win7、Win8) Windows中的DHCP服务器 Win8啓動時出現“您的電腦需要修復”問題的解決辦法 Windows8睡眠(待机)模式异常处理 最强大好用而又小巧的计算器 Windows8運行不能保存歷史命令 Win8下的红警2尤里复仇 为cmd添加readline,如Bash Shell般使用cmd 手动添加修改win8 win+x菜单 Win8運行卸載程序時提示2503之解決一法 烽火HG110提权一法 缓解眼疲劳有效的办法 mintty乱码解决办法 糟糠美妾 免费易用的Win8 ArchLinux的類box環境音量調節二三事 使用OpenWrt与curl挂QQ OpenWrt的安全 OpenWrt BCM63xx rtl8187使用注意事项 Arch Linux之systmed使用简介 Archlinux 2012.07.15之后发布的镜像新手安装完全向导 FreeBSD 9.0 安装简记 记一由FreeBSD引发的午夜惊魂 Jekyll or handmade wi-fi无线破解过程与原理简要介绍 修复QQ影音异常卸载后的文件关联 吐槽一下000webhost 为OpenWrt的luci Web界面加速 最小的sed for Windows linux的磁盘自动挂载 OpenWrt中crontab -e的使用 sddns(dnspod client for OpenWrt)使用说明 OpenWrt中vsftp添加新用户 php+markdown写博客 linux arp防火墙之p2p终结者 墙外的世界很精彩 OpenWrt使用dnspod的动态域名解析(ddns)功能 OpenWrt架设nginx php网站 openwrt架设uhttpd+php+sqlite网站 vim自动跳到上次离开的光标位置 OpenWrt无线中继配置文件 修行八支 漫步者R201T打摩升级改造 阿里(Ali)3328系dvb接收机软件升级方法 db120刷OpenWrt固件并使用ppp方式ADSL拨号 移动短信助手 chrome tips一则 cdate,显示中国传统农历日期 更改硬盘模式为AHCI后Windows及linux的调整 使用grub2加载软盘和光盘镜像 电脑用数据线连接手机上网 电脑通过蓝牙连接手机GPRS上网
grub启动过程分析
zola · 2011-10-29 · via 方永、南天紫雲

翻linuxsir的精华贴,看到“GRUB源码分析”一文,其中几位前辈谈笑于源码、原理之间,颇感现在世风日下,学习气氛大不如前,耐心看完后尚觉许多不足,一如linuxsir坛子里的语调,太文邹邹,而且关键之处并没有讲到。遂花了点时间读了读grub4dos及grub2的代码,以及非常非常好的一篇文章——grub2的info手册。

grub4dos启动分三个阶段,stage1、stage1.5、stage2,stage1在MBR中,stage1.5在“MBR gap”中,stage2在文件系统中。MBR就是磁盘的最开始的512个字节,stage1写在了MBR的前446个字节中,剩下的60来个字节还要放分区表。stage1判断磁盘处于CHS或者LBR模式并运行相应代码,将stage1.5装载到内存并运行stage1.5。stage1.5在“MBR gap”中,也就是MBR与第一个分区之间的那点儿间隙,因为现在的磁盘空间都很大,为了提高性能,好的分区工具默认都是兆字节以上对齐的,所以这个间隙常常在1M以上,但怕的就是例外,所以stage1.5一般保持在31Kb以下。stage1.5稍微大些,所以能够识别一些文件系统,grub和grub4dos或许在这里对文件系统的处理的种类和数目不同。stage2在文件系统中,stage1.5能够访问文件系统并找到stage2的文件并运行,stage2加载配置文件并给出菜单选项或者mini shell。

分三个阶段,是由于代码储存空间的限制,MBR就那么点字节,现代的编译器生成的helloWorld也都在1K以上,所以“MBR gap”的空间就显得非常宝贵和重要,但是现有的文件系统种类很多,即使DOS中的FAT驱动,也有好几K,31K对于驱动所有的文件系统来说又显得非常狭小了。stage1.5只是加载少量文件系统的驱动,避免代码膨胀。

这里突显了供需矛盾是如何的尖锐。

grub的开发者们也在思考怎么解决这个问题。于是grub2就诞生了。grub2是重写的,相比原先的grub,最重要的变化就是模块化。而且更加健壮了。模块化不仅仅是能看到的那些grub目录中的.mod文件,更重要的地方在于grub2的安装过程。

新的grub启动分两个阶段,boot.img、cdboot.img、pexboot.img这些是一个阶段,然后是core.img这个阶段,和原来的grub相比较,boot.img阶段对应于stage1阶段,core.img对应于stage1.5阶段,因为它们储存的位置是一样的(当然,core.img也可以安装在其它地方),但是,新的grub在core.img阶段之后,基本的功能已经有了,即使所有的分区全部格式化了,还能抛出一个mini shell。这就是相对健壮的原因。

新的grub在core.img这个阶段完成之后,根据grub的环境变量prefix和root找到.mod模块文件,然后加载normal模块,这个模块会加载配置文件,最终看到了grub的菜单选项。

prefix和root环境变量是硬编码写入到core.img里面的,其实就是grub-mkimage及grub-install等安装工具将一个配置文件生成并打包进core.img镜像文件中。这些安装工具会检测文件系统等信息,生成特定的core.img并默认写到“MBR gap”中,因此有时重新分区后会出现一个”grub rescue”的shell,只要根文件系统及.mod文件还在,输入下面的命令:

set # 查看当前的环境变量
ls # 查看当前的分区情况
set prefix=xxx # 设置perfix变量,默认是/boot/grub
set root=xxx # 设置root变量,根文件系统所有分区
inmod normal # 加载normal这个模块
normal # 运行normal命令,这个命令存在于normal模块中

就可以恢复整个系统,系统启动后重新安装一下grub就可以了。

新的grub的stage2,由于模块存在于文件系统中且是一系列文件,而且core.img安装时只集成模块文件存在的那个分区的文件系统的驱动,所以相比grub4dos将需要的所有代码放在GRLDR单个文件中不太灵活,而且grub4dos的安装只是将固定的字节流写入,更为简便。所以可以将GRLDR复制到多个分区根目录底下,格式化其中一个分区并不会影响grub4dos的启动,另外,grub4dos可引导各种镜像文件包括光盘镜像文件,而且网上学习资源充足,学习成本比较低,这是许多人仍在用旧的grub的一个原因。我非常喜欢grub4dos的光盘引导功能,开虚拟机速度慢,重要的是不能如实反应真实的情况。

新的grub不仅仅设计理念做了重要改变,而且更像个微型系统,其本身提供变量、分支循环等语言的基本结构,语法接近于linux shell语言。添加了很多新的特性,提供了lua模块,为grub功能的扩展提供了极好的接口,png、jpg图像可直接作为背景,这个很喜欢;可定义主题,提供了各种控件,如标签、进度条、滚动条等等,甚至有容器,具有极高的可定制性,语法也契合主流。光盘的启动界面是很重要的,第一印象嘛,grub的主题定制功能提供了做出功能强大、界面绚丽的机制。

目前grub的开发十分的活跃,而且release版已经非常地稳定,我在几台电脑上安装了新的grub,没有出现过因为grub自身的bug导致启动失败的情况。