分类目录归档:技术文献

GRUB2配置文件"grub.cfg"详解(GRUB2实战手册)

GRUB2模块

对于GRUB-2.0.2版本来说,官方提供的模块一共有200多个,这些模块大致可以分为以下几类(模块间的依赖关系位于"moddep.lst"文件中):

命令模块[command.lst]
提供了各种不同的功能,类似标准Unix命令,一共将近100个。例如:cat cpuid echo halt lspci chainloader initrd linux password ...
加密模块[crypto.lst]
提供了各种数据完整性校验与密码算法支持,一共20多个。例如:gcry_rijndael crc64 gcry_md5 ...
文件系统模块[fs.lst]
提供了访问各种文件系统的功能,一共30多个。例如:btrfs cpio exfat ext2 fat iso9660 ntfs tar xfs zfs ...
分区模块[partmap.lst]
提供了识别各种分区格式的功能,一共10多个。例如:part_bsd part_gpt part_msdos ...
分区工具[parttool.lst]
提供了操作各种分区格式的功能,目前只有 msdospart 这一个。
终端模块[terminal.lst]
提供了各种不同终端的支持,一共不到10个。例如:serial gfxterm vga_text at_keyboard ...
视频模块[video.lst]
提供了各种不同的视频模式支持,一共6个。例如:vga vbe efi_gop efi_uga ...
其他模块
所有未在上述分类文件中列出的模块都归为这一类,一共将近100个。值得关注的有以下几个:

"all_video"可用于一次性加载当前所有可用的视频模块;
"gfxmenu"可用于提供主题支持;
"jpeg png tga"可用于提供特定格式的背景图片支持;
"xzio gzio lzopio"可用于提供特定压缩格式支持(常配合"initrd"命令使用);
"memdisk"可用于提供内存盘支持,常用于配合MEMDISK工具引导各种镜像文件(ISO镜像/软盘镜像/硬盘镜像)。

GRUB2救援模式

GRUB2在BIOS平台上的常规启动步骤是这样的:BIOS --> boot.img[MBR] --> core.img[MBR gap/embedding area/BIOS Boot Partition] --> 设置"prefix root cmdpath"环境变量 --> 加载"normal.mod"模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] --> 执行"normal $prefix/grub.cfg"命令

GRUB2在UEFI平台上的常规启动步骤是这样的:UEFI --> core.img[BOOTX64.EFI/BOOTX86.EFI] --> 设置"prefix root cmdpath"环境变量 --> 加载"normal.mod"模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] --> 执行"normal $prefix/grub.cfg"命令

如果上述步骤全部成功,那么你将进入'普通模式',一般是显示一个菜单(找到了'$prefix/grub.cfg'),或者直接进入GRUB SHELL(没找到'$prefix/grub.cfg')。在普通模式中,命令模块[command.lst]与加密模块[crypto.lst]会被自动按需载入(无需使用"insmod"命令),并且可使用完整的GRUB脚本功能。但是其他模块则可能需要明确使用"insmod"命令来载入。

如果在加载"normal.mod"模块这一步出现故障,那么你将进入GRUB2的'救援模式',而不是常规的'普通模式'。在救援模式中,GRUB只自动设置了"cmdpath prefix root"三个环境变量,并且只能使用"insmod ls set unset"四个命令。只有当额外的模块被加载之后,才可以使用一些其它的命令,变量,解析器,驱动程序。通常来说,进入救援模式可能意味着你的GRUB2没有正确安装。请认真阅读'grub-install --help'的输出选项,并使用正确的选项重新安装。更多细节请参考GRUB2手册中的"GRUB only offers a rescue shell"部分。

GRUB2命名规则
设备与分区

GRUB2对设备与分区的命名规则举例如下,看看就能明白。需要说明的是磁盘从"0"开始计数,分区从"1"开始计数。

代码:
(fd0)          第一软盘
(hd0)          第一硬盘[大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待]
(hd1,1)        第二硬盘的第一分区(通用于MBR与GPT分区)
(hd0,msdos2)   第一硬盘的第二MBR分区,也就是传统的DOS分区表
(hd1,msdos5)   第二硬盘的第五MBR分区,也就是第一个逻辑分区
(hd0,gpt1)     第一硬盘的第一GPT分区
(cd)           启动光盘[仅在从光盘启动GRUB时可用]
(cd0)          第一光盘
(memdisk)      内存盘[只能有一个]

上面所举的例子仅是最常用的情形,更多高级的设备命名规则请参考GRUB2手册中的"Naming convention"与"How to specify devices"部分。此外,如果你想看看当前系统上有哪些设备可用,可以在GRUB SHELL中使用"ls"命令(可能需要先加载必要的驱动模块)。

文件

文件的命名方法有两种:(1)绝对路径表示法,(2)相对路径表示法。举例如下:

代码:
(fd0)/grldr                 第一软盘根目录下的"grldr"文件[绝对路径]
(hd0,gpt1)/boot/vmlinuz     第一硬盘的第一GPT分区"boot"目录下的"vmlinuz"文件[绝对路径]
/boot/vmlinuz               根设备"boot"目录下的"vmlinuz"文件[相对路径],
当"root"环境变量等于"(hd0,gpt1)"时,等价于"(hd0,gpt1)/boot/vmlinuz"

上面所举的例子仅是最常用的情形,更多高级的文件命名规则请参考GRUB2手册中的"How to specify files"部分。

磁盘块

磁盘块的命名方法同样也有两种:(1)绝对路径表示法,(2)相对路径表示法。举例如下:

