Skip to content

Commit

Permalink
#29 统一展现风格
Browse files Browse the repository at this point in the history
  • Loading branch information
Arondight committed Mar 9, 2016
1 parent 89ba683 commit fcbc6d6
Show file tree
Hide file tree
Showing 29 changed files with 240 additions and 176 deletions.
1 change: 1 addition & 0 deletions chapter_03/Dual_Booting/Dual_Booting_from_Hard_Drives.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
如果您通过BIOS或EFI管理引导优先级,那么每个硬盘驱动器上的引导加载程序只会考虑自己所在设备而不考虑其他。这与引导装载程序的设计目的相反,但如果电脑上的闭源系统不顾用户喜好,坚持要成为唯一操作系统的话,这是个很有效的解决方案。

如果你没有很多硬盘设备并且又不喜欢折腾多分区的话,你也许会喜欢可启动的USB闪存盘,或是虚拟机。这两个方案已经超出了本书讨论范围(虽然是很常见的方案)。取决于你的需要,任君选择。

7 changes: 4 additions & 3 deletions chapter_03/Dual_Booting/Dual_Booting_with_Partitions.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#### 引导多个分区

在操作系统安装在各自分区的情况下,我们来配置多启动系统。您必须首先创建分区。如果在安装第一个操作系统之前就很好操作,在这种情况下,就是个简单的规划分区的事,使用`fdisk``cfdisk`分区工具,具体参见[“分区”部分](../../chapter_02/Partitioning.md)
在操作系统安装在各自分区的情况下,我们来配置多启动系统。您必须首先创建分区。如果在安装第一个操作系统之前就很好操作,在这种情况下,就是个简单的规划分区的事,使用`fdisk``cfdisk`分区工具,具体参见[第二章的“分区”部分](../../chapter_02/Partitioning.md)

<div class="important" title="Important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">注意</h3><p>
如果你搭建的是两个Linux的双系统,我们不推荐两个系统共用/home. 虽然这在技术上可行,但因为不同的桌面环境和软件版本,会增加你的个人配置文件损坏几率。
Expand All @@ -16,9 +16,9 @@

* 交换分区

首先,按照[第二章,安装](../../chapter_02/README.md)所述,把Slackware安装到第一个分区。
首先,按照[第二章、安装”](../../chapter_02/README.md)所述,把Slackware安装到第一个分区。

安装好,启动好,一切正常之后,重启进入第二系统。第二系统总会想要占用整个驱动器,你显然*不希望*这样做,所以它限制为仅第二个分区。此外,该操作系统将尝试把引导器安装到硬盘驱动器的开头,覆盖LILO.
安装好,启动好,一切正常之后,重启进入第二系统。第二系统总会想要占用整个驱动器,你显然*不希望*这样做,所以它限制为仅第二个分区。此外,该操作系统将尝试把引导器安装到硬盘驱动器的开头,覆盖LILO.

有关引导器,可采取如下做法:

Expand All @@ -45,3 +45,4 @@
</p><p>
使用简单模式LILO的时候,它也会自动探测并创建启动菜单。如果失败了,那么就需要手动创建条目了。
</p></dd></dl></div></div>

1 change: 1 addition & 0 deletions chapter_03/Dual_Booting/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
多启动不应该掉以轻心,但它通常意味着你将有两个不同的试图管理引导程序的操作系统。如果你多启动,很可能一个操作系统会覆盖或更新引导程序条目。如果这种情况发生,你必须手动修改GRUB或LILO来引导这些操作系统。

有两种方法来双(多)启动:你可以把每个操作系统安装在不同的硬盘上(台式机常见,因为台式机有很多硬盘位)或安装在不同分区上(笔记本电脑常见,因为只有一个物理驱动器)。

11 changes: 6 additions & 5 deletions chapter_03/LILO.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ LILO是一种Linux引导器,并且目前是Slackware的默认引导器。如

`liloconfig`是能快速地配置好引导器,但如果你想知道究竟发生了什么的话,你需要看看LILO的配置文件:`/etc`下的`lilo.conf(5)`. `/etc/lilo.conf`分为了几个部分。最上面你能找到全局部分,这部分描述LILO应安装在何处(一般是MBR),启动时显示的图像或信息,启动默认操作系统的等待时长。以下是我的`lilo.conf`的全局部分,长这样:

