分类目录归档:技术文献

Managing EFI Boot Loaders for Linux

2011年底,Linux内核开发人员开始研究一种新方法,用于启动基于EFI系统的Linux。该方法将Linux内核变成一个EFI应用程序。一旦被加载了,该内核将接管计算机,在严格意义上有效果地绕开/忽略启动加载器(boot loader)的需求。该方法有其独特的优缺点,这些优缺点将在本文中详细阐述。(如果你对技术的细节感兴趣,请阅读 Linux Kernel Mailing
List thread on this topic.

什么时候使用Kernel's EFI Stub
Loader

Linux 内核的EFI stub loader有很多特性,有些是正面的,有些是负面的:

   在某种意义上讲,EFI boot loader是内置于内核中的,因此内核必须是在一个EFI可以读取的分区中,通常是EFI系统分区(ESP)。就像你使用ELILO一样,这会增加ESP的尺寸要求。也可以通过使用第二个FAT分区或EFI filesystem drivers来变通的解决该问题。

   如果想使用初始化的RAM盘(initrd,并且这个盘的内核启动有自己的stub loader, 那么EFi就必须能够读取stub loader 和内核。这与正在使用ELILO一样,会增加对ESP的大小要求。

   你必须有办法将内核参数传递给内核,比如initrd的名字和root filesystem的位置。这可以通过以下方法实现:在建立内核的时候嵌入参数;或者在EFI 外壳(shell)的命令行中输入该选项;也可以通过启动管理器(boot manager)传递。但是,并不是所有的启动管理器都可以传递任意选项,比如 rEFIt就不可以。

   从理论上讲,让内核直接从EFI启动可以改善内核初始化计算机硬盘的能力。至于实际中是否有提高就是另外一回事了。

   EFI stub loader 被添加到内核3.3.0,成为3.3.0特性。如果使用较旧版本的内核, 就需要将内核做下修补。2013年初,Fedora 17OpenSUSE
12.2
Ubuntu 12.10都使用包含EFI stub loader 的内核。所以我相信其他的发行版(distribution)也会这样,但是,依然会有一些版本(对升级内核持保守态度的)会继续使用3.3.0之前的内核。当然了,该情况会随着时间的变化有所改善的。

提示:如果将日志(journaling)禁用了,就可以将Linux/boot 分区放到HFS+上。也可以在Mac的ESP上使用HFS+,这时,将日志(journaling)禁用了,从LINUX读取filesystem会更简单。这个两种不太寻常的方式都可以更简单的升级和引导EFI
stub支持的内核。但是,绝大多数版本(distribution)的安装程序不支持这个配置,所以必须在使用传统的安装方法后再建立。

   该方法的可靠性还尚不确定,但是我的最始测试结果是很乐观的-----进行了7次测试,都可以成功启动,其中只有一次出现奇怪的(也可能是很重要的)警告,发生在32位的Mac Mini上。可以从Mac OS X HFS+分区上启动LINUX kernel EFI stub loader,但是在F ESP's FAT32
filesystem
上不能启动。使用ext2fsReiserFS(采用的是rEFIt rEFInd),可以成功启动这两种文件系统。尽管如此,从FAT ESP是不能启动的,这使设置变得复杂化。局限依然存在,但用内核stub loader的成功率远高于任何其他的EFI boot loader, 与之成功率接近的是ELILOGRUB Legacy。另一个关于可靠性的问题是,对初始Ram盘的规格要求很高。

   关于上一点提到的警告(希望是暂时的),有用户报告了some3.7x3.8x内核EFIstub loader 的问题。该问题出现时,内核就停止引导。Mac 和联想的用户似乎更容易出现这个问题,Arch Linux用户受此问题影响最大。因为他们都倾向于使用最前沿的内核并且比其他版本(distribution)的用户更愿意使用EFI stub loader. 可以点击这里 this thread查看更多关于此问题的讨论。令人奇怪的是,一个版本出现这个问题后,下个版本就不会出现;一些用户(并不是所有的用户)可以通过转换引导管理器或者引导管理器的编译方式来跳过此问题。这是个非常令人困惑的问题,EFI stub loader 的主要开发人员都知道这个情况。

尽管一些3.7x 和3.8x内核依然受此问题困扰,但是该方法在最近发布的版本上都运行正常。EFI stub loader 在与 rEFInd 或 gummiboot在一起使用时效果最好,因为在用这种方式引导,可以指定Linus内核需要的额外选项,免去了每次引导时都需要输入选项的不足。实际上呢,正如rEFInd page, 中所描述的,rEFInd 与 EFI stub loader的结合允许通过拖放方式升级内核,而不必编辑任何配置文件!

安装EFI Stub Loader

注意:这部分是关于编译内核的。如果你正在使用的是3.3.0 或者是更新的支持EFI stub loader的内核,那么你需要做的就是将内核以及它的初始RAM disk 复制到 ESP或是在ESP上的安装驱动(driver)(以便内核可以从EFI被读取)。但是,你必须知道如何运行(launch)内核,"Configuring and Using the EFI Stub
Loader."
这里有简单介绍。

安装EFI stub loader 需要配置你的3.3.0内核 (或者更新的内核)并对其进行编译(也可以用适合的预配置好的内核),然后将内核安装到ESP(或某些EFI可以读取的分区)。如果在编译内核时不能独立完成,可以浏览下相关的网页,比如How to: Compile Linux Kernel
2.6
 和 Compiling the Linux Kernel。如果你之前没有做该项工作,那就得从数千个选项中选出你所需要的选项。通用型的内核比较方便,因为它的选项可以适应几乎所有的计算机,这与版本提供者(distribution provideer)使用的相似。但是,你需要留意一两个内核配置选项:

  CONFIG_EFI_STUB--- 该选项的位置在这里:accessible as Processor Type and Features
-> EFI Runtime Service Support -> EFI Stub Support。这个选项是将EFI stub loader添加到内核的重要选项,如果想使用该功能就必须勾选它。

  CONFIG_CMDLINE_BOOL  CONFIG_CMDLINE-----虽然第一个选项使第二个生效,但是我将他们看做一个选项。通过对命令行设置CONFIG_CMDLINE,需要在EFI外壳提示符键入或通过引导管理器传递,如果没有这个需要可以跳过此选项。如果想通过EFI引导管理器来运行内核,并且该引导管理器不允许将任意参数传递给你的boot loader, 比如EFI和rEFIt中功能不全的引导管理器,这时候这个选择就发挥作用了。如果你打算使用rEFInd或者其他的支持传递任意选项到boot loader 的引导管理器,就不再需要设置该选项了。

如下图:

 

内核编译完成后,需要用正常方式安装模块(键入make
modules_install
)并且准备一个初始的RAM盘(使用 mkinitrd 或 mkinitramfs,
不同的distribution的操作细节会有差别)。将内核文件和初始的RAM盘复制到Linux /boot目录和ESP。例如,你可能会使用ESP上的EFI/linux子目录来存放这些文件。

配置和使用EFI Stub Loader

内核的stub loader 本身不需要配置,但是有时候,在从它里面建立选项的时候会需要。如果编译的内核stub loader没有这些选项的时候,你需要知道如何将选项传递给它,这可以在boot loader中的选项行中传递。此外,如果使用初始RAM盘了,就需要将初始RAM盘的名字也传递给它。在EFI shell输入后,会有如下生成的命令:

fs0:> bzImage.efi
root=/dev/sda4 ro initrd=\EFI\linux\initrd.img

这是个小例子,其中将内核命名为bzImage.efi,root Linux
filesystem在/dev/sda4,初始RAM盘是安装在了ESP EFI的/linux/initrd.img这个文件。 ro这个选项使Linux以只读方式挂载root filesystem。(这个是标准的;初始化脚本后来重新挂载filesystem read/write)。需要注意的是root=这个选项识别Linux root
filesystem, 使用Linux样式的向前倾的斜线(/)来分隔目录元素,与Linux root(/)filesystem相对; 但是,initrd= 使用的是EFI风格的反斜杠(\)用来识别初始的RAM盘,这与ESP's root相对。这很重要,因为不正确的 initrd=规范会使内核停止。较旧版本的EFIstub loader(3.3.0,至少是3.4.0)不会报错。再新一点的版本(比如3.6.0,或者3.5x内核)在不能读取它的initrd文件时 会报错。

EFI有自己的引导管理器,但是通常比较简单原始。然而,如果你的引导管理器可以让你选择boot loader, 或者是你愿意只从一个内核中引导,你可以在Linux通过 efibootmgr程序进行设置。可以通过下面的命令行实现:

# efibootmgr -c
-d /dev/sda -p 1 -L "Arch Linux" -l '\EFI\arch\vmlinuz-arch.efi' -u
root=/dev/sda3 ro initrd=EFI/arch/initramfs-arch.img

该命令是使用指定的 –u后面的函数来让EFI引导 \EFI\arch\vmlinuz-arch.efi这个文件。理论上,如果使用/dev/sda1作为ESP,-d和-p这两个选项就没有必要了;这里将这两个选项加上,是以防你不是使用这样的ESP;此处根据实际情况作改动。 如果你的EFI执行/实施有个不错的启动菜单,你可以用多个命令(multiple commands)建立替代启动选项(alternative boot
options),比如引导不同的内核、多重版本(multiple
distributions)以及使用备用选项(using alternate options)。

如果你使用的是分开的(单独的;分开的;不同的;各自的)EFI引导管理程序,比如rEFInd 或 gummiboot,就可以通过浏览配置将必需的选项传递给内核。刚才提到过,rEFIt不可以。rEFIt和 rEFInd 可通过下面两种方式将选项传递给EFI stub loader: 在主要的refind.conffile中写boot loader节定义;或者是依靠 refind_linux.conf这个文件的半自动查找方式,可以在目录中的 refind_linux.conf文件为所有的内核读取选项。任何一种方式都可将内核支持与rEFInd结合,这个结合在多引导环境中比较灵活并且相对来说容易维持。但是版本(distribution)脚本不支持rEFInd,所以不得不做一些手工维护。gummiboot 的每个主菜单选项都需要一个独立的配置文件,并且所有的版本(distribution)的维护脚本都不支持,需要手工维护。

理论上讲,在使用chainloader(而不是使用内核或linux选项)的GRUB Legacy或GRUB 2上运行编译好的支持EFI stub的Linux内核是完全有可能的。(但我还没试过)。如果你用常规的方式运行遇到硬件初始化的文件,那么使用chainloader就可能会方便一些,但是这一点我还不是非常确定。

ext2fs/ext3fs, ext4fs 以及ReiserFS的EFI驱动程序(drivers)是可用的,这另从Linux filesystem 加载支持EFI stub的Linux内核成为可能。尽管有时候你可能需要给内核重命名或使用.efi这个扩展名建立连接,但是该方法可以简化配置,因为你不必将内核复制到ESP。http://www.rodsbooks.com/refind/drivers.html  这里介绍EFI drivers的使用,并重点介绍配置rEFInd和加载EFI drivers。

维护Kernel's EFI Stub
Loader

因为目前大多数版本(distribution)都不支持内核的EFI stub loader,所以只能自己进行维护。将来,各个版本将有可能使用 efibootmgr或其他工具来帮助维护那些使用该方法的设备,再或者通过维护GRUB, rEFInd, 或 gummiboot的配置文件时支持Kernel's EFI Stub Loader

 

发现C盘空间突然变小了

经过研究发现是NViDIA的显卡驱动导致的,C:\Windows\System32\DriverStore\FileRepository(文件夹大小10GB左右),

最终把nv开头的文件夹删除即可,注意删除的时候要删除最新修改日期的,如果时间比较老的就不理睬了。

 

C:\Program Files\NVIDIA Corporation\Installer2这个文件夹也可以删除,还占用1GB多。

易数一键还原DOS版 -- 命令行参数说明

易数一键还原 命令行生成工具下载:http://pan.baidu.com/s/1xeFyj

    易数一键还原DOS版支持通过命令行对系统分区执行备份与还原、以及对磁盘进行快速重分区操作。

    可在命令行中指定“选项”、“命令(功能”)及“参数”:

    选项:必须以“-”或“/”开头,如:-Reboot 或 /Reboot。
    命令:没有“-”或“/”前缀,如:PartitionToImage 或 ImageToPartition。命令一般需要附加若干个参数才能执行。如:PartitionToImage src=0:0 dst=0:1 compress=1 remark="安装系统后备份。"
    参数:一般为“名称=值”的形式,参数名称和参数值之间用“=”号分隔。参数值中有空格时,要用双引号括起来。参数要紧跟在命令后面。

    可以在同一命令行中指定多个命令及参数组合,一般情况下软件会一一执行所有命令,只有重新分区功能除外。重新分区命令会先于其它命令执行,而与该命令在命令行中的顺序无关。

    易数一键还原支持的选项、命令及参数如下:

一.选项
    /Reboot               执行后重启电脑
    /PowerOff             执行后关闭电脑
    /CommandFile=filepath 从指定的文件加载命令行。当命令行的总长度超过DOS系统的限制时,必须将命令保存到文件中。此选项告诉本软件从指定的文件加载命令行,从文件加载时没有命令行长度的限制。

     注意:选项都是全局的,不针对某个特定的命令。因此不要将选项放在某个命令及其参数的中间,建议放到整个命令行的最后。

二.命令

    1.PartitionToImage 功能:克隆系统分区到备份文件。该功能需要指定下列参数:
      src 要备份的源分区
      srcsign 源分区所属磁盘的MBR签名,用于确认源分区。(可选,但当存在多个磁盘时强烈建议使用,否则一旦出错,会出现分区指向错误,导致备份的分区不正确。)
      dst 保存镜像文件的目标分区
      dstsign 目标分区所在磁盘的MBR签名,用于确认目标分区。 (可选,但当存在多个磁盘时强烈建议使用磁盘签名,否则一旦出错,会出现目标分区指向错误,导致备份到错误的分区。)
      file 指定镜像文件所在的文件夹路径(当路径中有盘符时,请不要再指定dst及dstsign参数。注意,这是备份文件所有目录的路径,不是文件路径。本软件目前不支持自定义备份文件名。)
      incremental 是否增量备份 (Y|N)
      compress 压缩方式
      MaxFileSize 限制镜像文件的最大尺寸(单位为GB,不指定此参数或指定0时表示不限制。)
      remark 备注 (可选)
      exclude 保存了要排除的文件夹列表的文件 (可选。如不指定,备份时不会排除任何文件夹)
      CreatePart 是否建立一个新的分区用于保存备份文件 (Y|N)
      iImagePartStartSector 新分区起始扇区号
      iImagePartEndSector 新分区终止扇区号
      CreatePrimary 是否建立主分区 (Y|N)
      Install 是否安装用于启动本软件DOS版的隐藏分区 (Y|N)
      HideImagePart 是否隐藏新建立的保存备份文件的分区 (Y|N)
      WaitSeconds 安装DOS版启动选项时,等待按下F11键的秒数

   2.ImageToPartition 功能:从备份文件还原系统分区。该功能需要指定下列参数:
      srcsign 源分区所属磁盘的MBR签名,用于确认源分区。(可选,但当存在多个磁盘时强烈建议使用。)
      dst 要还原的目标分区
      dstsign 目标分区所属磁盘的MBR签名,用于确认目标分区。(可选,但当存在多个磁盘时强烈建议使用磁盘签名,否则一旦出错,会出现目标分区指向错误,导致还原到错误的分区,造成分区文件数据丢失。)
      file 指定备份文件所在的文件夹路径(当路径中有盘符时,请不要再指定src及srcsign参数。 注意,这是备份文件所有目录的路径,不是文件路径。本软件目前不支持自定义备份文件名。)
      timepoint 要还原的时间点序号
      password 还原密码(可选)
      confirm 还原之前是否显示确认提示。默认不显示。 (Y|N)

    3.PartitionDisk 功能:重新分区并格式化指定磁盘。该功能需要指定下列参数:
      dst 要重新分区的目标磁盘(参数形式:dst=盘号,盘号从0开始)
      dstsign 目标磁盘的MBR签名,用于确认磁盘。(可选,但当存在多个磁盘时强烈建议使用磁盘签名,否则一旦出错,会出现目标磁盘指向错误,导致对错误的磁盘进行重分区操作,造成整个磁盘分区文件丢失。)
      count 分区数目
      part1size 第一个分区的容量(可选,不指定时使用软件默认设置。参数形式为:part1size=50[GB|MB])
      confirm如果已存在分区,重新分区之前是否显示确认提示。默认显示。

三.参数说明
      src:指定源分区所属磁盘号及分区号。参数形式为:“src=磁盘号:分区号”。磁盘号从0开始分区号也从0开始编号,但逻辑分区例外。0、1、2、3用于主分区,逻辑分区总是从4开始编号。无论有几个主分区逻辑分区的序号始终从4开始。对于GPT磁盘,由于没有逻辑分区,分区序号从0开始依次编号。
      dst:指定目标分区所属磁盘号及分区号。参数形式与src相同。
      srcsign 源分区所属磁盘的MBR签名(与src参数一起使用。当电脑上有多个磁盘时,Windows与DOS下的磁盘顺序可能不一样,可用于防止选错磁盘。运行本软件后,可在“磁盘信息”对话框中查看磁盘序号及其MBR签名。)
      dstsign 目标分区所属磁盘的MBR签名(与dst参数一起使用,用于防止选错磁盘。)
      compress 指定压缩方式(0:不压缩 1:快速压缩 2:正常压缩 3:高质量压缩)。
      remark 指定需要保存到备份文件中的备注信息。
      exclude 指定保存了需排除的文件(夹)路径的文件。文件中可以指定多个路径,每个路径占一行。
      incremental 是否增量备份。“=Y”表示增量备份,否则为全新备份。
      CreatePart 是否要将备份文件保存到新建立的分区中。
      iImagePartStartSector 新分区起始扇区号。CreatePart=Y时才有意义。
      iImagePartEndSector 新分区终止扇区号。CreatePart=Y时才有意义。
      CreatePrimary 新分区是否为主分区。CreatePrimary=Y表示建立主分区,否则建立逻辑分区。CreatePart=Y时才有意义。
      Install 是否安装用于启动本软件DOS版的隐藏分区。
      WaitSeconds 从隐藏分区启动本软件DOS版时等待按下F11键的秒数。Install=Y时才有意义。
      timepoint 要还原的时间点序号。完整备份的时间点序号为0,之后的时间点从1开始编号。
      count 指定分区数目。
      part1size 为磁盘重分区时指定第一个分区的大小。参数形式为:part1size=50[GB|MB],数值后面可以指定单位也可以不指定,不指定时默。认为GB。
      confirm 执行操作之前是否显示确认信息。确认后才执行操作。

四.应用举例

    1.将磁盘号为0、分区序号为1的Windows系统分区备份到磁盘号为0、序号为2分区的默认路径的备份文件中。压缩方式为快速压缩,排除"\exclude.txt"中记录的文件夹(一行一个)。执行完成后关闭电脑:
      erestore.exe PartitionToImage src=0:1 dst=0:2 compress=1 exclude="\exclude.txt" /PowerOff

    2.从磁盘号为1、序号为2的分区,默认路径中的备份文件还原到磁盘号为0、序号为0的分区,还原序号为1的时间点。还原前先对目标分区执行快速分区格式化,快速分区时共分4个分区,指定第一个分区的大小为60GB,分区前不需要确认。执行完成后重启:
      erestore.exe ImageToPartition src=1:2 dst=0:0 timepoint=1 PartitionDisk dst=0 count=4 part1size=60GB confirm=N /Reboot

    3.从文件加载命令行并备份系统分区的例子:
      命令行格式: erestore.exe /CommandFile=cmdfile.txt
      cmdfile.txt文件内容(注意:只有一行,不用再写软件的可执行文件名erestore.exe,直接写命令及参数):
      PartitionToImage src=0:0 srcsign=86898689 dst=0:0 dstsign=86898689 compress=1 remark="" exclude=excfile.txt   CreatePart=Y   iImagePartStartSector=69844992 iImagePartEndSector=83886079 CreatePrimary=N Install=Y WaitSeconds=3 /Reboot
      excfile.txt文件记录了要排除的文件夹列表。每行结尾处的“Y”或“N”表示是否保留文件夹本身。为“Y”时,只排除文件夹内的所有文件,文件夹本身仍会备份,还原后将只剩下一个空文件夹。文件内容如下:
      \Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5 Y
      \Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5 Y
      \Documents and Settings\LocalService\Local Settings\Temporary Internet Files\Content.IE5 Y
      \Documents and Settings\NetworkService\Local Settings\Temporary Internet Files\Content.IE5 Y
      \pagefile.sys N
      \Documents and Settings\Administrator\Local Settings\Temp Y
      \Documents and Settings\Default User\Local Settings\Temp Y
      \Documents and Settings\LocalService\Local Settings\Temp Y
      \Documents and Settings\NetworkService\Local Settings\Temp Y

HTML5 - 通过JS获取地理定位(GPS)

如何提取Linux Kernel的配置文件

如果你是一个喜欢编译内核的狂人,同时也是经常忘记将默认的.config文件备份的懒家伙,那么下面的方法将会使你的内核配置工作变得更轻松,从linux 2.6开始内核提供了一种将.config附加到映像文件的方法,通过这种方法,内核配置者可以不必备份当前的.config文件,而是在需要的时候直接从内核映像中提取.config文件。步骤如下:

1. 配置内核
1.1 make menuconfig;
1.2 选择如下:
General setup --->
< *> Kernel .config support
[*] Enable access to .config through /proc/config.gz
1.3 make uImage
2. 提取配置文件
2.1 方法一,从uImage文件中提取:
2.1.1 打开控制台,cd进入到linux源码树根目录,我的为:/root/Desktop/easy2440/linux-2.6.30.9-easy2440
2.1.2 输入如下命令:scripts/extract-ikconfig arch/arm/boot/uImage > config
2.1.3 命令执行完后,将会在linux源码树根目录下面生成config文件;
2.1.4 config文件即为我们需要的内核配置文件,可以将其替代.config文件。
2.2 方法二,从开发板的/proc/config.gz中提取:
2.2.1 将新生成的uImage文件下载到开发板;
2.2.2 准备串口控制台,启动开发板;
2.2.3 开发板正常启动后,在控制台输入命令:cat /proc/config.gz | gzip -d > /home/config
2.2.4 命令执行完后,将会在/home目录下生成config文件
2.2.5 config文件即为我们需要的内核配置文件,可以将其替代.config文件。