代码:
(hd1,1)0+1  在第二硬盘的第一分区上,从第"0"个磁盘块(首扇区)起,长度为"1"的连续块。[绝对路径]
(hd1,1)+1   含义与上一个相同,因为当从第"0"个磁盘块(首扇区)起时,"0"可以省略不写。[绝对路径]
+1          在根设备上,从第"0"个磁盘块(首扇区)起,长度为"1"的连续块。[相对路径]
当"root"环境变量等于"(hd1,1)"时,等价于"(hd1,1)0+1"

磁盘块几乎只用于链式引导(chainloader)的场合。更多高级的磁盘块命名规则请参考GRUB2手册中的"How to specify block lists"部分。

GRUB2环境变量

GRUB2的环境变量大致可以分为两类,第一类是自动设置的变量,也就是这些变量的初始值由GRUB2自动设置,其值必定存在且不为空。第二类是手动设置的变量,它们没有初始值(或者初始值为空),需要经过手动明确设置之后才能使用。

大多数有特定含义的环境变量都是附属于特定附加模块的,只有加载了这些模块之后,这些环境变量才变得有意义。所以从模块的角度看,GRUB2的环境变量又可以分为三类:(1)核心变量,GRUB2核心提供的变量,不依赖于任何可加载模块,这样的变量只有"cmdpath prefix root"三个,而且它们的初始值都由GRUB2自动设置。(2)模块变量,绝大多数有特定含义的环境变量都属此类。(3)脚本变量,这是为了方便编写grub.cfg脚本而设置的变量,没有特殊含义,也不依赖于特定模块,与一般的bash脚本中的变量类似。有关GRUB2脚本的完整说明可以参考GRUB2手册中的"Writing full configuration files directly"部分,基本上其语法与bash脚本完全一致,上手非常容易。
特殊变量

下面列出的变量都是有特定含义的变量,这里只列出常用的一些变量,完整的列表可以参考GRUB2手册中的"Special environment variables"部分。

?
上一条命令的返回值,零表示成功,非零表示失败[与bash一样]。由GRUB2自动设置。你只能使用此变量,而不能修改它。
check_signatures
是否在加载文件时强制验证签名,可以设为'yes'或'no'
chosen
当前被执行的菜单项名称(紧跟"menuentry"命令之后的字符串或者'--id'选项的参数),例如'Windows 7'。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
cmdpath
当前被加载的"core.img"所在目录(绝对路径)。例如:UEFI启动可能是'(hd0,gpt1)/EFI/UBUNTU'或'(cd0)/EFI/BOOT',BIOS启动可能是'(hd0)'。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
debug
设为'all'时表示开启调试输出[会显示大量信息,谨慎开启]
default
默认选中第几个菜单项(从'0'开始计数)
fallback
如果默认菜单项启动失败,那么就启动第几个菜单项(从'0'开始计数)
gfxmode
设置"gfxterm"模块所使用的视频模式,可以指定一组由逗号或分号分隔的模式以供逐一尝试:每个模式的格式必须是:'auto'(自动检测),'宽x高','宽x高x色深'之一,并且只能使用VBE标准指定的模式[640x480,800x600,1024x768,1280x1024]x[16,24,32]。可以在GRUB SHELL中使用"videoinfo"命令列出当前所有可用模式。默认值是'auto'。
gfxpayload
设置Linux内核启动时的视频模式,可以指定一组由逗号或分号分隔的模式以供逐一尝试:每个模式的格式必须是:'text'(普通文本模式,不能用于UEFI平台),'keep'(继承"gfxmode"的值),'auto'(自动检测),'宽x高','宽x高x色深'之一,并且只能使用VBE标准指定的模式[640x480,800x600,1024x768,1280x1024]x[16,24,32]。在BIOS平台上的默认值是'text',在UEFI平台上的默认值是'auto'。除非你想明确设置Linux控制台的分辨率(要求内核必须"CONFIG_FRAMEBUFFER_CONSOLE=y"),或者打算在BIOS平台上使用图形控制台(要求内核必须"CONFIG_FRAMEBUFFER_CONSOLE=y"),否则不要设置此变量。
gfxterm_font
设置"gfxterm"模块所使用的字体,默认使用所有可用字体
grub_cpu
此GRUB所适用的CPU类型。例如:'i386', 'x86_64'。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
grub_platform
此GRUB所适用的平台类型。例如:'pc', 'efi'。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
lang
设置GRUB2的界面语言,必须搭配"locale_dir"变量一起使用。简体中文应设为'zh_CN'。
locale_dir
设置翻译文件(*.mo)的目录,通常是'$prefix/locale',若未明确设置此目录,则禁止国际化。
pager
如果设为'1',那么每一满屏后暂停输出,等待键盘输入。缺省是'',表示不暂停。
prefix
绝对路径形式的'/boot/grub'目录位置(也就是GRUB2的安装目录),例如'(hd0,gpt1)/grub'或'(hd0,msdos2)/boot/grub'。初始值由GRUB在启动时根据"grub-install"在安装时提供的信息自动设置。你只应该使用此变量,而不应该修改它。
root
设置"根设备"。任何未指定设备名的文件都视为位于此设备。初始值由GRUB在启动时根据"prefix"变量的值自动设置。在大多数情况下,你都需要修改它。
superusers
设置一组"超级用户"(使用空格/逗号/分号进行分隔),以开启安全认证的功能。
theme
设置菜单界面的主题风格文件的位置,例如:"/boot/grub/themes/starfield/theme.txt"。关于如何定制界面风格(背景图片/字体/颜色/图标等)的细节,可以参考GRUB2手册中的"Theme file format"部分。
timeout
在启动默认菜单项前,等待键盘输入的秒数。默认值是'5'秒。'0'表示直接启动默认菜单项(不显示菜单),'-1'表示永远等待。

GRUB2命令

对于GRUB-2.0.2版本来说,所有可用的命令有大约200个之多,他们中的绝大多数由各种各样的模块提供。我们没有必要去了解所有这些200个命令,只需要了解一些常用的命令即可(实际上就连官方文档也没有给出全部的命令说明)。更多的命令说明可以参考GRUB2手册中的"The list of available commands"页面中列出的几个二级页面。