```fundamental
```
# LILO configuration file
boot = /dev/sda
Expand All @@ -38,7 +38,7 @@ vga = 773

接下来看看操作系统部分。每个Linux操作系统的配置以"image"配置行开头。Microsoft Windows操作系统以"other"配置行开头。现在让我们来看看Slackware和Windows各自的配置样例。

```fundamental
```
# LILO configuration file
... global section ommitted ....
# Linux bootable partition config begins
Expand All @@ -57,14 +57,15 @@ other = /dev/sda3

对于像Slackware这样的Linux操作系统,image配置项规定了要启动的内核。在这个例子中,要启动的内核是`/boot/vmlinuz-generic-2.6.29.4`. 其余的几个配置项看名字就可知道作用:它们告诉LILO根分区的位置,使用哪个`initrd`文件,把根文件系统挂载为只读。`initrd`配置项对于那些使用通用内核,或使用LVM和软件RAID的人十分重要。它告诉LILO(以及内核)在哪找到使用`mkinitrd`创建的`initrd`.

配置好`/etc/lilo.conf`后,运行`lilo(8)`来安装。不像GRUB和其他引导器那样,在更改配置文件之后需要重新运行lilo, 不然新修改的引导器镜像不会被安装,所做出的修改不会生效。
配置好`/etc/lilo.conf`后,运行`lilo(8)`来安装。不像GRUB和其他引导器那样,在更改配置文件之后需要重新运行`lilo`, 不然新修改的引导器镜像不会被安装,所做出的修改不会生效。