menuentry "title" [--class=class …] [--users=users] [--unrestricted] [--hotkey=key] [--id=id] [arg …] { command; … }

定义一个名为"title"的菜单项。当此菜单项被选中时,GRUB将会把环境变量"chosen"的值设为"id"(使用了[--id=id]选项)或"title"(未使用[--id=id]选项),然后执行花括号中的命令列表,如果列表中最后一个命令执行成功,并且已经载入了一个内核,那么将执行"boot"命令。

可以使用 --class 选项指定菜单项所属的"样式类"。从而可以使用指定的主题样式显示菜单项。

可以使用 --users 选项指定只允许特定的用户访问此菜单项。如果没有使用此选项,则表示允许所有用户访问。

可以使用 --unrestricted 选项指明允许所有用户访问此菜单项。

可以使用 --hotkey 选项设置访问此菜单项的热键(快捷键)。"key"可以是一个单独的字母,或者'backspace','tab','delete'之一。

可以使用 --id 选项为此菜单项设置一个全局唯一的标识符。"id"必须由ASCII字母/数字/下划线组成,且不得以数字开头。

[arg …]是可选的参数列表。你可以把它们理解为命令行参数。实际上"title"也是命令行参数,只不过这个参数是个必须参数而已。这些参数都可以在花括号内的命令列表中使用,"title"对应着"$1",其余的以此类推。
terminal_input [--append|--remove] [terminal1] [terminal2] …

如果不带任何选项与参数,则表示列出当前激活的输入终端,以及所有其他可用的输入终端。

可以使用 --append 选项将指定的终端加入到激活的输入终端列表中,所有列表中的终端都可以用于向GRUB提供输入。

可以使用 --remove 选项将指定的终端从激活的输入终端列表中删除。

如果不使用任何选项,但是指定了一个或多个终端参数,则表示将当前激活的输入终端设置为参数指定的终端。
terminal_output [--append|--remove] [terminal1] [terminal2] …

如果不带任何选项与参数,则表示列出当前激活的输出终端,以及所有其他可用的输出终端。

可以使用 --append 选项将指定的终端加入到激活的输出终端列表中,所有列表中的终端都将接受到GRUB的输出。

可以使用 --remove 选项将指定的终端从激活的输出终端列表中删除。

如果不使用任何选项,但是指定了一个或多个终端参数,则表示将当前激活的输出终端设置为参数指定的终端。
authenticate [userlist]

检查当前用户是否位于"userlist"或环境变量"superusers"中。[注意]如果环境变量"superusers"的值为空,此命令将返回'真'。
background_color color

设置当前激活的输出终端的背景颜色。"color"可以使用HTML风格的颜色表示法("#RRGGBB"或"#RGB")。

[注意]仅在使用'gfxterm'作为输出终端的时候,才能改变背景色。
background_image [[--mode 'stretch'|'normal'] file]

将当前激活的输出终端的背景图片设置为"file"文件。除非使用了"--mode 'normal'"选项,否则图片将被自动缩放以填满整个屏幕。

如果不带任何选项与参数,则表示删除背景图片。

[注意]仅在使用'gfxterm'作为输出终端的时候,才能改变背景图片。
boot

启动已经被载入的OS或链式加载器。仅在运行于交互式命令行的时候才是需要的。在一个菜单项结束时是隐含的。
cat [--dos] file

显示文件"file"的内容。如果使用了"--dos"选项,那么"回车/换行符"将被显示为一个简单的换行符。否则,回车符将被显示为一个控制符(<d>)。
chainloader [--force] file

链式加载"file"文件。通常使用磁盘块表示法,例如用'+1'表示当前根分区的第一个扇区。

可以使用 --force 选项强制载入文件,而不管它是否有正确的签名。通常用于加载有缺陷的启动载入器(例如 SCO UnixWare 7.1)。
configfile file

将"file"作为配置文件加载。如果"file"中定义了菜单项,那么立即显示一个包含它们的菜单。

[注意]"file"文件对环境变量所做的任何变更都将在从此文件返回后失效。
cpuid [-l]

检查CPU特性。仅在x86系统上可用。

如果使用了 -l 选项,那么如果CPU是64位则返回真,否则返回假。
drivemap -l|-r|[-s] from_drive to_drive

如果不使用任何选项,表示将"from_drive"映射到"to_drive"。这主要用于链式加载Windows之类的操作系统,因为它们只能从第一个硬盘启动。出于方便的原因,分区后缀将被忽略,因此你可用安全地将"${root}"作为磁盘使用。

可以使用 -s 选项,执行反向映射,也就是交换这两个磁盘。例如: drivemap -s (hd0) (hd1)

可以使用 -l 选项,列出当前已有的映射。

可以使用 -r 选项,把映射重置为默认值,也就是撤销所有当前已有的映射。
echo [-n] [-e] string …

显示所要求的文本并换行(除非使用了 -n 选项)。如果有多个字符串,依次输出它们,并用空格分隔每一个。

和bash的习惯一样,可以在双引号内使用"${var}"来引用变量的值,也可以使用 -e 选项激活对反斜杠转义符的解释( \\ \a \r \n \t ...)。
export envvar

导出环境变量"envvar",以使其对于使用"configfile"命令载入的配置文件可见。
false

不做任何事,只返回一个失败的结果。主要用在if/while之类的控制构造中。
gettext string

把"string"翻译为环境变量"lang"指定的语言。MO格式的翻译文件从环境变量"locale_dir"指定的目录加载。
halt [--no-apm]

关闭计算机。如果指定了 --no-apm 选项,表示不执行APM BIOS调用。否则,计算机使用APM关闭。
help [pattern …]