```Shell
```
darkstar:~# lilo
Warning: LBA32 addressing assumed
Added Slackware *
Added Backup
6 warnings were issued.
```

看见这些警告不必太惊慌,这些并不代表lilo出了问题,除非发现了致命错误。另外,LBA32 addressing 的警告是常有的事。
看见这些警告不必太惊慌,这些并不代表`lilo`出了问题,除非发现了致命错误。另外,LBA32 addressing的警告是常有的事。

1 change: 1 addition & 0 deletions chapter_03/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
## 第三章、引导

既然你已经安装好了一个Slackware系统,你就应该学习些关于系统启动的知识,比如是什么控制着机器的启动顺序,当这一机制损坏的时候如何修复。如果你已使用Linux足够长的时间,你总有可能搞坏你的bootloader. 还好,修复它并不需要重装一次系统。Linux(更确切一点,Slackware)给予您启动过程的完全控制权,而不是像其他系统一样将底层工作原理隐藏起来。简单到只需修改几个配置文件并重新运行bootloader安装程序,你就能又快又好地修改(或破坏)你的系统。Slackware还让多系统启动更加简单,比如和其他Linux发行版或Microsoft Windows组成多系统。

25 changes: 13 additions & 12 deletions chapter_03/mkinitrd.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

查看一下你的`/boot`目录,就会发现安装在你系统上的各种各样的内核。

```Shell
```
darkstar:~# ls -1 /boot/vmlinuz*
/boot/vmlinuz-huge-2.6.29.4
/boot/vmlinuz-generic-2.6.29.4
Expand All @@ -14,13 +14,13 @@ darkstar:~# ls -1 /boot/vmlinuz*

巨型内核正如其名。但这**并不**意味着它们含有所有可用的驱动程序并把这些驱动编译进入内核。相反,这些内核是为了能够启动(并运行)在所有Slackware能支持的电脑上而设计的(虽然仍有一部分电脑无法正常启动/运行)。它们大多包含一些针对你机器上没有的硬件(以后也不会有)的支持,但这不是重点。出于各种原因我们附带上了这些内核,其中最重要的原因就是——它们是Slackware安装介质使用的内核。如果你选择让安装程序为您自动配置bootloader的话,它会使用这些内核来为数不尽的硬件提供支持。与之相反,通用内核不使用外部模块的话只能驱动很少一部分的硬件。如果你想使用通用内核的话,你就会用上initrd, 它是`mkinitrd(8)`工具生成的。

那么,为什么要使用通用内核呢?目前出于各种原因,Slackware的开发团队建议使用通用内核。也许最显然的原因是文件大小。在未压缩并未加载到内存之前,巨型内核是通用内核的约两倍大小​​。如果您运行的是旧机器,或内存很小的机器,你会明白通用内核缩减大小的好处。其他原因就较为难以量化。巨型内核包含的驱动程序之间时不时就会发生冲突。一般来讲,​​巨型内核性能不如通用内核。此外,使用通用内核的话,就分别能给硬件驱动传递特殊的参数,而不需要在内核命令行上传递。如果你的内核使用的是外部模块形式的驱动程序,而不是静态地把他们构建进内核的时候,一些Slackware上的工具的性能会更高。如果你不是很懂,也不要惊慌:只要记得“巨型内核=好,通用内核=更好”。
那么,为什么要使用通用内核呢?目前出于各种原因,Slackware的开发团队建议使用通用内核。也许最显然的原因是文件大小。在未压缩并未加载到内存之前,巨型内核是通用内核的约两倍大小​​。如果您运行的是旧机器,或内存很小的机器,你会明白通用内核缩减大小的好处。其他原因就较为难以量化。巨型内核包含的驱动程序之间时不时就会发生冲突。一般来讲,​​巨型内核性能不如通用内核。此外,使用通用内核的话,就分别能给硬件驱动传递特殊的参数,而不需要在内核命令行上传递。如果你的内核使用的是外部模块形式的驱动程序,而不是静态地把他们构建进内核的时候,一些Slackware上的工具的性能会更高。如果你不是很懂,也不要惊慌:只要记得“巨型内核意味着好,通用内核意味着更好”。

不幸的是,使用通用内核不如使用巨型内核那么简单。为了使通用内核来引导你的系统,你还必须在`initrd`上加载几个基本模块。模块是编译好的内核代码段,可插入内核或从运行的内核去掉(最好使用`modprobe(8)`, 这使得系统只是增加了一点点的复杂性的基础上变得更加灵活。至少在这个部分,模块会让你联想到设备驱动程序。通常情况下,安装时不管你的根分区是什么文件系统都要加载对应的模块,如果你的根分区位于SCSI硬盘或者RAID控制器上也要加载模块。最后,如果你使用软件RAID, 硬盘加密,或LVM, 你还需要创建一个`initrd`, 无论你是否使用通用内核。
不幸的是,使用通用内核不如使用巨型内核那么简单。为了使通用内核来引导你的系统,你还必须在initrd上加载几个基本模块。模块是编译好的内核代码段,可插入内核或从运行的内核去掉(最好使用`modprobe(8)`, 这使得系统只是增加了一点点的复杂性的基础上变得更加灵活。至少在这个部分,模块会让你联想到设备驱动程序。通常情况下,安装时不管你的根分区是什么文件系统都要加载对应的模块,如果你的根分区位于SCSI硬盘或者RAID控制器上也要加载模块。最后,如果你使用软件RAID, 硬盘加密,或LVM, 你还需要创建一个initrd, 无论你是否使用通用内核。

`initrd`是一个`cpio(1)`文档,所以创建起来不是那么简单。还好,Slackware为你提供了一个使这一过程简单化的工具:`mkinitrd`. 真要详细讨论`mkinitrd`的话就超出了本书的讨论范围,在此只展示重点。更详细的解释请看手册页或使用`mkinitrd`[--help]参数。
initrd是一个`cpio(1)`文档,所以创建起来不是那么简单。还好,Slackware为你提供了一个使这一过程简单化的工具:`mkinitrd`. 真要详细讨论`mkinitrd`的话就超出了本书的讨论范围,在此只展示重点。更详细的解释请看手册页或使用`mkinitrd`[--help]参数。

```Shell
```
darkstar:~# mkinitrd --help
mkinitrd creates an initial ramdisk (actually an initramfs cpio+gzip
archive) used to load kernel modules that are needed to mount the
Expand All @@ -32,7 +32,7 @@ initrd, and the script is easy to modify. Be creative. :-)

使用`mkinitrd`时,你需要掌握如下几个信息:你的根分区、根分区文件系统、你所使用的所有硬盘控制器、是否在使用LVM, 软件RAID, 硬盘加密。除非你在用某种SCSI控制器(并且根分区位于其上),你只需要知道根分区的文件系统和分区类型。现在假设你使用巨型内核启动进入了Slackware安装环境,此时只需使用`mount`命令查看`/proc/mount`的内容就能轻易地知道。

```Shell
```
darkstar:~# mount
/dev/sda1 on / type ext4 (rw,barrier=1,data=ordered)
proc on /proc type proc (rw)
Expand All @@ -42,18 +42,18 @@ usbfs on /proc/bus/usb type usbfs (rw)
tmpfs on /dev/shm type tmpfs (rw)
```