显示内建命令的帮助信息。如果没有指定"pattern",那么将显示所有可用命令的简短描述。

如果指定了"pattern",那么将只显示名字以这些"pattern"开头的命令的详细帮助信息。
initrd file

为以32位协议启动的Linux内核载入一个"initial ramdisk",并在内存里的Linux设置区域设置合适的参数。

[注意]这个命令必须放在"linux"命令之后使用。
initrd16 file

为以16位协议启动的Linux内核载入一个"initial ramdisk",并在内存里的Linux设置区域设置合适的参数。

[注意]这个命令必须放在"linux16"命令之后使用。
insmod module

载入名为"module"的GRUB2模块。
linux file …

使用32位启动协议从"file"载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。

[注意]使用32位启动协议意味着'vga='启动选项将会失效。如果你希望明确设置一个特定的视频模式,那么应该使用"gfxpayload"环境变量。虽然GRUB可以自动地检测某些'vga='参数,并把它们翻译为合适的"gfxpayload"设置,但是并不建议这样做。
linux16 file …

以传统的16位启动协议从"file"载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。这通常用于启动一些遵守Linux启动协议的特殊工具(例如MEMDISK)。

[注意]使用传统的16位启动协议意味着:(1)'vga='启动选项依然有效,(2)不能启动纯64位内核(也就是内核必须要'CONFIG_IA32_EMULATION=y'才行)。
loadfont file …

从指定的"file"加载字体,除非使用了绝对路径,否则"file"将被视为"$prefix/fonts/file.pf2"文件。
loopback [-d] device file

将"file"文件映射为"device"回环设备。例如:

loopback loop0 /path/to/image
ls (loop0)/

可以使用 -d 选项,删除先前使用这个命令创建的设备。
ls [arg …]

如果不使用参数,那么列出所有对GRUB已知的设备。

如果参数是包含在括号内的一个设备名,那么列出该设备根目录下的所有文件。

如果参数是以绝对路径给出的目录,那么列出这个目录的内容。
lsfonts

列出已经加载的所有字体
lsmod

列出已经加载的所有模块
normal [file]

进入普通模式,并显示GRUB菜单。[说明]只要当前没有处于救援模式,其实就已经是在普通模式中了,所以通常并不需要明确使用此命令。

在普通模式中,命令模块[command.lst]与加密模块[crypto.lst]会被自动按需载入(无需使用"insmod"命令),并且可使用完整的GRUB脚本功能。但是其他模块则可能需要明确使用"insmod"命令来载入。

如果给出了"file"参数,那么将从这个文件中读入命令(也就是作为"grub.cfg"的替代),否则将从"$prefix/grub.cfg"中读入命令(如果存在的话)。你也可以理解为"file"的默认值是'$prefix/grub.cfg'。

可以在普通模式中嵌套调用此命令,以构建一个嵌套的环境。不过一般不这么做,而是使用"configfile"命令来达到这目的。
normal_exit

退出当前的普通模式。如果这个普通模式实例不是嵌套在另一个普通模式里的话,就会返回到救援模式。
parttool partition commands

对分区表进行各种修改。目前只能作用于MBR分区表(DOS分区表),而不能用于GPT分区表。目前仅支持以下三种用法:

(1)设置或去掉分区的激活标记(仅对Windows系统有意义)。
例如:"parttool (hd0,msdos2) +boot"表示为(hd0,msdos2)分区加上激活标记,而"parttool (hd0,msdos2) -boot"则表示去掉(hd0,msdos2)分区的激活标记。

(2)设置或去掉分区的隐藏标记(仅对Windows系统有意义)。
例如:"parttool (hd0,msdos2) +hidden"表示为(hd0,msdos2)分区加上隐藏标记,而"parttool (hd0,msdos2) -hidden"则表示去掉(hd0,msdos2)分区的隐藏标记。

(3)更改分区的类型。其值必须是0x00-0xFF范围内的值。且应该使用'0xNN'格式的十六进制数。
例如:"parttool (hd0,msdos2) type=0x83"表示将(hd0,msdos2)分区类型修改为'0x83'(Linux分区)。
password user clear-password

定义一个名为user的用户,并使用明文口令'clear-password'。不建议使用此命令。
password_pbkdf2 user hashed-password

定义一个名为user的用户,并使用哈希口令'hashed-password'(通过"grub-mkpasswd-pbkdf2"工具生成)。这是建议使用的命令,因为它安全性更高。
probe [--set var] --driver|--partmap|--fs|--fs-uuid|--label device

提取"device"设备的特定信息。如果使用了 --set 选项,则表示将提取的结果保存在"var"变量中,否则将提取的结果直接显示出来。
read [var]

从用户读取一行输入。如果给定环境变量"var",则把它设为所读取的行(不包括结尾的换行符)。
reboot

重新启动
rmmod module

卸载"module"模块
search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name

通过文件[--file]、卷标[--label]、文件系统UUID[--fs-uuid]来查找设备。

如果使用了 --set 选项,那么会将第一个找到的设备设置为环境变量"var"的值。默认的"var"是'root'。

可以使用 --no-floppy 选项来禁止查找软盘设备,因为这些设备非常慢。
set [envvar=value]

将环境变量"envvar"的值设为'value'。如果没有使用参数,则打印出所有环境变量及其值。
source file

直接将"file"文件的内容插入到当前位置。与"configfile"不同,此命令既不切换执行环境,也不会显示一个新的菜单。
test expression
[ expression ]

计算"expression"的值,并在结果为真时返回零值,或者在结果为假时返回非零值,主要用在if/while之类的控制构造中。

可用的"expression"模式如下(与bash类似):

string1 == string2 [string1与string2完全相同]
string1 != string2 [string1与string2不完全相同]
string1 < string2 [string1在字母顺序上小于string2]
string1 <= string2 [string1在字母顺序上小于string2或与string2完全相同]
string1 > string2 [string1在字母顺序上大于string2]
string1 >= string2 [string1在字母顺序上大于string2或与string2完全相同]
integer1 -eq integer2 [integer1等于integer2]
integer1 -ge integer2 [integer1大于或等于integer2]
integer1 -gt integer2 [integer1大于integer2]
integer1 -le integer2 [integer1小于或等于integer2]
integer1 -lt integer2 [integer1小于integer2]
integer1 -ne integer2 [integer1不等于integer2]
prefixinteger1 -pgt prefixinteger2 [剔除非数字字符首部之后,integer1大于integer2]
prefixinteger1 -plt prefixinteger2 [剔除非数字字符首部之后,integer1小于integer2]
file1 -nt file2 [file1的修改时间比file2新]
file1 -ot file2 [file1的修改时间比file2旧]
-d file [file存在并且是一个目录]
-e file [file存在]
-f file [file存在并且不是一个目录]
-s file [file存在并且文件尺寸大于零]
-n string [string的长度大于零]
string [string的长度大于零]
-z string [string的长度等于零]
( expression ) 将expression视为一个整体(分组)
! expression 非(NOT)
expression1 -a expression2 与(AND)
expression1 -o expression2 或(OR)

true

不做任何事,只返回一个成功的结果。主要用在if/while之类的控制构造中。
unset envvar

撤销环境变量"envvar"
videoinfo [[WxH]xD]

列出所有当前可用的视频模式。如果指定了分辨率(或者还附加了色深),那么仅显示与其匹配的模式。

GRUB2安全

在默认情况下,GRUB对于所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB SHELL。要启用认证支持,必须将环境变量"superusers"设置为一组用户名(可用空格/逗号/分号作为分隔符),这样,将仅允许"superusers"中的用户使用GRUB命令行、编辑菜单项、以及执行任意菜单项。而其他非"superusers"中的用户,只能执行那些没有设置 --users 选项的菜单,以及那些在 --users 选项中包含了该用户的菜单,但不能使用GRUB命令行、编辑菜单项。下面使用一个配置片段举例说明:

代码:
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.biglongstring
password user1 insecure

menuentry "所有人都可以执行此菜单" --unrestricted {
...
}

menuentry "仅允许超级用户执行此菜单" --users "" {
...
}

menuentry "允许 user1 和超级用户执行此菜单" --users user1 {
...
}

有关GRUB2安全的更多详情,请参考GRUB2手册中的"Security"部分。
GRUB2实用技巧
如何给GRUB2菜单加上背景图?

首先制作一张PNG格式的图片,分辨率最好是"1024x768"以保证较好的兼容性。然后将这张图片放到"$prefix/themes/1024x768.png"("$prefix"是GRUB2的安装目录)。然后在'grub.cfg'中加入如下内容:

set gfxmode=1024x768,auto
insmod gfxterm
insmod png
terminal_output gfxterm
background_image $prefix/themes/1024x768.png

如何让GRUB2显示中文界面(包括显示中文菜单项)?

由于GRUB2在内部使用UTF-8编码,并且所有文本文件(包括'grub.cfg')也都被假定为使用UTF-8编码,为了避免乱码,请务必以UTF-8编码保存'grub.cfg'文件。

set gfxterm_font=unicode
set lang=zh_CN
set locale_dir=$prefix/locale
insmod gfxterm
terminal_output gfxterm
loadfont unicode

如何更改GRUB2的字体?

如果你认为默认的unicode字体在1024x768或更高分辨率的屏幕上显得太小,或者你认为默认的字体不好看,想换换口味,那么如何自己动手制作一个pf2字体呢?那就要用到"grub-mkfont"工具。下面的示例展示了如何从一个ttc字体(文泉驿等宽微米黑)制作一个24px大小的pf2字体:

grub-mkfont -i1 -n WenQuanYiMicroHeiMono24px -o WenQuanYiMicroHeiMono24px.pf2 -s24 -v wqy-microhei.ttc

将制作好的字体文件(WenQuanYiMicroHeiMono24px.pf2)放到"$prefix/fonts"目录中,修改'grub.cfg'文件中的两行:

set gfxterm_font=WenQuanYiMicroHeiMono24px
loadfont WenQuanYiMicroHeiMono24px

[注意]你最好使用等宽中文字体(推荐使用文泉驿等宽正黑或者等宽微米黑),否则可能会让GRUB2的字体间距过大,十分难看。
如何使用GRUB2引导WindowsPE的ISO文件?

GRUB4DOS有一个非常cool的'磁盘映射'功能,能够用于启动WinPE的ISO文件。其实,将GRUB2的"memdisk"模块配合MEMDISK工具使用,同样可以引导各种镜像文件,包括ISO文件与软/硬盘镜像。

首先,你必须安装或者下载"syslinux"软件包,从中提取出"memdisk"文件(位于'/usr/share/syslinux/memdisk'或'bios/memdisk/memdisk'),然后将它复制到GRUB2的安装目录中,也就是位于"$prefix/memdisk"。

然后,再将你想要引导的WindowsPE的ISO文件放到某个地方,这里假定你和"memdisk"放在一起,也就是位于"$prefix/WinPE.ISO"。当然,为了节约磁盘空间,你也可以用gzip对ISO文件进行压缩,不过这个示例中没有这么做。

最后,在'grub.cfg'中加入如下菜单项(如果你对ISO进行了gzip压缩,那么还需要额外再加上"insmod gzio"命令):

menuentry "Windows PE" --unrestricted {
insmod memdisk
linux16 $prefix/memdisk iso raw
initrd16 $prefix/WinPE.ISO
}