在上面的这个例子中,能知道你的根分区位于`/dev/sda1`并且是一个ext4分区类型。如果想为这个系统创建`initrd`, 只需将这些信息告知`mkinitrd`.
在上面的这个例子中,能知道你的根分区位于`/dev/sda1`并且是一个ext4分区类型。如果想为这个系统创建initrd, 只需将这些信息告知`mkinitrd`.

```Shell
```
darkstar:~# mkinitrd -f ext4 -r /dev/sda1
```

值得注意的是`mkinitrd`在大多数情况下能够自行确定这些信息,但自己手动指定的话又不会有什么坏处。既然我们创建了`initrd`, 我们就要告诉LILO去哪能找到它。这些将在下一章节详细描述。

看看这些`mkinitrd`的选项就头疼,更别说记下它们了,尤其是你还想尝试各种不同内核的时候。Slackware开发团队也觉得很不爽,所以他们制作了一个简单的配置文件,`mkinitrd.conf(5)`. 你能在`/etc/mkinitrd.conf.sample`找到样板文件并自己定制。拿我自己的举例:

```Shell
darkstar:~# >/prompt>cat /etc/mkinitrd.conf.sample
```
darkstar:~# cat /etc/mkinitrd.conf.sample
# See "man mkinitrd.conf" for details on the syntax of this file
#
SOURCE_TREE="/boot/initrd-tree"
Expand All @@ -71,12 +71,13 @@ LVM="1"
#WAIT="1"
```

若想详细了解这里每一行干了什么,请参见`mkinitrd.conf`的手册页面。将该样板复制为`/etc/mkinitrd.conf`并做出你自己的定制化修改。成功配置后,只需以[-F]参数运行`mkinitrd`, 这样就能得到正确的`initrd`文件而不用去记忆那些繁之又繁的参数
若想详细了解这里每一行干了什么,请参见`mkinitrd.conf`的手册页面。将该样板复制为`/etc/mkinitrd.conf`并做出你自己的定制化修改。成功配置后,只需以[-F]参数运行`mkinitrd`, 这样就能得到正确的initrd文件而不用去记忆那些繁之又繁的参数

如果你不确定如何确定配置文件选项或命令行参数,以下是最终选择:Slackware提供了一个小工具(`/usr/share/mkinitrd/mkinitrd_command_generator.sh`),能告知你当前运行内核所需的选项值。运行这个脚本后就能输出对应你当前电脑的`mkinitrd`命令,不过你最好还是在运行前检查一遍。

```Shell
```
darkstar:~# /usr/share/mkinitrd/mkinitrd_command_generator.sh
mkinitrd -c -k 2.6.33.4 -f ext3 -r /dev/sda3 -m \
usbhid:ehci-hcd:uhci-hcd:ext3 -o /boot/initrd.gz
```

1 change: 1 addition & 0 deletions chapter_04/Archive_and_Compression/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
### 归档和压缩

每个人都会有把各种小文件打包以便存储,或压缩大文件的需要。也许你两个都需要?正好我们这里有能够达成目标的工具。

5 changes: 3 additions & 2 deletions chapter_04/Archive_and_Compression/XZ_LZMA.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#### XZ、LZMA

最新加入Slackware的压缩工具就是`xz`, 它使用的是LZMA压缩算法。它比`bzip2`更快并且压缩效果更好。实际上,它因为在速度和压缩效果上出色的综合表现,已经成为Slackware的首选压缩方案了。不过,`xz`在我们成书之时还没有手册页,所以要查看所有选项,使用[--help]参数。压缩使用[-z], 解压使用[-d].
最新加入Slackware的压缩工具就是`xz`, 它使用的是LZMA压缩算法。它比`bzip2`更快并且压缩效果更好。实际上,它因为在速度和压缩效果上出色的综合表现,已经成为Slackware的首选压缩方案了。不过,`xz`在我们成书之时还没有手册页,所以要查看所有选项,使用`--help`参数。压缩使用`-z`, 解压使用`-d`.

```Shell
```
darkstar:~$ xz -z /tmp/large_file
```

1 change: 1 addition & 0 deletions chapter_04/Archive_and_Compression/bzip2.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#### bzip2