[注意]与GRUB4DOS一样,由于"memdisk"对各种镜像文件的模拟是通过在实模式下拦截BIOS的 INT 13h 与 INT 15h 调用来实现的,所以有很大的局限性:

只能用于BIOS模式启动,不能用于UEFI模式启动
模拟出来的软盘/光盘/硬盘设备只能被基于实模式的操作系统所识别(DOS,FreeDOS),不能被基于保护模式的操作系统所识别(Windows,Linux,BSD)
从实用的角度来说,只能用于引导WinPE的ISO以及基于DOS/FreeDOS的镜像,不能用于引导各种Linux的LiveCD ISO

如何使用GRUB2引导Linux LiveCD的ISO文件?

首先需要说明的是,这里给出的方法,只适用于提供了"iso-scan/filename="或"findiso="之类参数的Linux LiveCD,不适用于未提供此类参数的LiveCD(例如Gentoo)。

下面以最常见的'Ubuntu LiveCD'为例说明。首先,假定你将ISO文件放在'(hd0,gpt3)/ISO/Ubuntu.iso';然后,在'grub.cfg'中加入如下菜单项:

menuentry "Ubuntu LiveCD" --unrestricted {
loopback loop0 (hd0,gpt3)/ISO/Ubuntu.iso
set root=(loop0)
linux /casper/vmlinuz.efi boot=casper iso-scan/filename=/ISO/Ubuntu.iso ro locale=zh_CN.UTF-8
initrd /casper/initrd.lz
}

[说明]这里给出的方法,其实就是各种"硬盘安装XX Linux"的翻版,只不过不再需要将"vmlinuz"与"initrd"从ISO中解压出来而已。

"grub.cfg"实例

下面是本文作者实际使用的一个"grub.cfg"文件,通用于BIOS与UEFI模式,放在这里当作一个实例,供读者参考:

代码:
#################
## (1)特殊变量 ##
#################
#默认启动第一个菜单项
set default=0
#如果第一个菜单项启动失败,转而启动第二个菜单项
set fallback=1
#优先使用最常规的1024x768分辨率,以保证在不同的屏幕上拥有一致的菜单效果,如果失败再自动匹配分辨率
set gfxmode=1024x768,auto
#使用自己制作的24px的大号字体以避免默认字体太小看不清
set gfxterm_font=WenQuanYiMicroHeiMono24px
#将GRUB2设置为简体中文界面
set lang=zh_CN
#指定翻译文件(*.mo)的目录,若未明确设置此目录,则无法显示中文界面。
set locale_dir=$prefix/locale
#每一满屏后暂停输出,以免信息太多一闪而过看不清
set pager=1
#开启密码验证功能,并设置一个名为'root'的超级用户
set superusers=root
#设置菜单的超时时间为5秒
set timeout=5

#################
## (2)公共模块 ##
#################
#两种最流行的磁盘分区格式
insmod part_gpt
insmod part_msdos
#常见文件系统驱动
insmod btrfs
insmod exfat
insmod ext2
insmod fat
insmod iso9660
insmod jfs
insmod ntfs
insmod reiserfs
insmod udf
insmod xfs
insmod zfs
#一次性加载所有可用的视频驱动
insmod all_video
#图形模式终端
insmod gfxterm
#背景图片支持
insmod png

#########################################
## (3)公共命令(必须放在模块和变量之后) ##
#########################################
#激活图形模式的输出终端,以允许使用中文和背景图
terminal_output  gfxterm
#设置背景图片
background_image $prefix/themes/1024x768.png
#加载自己制作的24px的大号字体文件($prefix/fonts/WenQuanYiMicroHeiMono24px.pf2)
loadfont WenQuanYiMicroHeiMono24px
#设置'root'用户的哈希密码[通过"grub-mkpasswd-pbkdf2"工具生成]
password_pbkdf2 root grub.pbkdf2.sha512.69.7DBCA469F80EA1C0A8A1E2FEBC4F8463.B073C1C89EC1E85309C3D6A1BAFF4356

#################
## (4)菜单项   ##
#################

menuentry '正常启动(Windows)' --unrestricted {
if search --file --set --no-floppy /bootmgr ; then
chainloader +1
elif search --file --set --no-floppy /ntldr ; then
chainloader +1
else
echo '没有找到Windows'
sleep --verbose 5
fi
}

if [ 'pc' == $grub_platform ] ; then
menuentry '系统救援(WinPE)' --users=root {
if search --file --set --no-floppy /OS/WinPE.iso ; then
insmod memdisk
linux16  $prefix/memdisk iso raw
initrd16 /OS/WinPE.iso
fi
}
fi

menuentry 'Ubuntu LiveCD amd64' --users=root {
if search --file --set --no-floppy /OS/Ubuntu.iso ; then
loopback loop0 /OS/Ubuntu.iso
set root=(loop0)
linux  /casper/vmlinuz.efi boot=casper iso-scan/filename=/OS/Ubuntu.iso rootwait ro locale=zh_CN.UTF-8
initrd /casper/initrd.lz
fi
}

menuentry 'Gentoo LiveCD' --users=root {
if search --file --set --no-floppy /OS/gentoo/image.squashfs ; then
if [ -f /livecd -a -f /OS/gentoo/gentoo -a -f /OS/gentoo/gentoo.igz ] ; then
linux  /OS/gentoo/gentoo cdroot looptype=squashfs loop=/OS/gentoo/image.squashfs rootwait doscsi nodmraid nokeymap docache dosshd scandelay slowusb passwd=123
initrd /OS/gentoo/gentoo.igz
fi
fi
}

 

Linux系统添加swap虚拟内存与删除配置

1.swap概述
Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。 其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

2.创建swap
由于在安装Centos 6.0 操作系统时候忘记创建创建swap分区,导致使用zabbix对该服务器监控时出现报警。这时才发现,没有创建swap分区。所以需要创建一个swap分区,操作如下:

首先,用拥有ROOT权限的用户通过SSH远程登入或者本地终端登入到系统,进行创建swap分区

dd if=/dev/zero of=/swap/swap bs=1024 count=1024000

if //输入
of //输出
bs //块儿大小
count //总大小
创建Linux交换文件
mkswap /swap/swap
立即激活/swap/swap交换文件
swapon /swap/swap
查看是否生效
[root@webserver ~]# free -m
total used free shared buffers cached
Mem: 2007 140 1867 0 8 35
-/+ buffers/cache: 96 1911
Swap: 972 0 972
通过以上输出信息可以看出,已经成功创建swap分区。
设置成永久生效
虽然现在已经生效,但是等下次服务器重启之后。该swap虚拟磁盘会失效,为保证永久生效,需要在/etc/fstab文件添加如下指令集:
echo "/swap/swap swap swap defaults 0 0" >> /etc/fstab
现在为止,swap分区已经完成创建。

3.删除swap分区

有时可能会需要删除swap分区,该如何正确进行删除分区哪?

首先停止swap分区
swapoff /swap/swap
删除swap分区文件
rm -rf /swap/swap
删除"/etc/swap"指定文件
这样就可以手工添加和删除swap分区。

CentOS虚拟机NAT方式无法上网解决方法

在使用CentOS虚拟机时,出现了无法上网的情况,使用主机ping虚机地址可以ping通,而虚机ping不通主机,同时虚机也无法ping通其他的网址或ip,显示内容为Network is unreachable,后来经过在网上查找解决方法,解决问题,记录如下:

首先打开服务,在services.msc中将VMware的DHCP和NAT服务开启。并修改虚机的接入方式,可以在“编辑虚拟网络”中查看,如下图

1
打开后如下
VMnet0是桥接方式,VMnet1是Host-only方式,VMnet8是NAT方式,子网IP可以自己设置,见1,修改后,需要把2,3中的地址段同时对应修改。

2

这时候最好把除了NAT外其它两个连接方式停掉,将1上面,connect的勾去掉就可以了

之后需要在虚机设置中选择NAT连接方式,,如果没有网络连接方式需要自己添加一下。以上这些设置方法网上有很多,不再赘述。
3
之后仍旧无法联网的,需要打开虚机看看虚机的网络设置了。命令如下
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
其中部分内容如下:
DEVICE=eth0 #设备名称
BOOTPROTO=dhcp #连接方式,dhcp会自动分配地址,此时不需要在下面设置ip和网关
HWADDR=00:0C:29:AD:66:9F #硬件地址,不要修改
ONBOOT=yes #yes表示启动就执行该配置,需要改为yes
网上会有些方法需要在这里添加ip地址,子网掩码,dns之类的,之前安装这些方法试验过,都不行,而且添加的这些内容后来还影响到了上网,所以,不建议采用那些方式添加这些内容。

修改完后需要重启网络设置,可以
# service network restart
或者
# /etc/init.d/network restart
此时如果还是无法连接网络,再回到物理主机,查看网络连接中的本地连接的共享是否打开,在状态->属性->共享中查看,如果没有共享选项卡,就找百度。如果共享已经打开,将Host-Only Network和VMnet8中的ipv4和ipv6服务停掉,前面的勾去掉
4

至此,我的虚机网络连接正常了

Linux下配置VPN

1、检查服务器是否有必要的支持.如果检查结果没有这些支持的话,是不能安装pptp的,执行指令:
#modprobe ppp-compress-18 && echo ok
这条执行执行后,显示”ok”则表明通过.不过接下来还需要做另一个检查,输入指令:
#cat /dev/net/tun
如果这条指令显示结果为下面的文本,则表明通过:
cat: /dev/net/tun: File descriptor in bad state
上述两条均通过,才能安装pptp.否则就只能考虑openvpn,或者请你的服务商来解决这个问题.
2、安装ppp和iptables(iptables可选).默认情况下,完整的CentOS是带有这两个组件的,但是精简版的系统可能没有.我们输入下面的命令来确认,如果没有则进行安装,有的话系统不会做任何动作:
#yum install -y ppp iptables
3、安装pptp.这个软件在yum源里是没有的,我们需要手动下载,我们先切换到tmp目录:
#cd /tmp
然后执行下面的命令来下载pptp安装包:
#wget http://***********************
#rpm -ivh pptpd************.rpm
4、配置pptp.首先我们要编辑/etc/pptpd.conf文件:
#vim /etc/pptpd.conf
找到”locapip”和”remoteip”这两个配置项,将前面的”;”注释符去掉,更改为你期望的IP段值.localip表示服务器的IP,remoteip表示分配给客户端的IP地址,可以设置为区间.这里我们使用pptp默认的配置:
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
注意,这里的IP段设置,将直接影响后面的iptables规则添加命令.请注意匹配的正确性,如果你嫌麻烦,建议就用本文的配置,就可以一直复制命令和文本使用了.
接下来我们再编辑/etc/ppp/options.pptpd文件,为VPN添加Google DNS:
#vim /etc/ppp/options.pptpd
在末尾添加下面两行:
ms-dns 8.8.8.8
ms-dns 8.8.4.4
5、设置pptp VPN账号密码.我们需要编辑/etc/ppp/chap-secrets这个文件:
#vim /etc/ppp/chap-secrets
在这个文件里面,按照”用户名 pptpd 密码 *”的形式编写,一行一个账号和密码.比如添加用户名为test,密码为1234的用户,则编辑如下内容:
test pptpd 1234 *
6、修改内核设置,使其支持转发.编辑/etc/sysctl.conf文件:
#vim /etc/sysctl.conf
将”net.ipv4.ip_forward”改为1,变成下面的形式.
net.ipv4.ip_forward=1
保存退出,并执行下面的命令来生效它:
#sysctl -p
7、添加iptables转发规则.经过前面的6个步骤,我们的VPN已经可以拨号了,但是还不能访问任何网页.最后一步就是添加iptables转发规则了,输入下面的指令:
#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