一个`gzip`的替代品就是`bzip2(1)`, 与`gzip`功能几乎相同。`bzip2`的优点就是号称能有更大压缩强度。不过,更大压缩强度意味着慢以及更多CPU占用,所以`bzip2`一般比其他压缩工具耗时更长。

7 changes: 4 additions & 3 deletions chapter_04/Archive_and_Compression/gzip.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@

Slackware所附带的最古老的压缩工具就是`gzip(1)`了。它一次只能处理一个文件。与`zip`能够压缩和打包不同,`gzip`只能压缩。你第一感觉这是个缺点,但实际上这是它的强大之处。UNIX的哲学之一就是让程序只做一件事并做到最好。这就让程序们能以无限多的组合方式来完成工作。要想压缩一个(或多个)文件,只需将它们作为参数传递给`gzip`.

```Shell
```
darkstar:~$ gzip /tmp/large_file
```

解压就使用`gunzip`, 它会解压出文件并删除原来的压缩文件。

```Shell
```
darkstar:~$ gunzip /tmp/large_file.gz
darkstar:~$ ls /tmp/large_file*
/tmp/large_file
```

但如果我们不希望删除压缩文件,只想查看内容的话怎么办?`zcat`程序能读取`gzip`文件,解压到内存并将内容传输到标准输出(也就是终端屏幕,除非使用了重定向。重定向详见“[输入输出重定向](../../chapter_05/Input_and_Output_Redirection.md)”)。

```Shell
```
darkstar:~$ zcat /tmp/large_file.gz
Wed Aug 26 10:00:38 CDT 2009
Slackware 13.0 x86 is released as stable! Thanks to everyone who helped
Expand All @@ -28,3 +28,4 @@ to help support the project. Once again, thanks to the entire Slackware
community for all the help testing and fixing things and offering
suggestions during this development cycle.
```

29 changes: 15 additions & 14 deletions chapter_04/Archive_and_Compression/tar.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,29 @@

使用`tar`可以简单也可以复杂,随你喜好。一般,生成tarball要使用参数[-cvzf]. 我们来深入地看看:

|参数|意义|
|:----:|----:|
|c|创建tarball|
|x|解压tarball|
|t|显示tarball内容|
|v|输出更多信息|
|z|使用gzip压缩方案|
|j|使用bzip2压缩方案|
|J|使用LZMA压缩方案|
|p|保留权限信息|

`tar`对于参数的顺序要求比别的程序更严格。[-f]参数当读或写入文件时必须出现,并且紧跟其后的必须是文件名。看看这个例子:
| 参数 | 意义 |
| :----: | ----: |
| c | 创建tarball |
| x | 解压tarball |
| t | 显示tarball内容 |
| v | 输出更多信息 |
| z | 使用gzip压缩方案 |
| j | 使用bzip2压缩方案 |
| J | 使用LZMA压缩方案 |
| p | 保留权限信息 |

`tar`对于参数的顺序要求比别的程序更严格。`-f`参数当读或写入文件时必须出现,并且紧跟其后的必须是文件名。看看这个例子:

```Shell
```
darkstar:~$ tar -xvzf /tmp/tarball.tar.gz
darkstar:~$ tar -xvfz /tmp/tarball.tar.gz
```

上面,第一个命令能够正常运行,第二个会失败因为tar会尝试打开文件`z`而不是`/tmp/tarball.tar.gz`.

既然我们已经充分了解了参数的意义,来让我们看看如何创建和解压tarball. 前面已经说过,[-c]参数用来创建而[-x]用来解压。如果想创建或解压一个压缩过的tarball, 我们需要指定合适的压缩方案。自然,如果不想压缩文件也可以不填。下面的这个命令使用gzip算法创建并压缩一个tarball. 尽管没有严格要求,但还是加上`.tar`的扩展名以及所使用的压缩算法为最好。
既然我们已经充分了解了参数的意义,来让我们看看如何创建和解压tarball. 前面已经说过,`-c`参数用来创建而`-x`用来解压。如果想创建或解压一个压缩过的tarball, 我们需要指定合适的压缩方案。自然,如果不想压缩文件也可以不填。下面的这个命令使用gzip算法创建并压缩一个tarball. 尽管没有严格要求,但还是加上`.tar`的扩展名以及所使用的压缩算法为最好。

```Shell
darkstar:~$ tar -czf /tmp/tarball.tar.gz /tmp/tarball/
```

Loading

0 comments on commit fcbc6d6

Please sign in to comment.