iptables -A FORWARD -p tcp --syn -s 192.168.2.0/24 -j TCPMSS --set-mss 1356   设置mtu,否则有些网站无法打开,例如百度;
需要注意的是,这个指令中的”192.168.0.0/24″是根据之前的配置文件中的”localip”网段来改变的,比如你设置的”10.0.0.1″网段,则应该改为”10.0.0.0/24″.此外还有一点需要注意的是eth0,如果你的外网网卡不是eth0,而是eth1(比如SoftLayer的服务器就是这样的情况),那么请记得将eth0也更改为对应的网卡编号,不然是上不了网的.
然后我们输入下面的指令让iptables保存我们刚才的转发规则,以便重启系统后不需要再次添加:
#/etc/init.d/iptables save
然后我们重启iptables:
#/etc/init.d/iptables restart
8、重启pptp服务.输入下面的指令重启pptp:
#/etc/init.d/pptpd restart
现在你已经可以连接自己的VPN并浏览网页了.不过我们还需要做最后的一步.
9、设置开机自动运行服务.我们最后一步是将pptp和iptables设置为开机自动运行,这样就不需要每次重启服务器后手动启动服务了,当然你不需要自动启动服务的话可以忽略这一步,输入指令:
#chkconfig pptpd on
#chkconfig iptables on
这样就大功告成了,赶快到Windows下建立一个VPN连接,IP填写自己的服务器IP,用户名和密码填写自己设置好的用户名和密码,点击”连接”,成功后就可以使用服务器去浏览网页啦.

Linux下安装mod_bw和mod_limitipconn限制apache并发连接和下载速度

mod_limitipconn,这个是Apache的一个非官方模块,根据同一个来源IP进行并发连接控制,Bw_mod,它可以根据来源IP进行带宽限制,它们都是apache的第三方模块。
1.下载: wget http://dominia.org/djao/limit/mod_limitipconn-0.22.tar.gz wget http://bwmod.sourceforge.net/files/mod_bw-0.7.tgz
2.安装#tar -zxvf mod_limitipconn-0.22.tar.gz
#cd mod_limitipconn-0.22
#vi Makefile
修改:apxs = “/usr/local/apache2/bin/apxs” # 这里是自己apache的apxs路径,加载模块或者#/usr/local/apache2/bin/apxs -i -c -a mod_limitipconn.c 来加载模块
#make
#make install#tar -xvf mod_bw-0.7.tgz
#cd mod_bw
#/usr/local/apache2/bin/apxs -i -c -a /home/kenami/mod_bw/mod_bw.c下面用vi打开apache 的配置文件 httpd.conf发现了以下两行:LoadModule limitipconn_module modules/mod_limitipconn.so

LoadModule bw_module modules/mod_bw.so
3.配置
<IfModule mod_limitipconn.c>
<Location /home/bo@phpddt.com/attachments/month _*> #需要控制的路径
MaxConnPerIP 3 #限制的线程数
NoIPLimit index.htm #对此文件不做限制
</Location>
</IfModule>在虚拟主机配置文件下面加上: BandwidthModule On
ForceBandWidthModule On
Bandwidth all 10000 #限速10K
MinBandwidth all -1
配置参数说明如下:
a. BandWidthModule On|Off//是否开启mod_bw的带宽限制功能。
b. BandWidth [From] [bytes/s] 设置指定客户机最大带宽,0表示不限制 BandWidth u:[User-Agent] [bytes/s]
c. MinBandWidth [From] [bytes/s] 设置指定客户机带宽的最小值,为0表示每个客户端带宽最大为256bytes/s,为-1表示最大为BandWith的值
d. LargeFileLimit [Type] [Minimum Size] [bytes/s] 设置访问超出特定大小的某种文件的最大带宽,文件类型大小单位为kbytes
e. MaxConnection [From] [Max] 设置指定客户机的最大并发连接数
f. ForceBandWidthModule [On|Off] 默认bw模块将应用所有请求,On可设置过滤类型关于From,即客户端来源可分以下几种情况:IP指定单一主机192.168.1.22指定网段192.168.1.0/24或192.168.1.0/255.255.255.0域名单一主机Client1.phpddt.com域名指定范围.phpddt.com所有客户端all以上配置既可以针对所有客户端,也可以对某个虚拟主机进行配置实例一:BandWidthModule OnBandWidth all 307200BandWidth 192.168.1.2 102400BandWidth “u:^Mozilla/5(.*)” 102400BandWidth “u:wget” 204800ForceBandWidthModule OnLargeFileLimit .avi 600 204800MaxConnection all 100MaxConnnection 192.168.1.2 5以上的配置含义:开启mod_bw, 限制所有文件类型也开启了所有客户端最大带宽为300k,最大并发连接为100192.168.1.2的最大带宽为100k,最大并发连接为5使用FireFox的客户端最大带宽为100k使用wget的客户端最大带宽为200k对超过600k的avi格式的文件最大带宽为200kbyte/s实例二:<Virtualhost *> BandwidthModule On ForceBandWidthModule On LargeFileLimit .avi 1 20000 LargeFileLimit .mpg 1 20000 Servername www.phpddt.com</Virtualhost>该实例对虚拟主机进行了限制,指定的文件类型avi和mpg最大带宽为20K,ForceBandWidthModule On必须有。实例三:<Virtualhost *> BandwidthModule On AddOutputFilterByType MOD_BW text/html text/plain Bandwidth all 5000 Servername www.phpddt.com </Virtualhost>