Linux 系统管理

作者:Mark Komarinski

当您首次安装 Linux 时,您至少创建了一个文件系统来存储 Linux。如果您像我一样,您很快就会觉得需要更多驱动器空间。现在的问题是,您到底如何创建新的文件系统,以及如何复制文件?本月的文章将帮助您做到这一点。我还将深入描述 /etc/inittab 文件,这是一个非常重要的文件,它在您启动系统时被加载。当为扩展系统空间创建文件系统时,您需要考虑一些事项。您希望新的文件系统位于何处?扩大您的 /usr 目录可能是您需要的,但扩展您的 /usr/X386 目录可能是一个更好的主意。请记住,并非所有文件系统都必须来自 / (根) 目录。您可以将任何目录挂载到任何文件系统,但不要将以下任何内容放在 / 以外的其他文件系统上:/etc /dev /lib /sbin /bin /conf。这些目录中的每一个在启动期间都是必需的,而其他文件系统在 Linux 启动*后*才会被挂载。这可能会使 Linux 启动变得困难或不可能。让我们假设您想让您的用户分区更大,并且您的用户主目录位于 /user 目录中,目前位于 / (根) 分区上。以下是您需要做的。注意:IDE 驱动器是 /dev/hda 和 /dev/hdb。SCSI 驱动器使用 /dev/sda 到 /dev/sde。您的特定设置可能与我的示例设置不同。请阅读所有说明,并确保您在开始之前了解正在发生的事情!!如果您感到困惑,请查看我引用的命令的手册页。它们非常有帮助。

创建您想要使用的分区。

进入 fdisk (`fdisk' 后跟驱动器名称—/dev/hda, /dev/hdb, 等)。使用 n 命令创建一个新分区。现在将询问您分区类型(扩展分区、主分区或逻辑分区)。用您想要使用的分区类型回答。现在,您必须给出一个起始柱面。为了简单起见,只需输入您在列表中看到的第一个数字。在此之后,您现在必须输入分区的大小,以 1K 块为单位。您也可以输入一个数字,后跟 M,以指定该数字为 1Meg 块。因此,30M 的答案将创建一个 30Meg 分区。您的新分区现在应该设置好了。键入 p 以列出您的分区,并记下您刚刚创建的分区的块大小。您将在下一步中需要它。退出 fdisk (使用 w 命令),您可能希望此时重新启动您的机器,以确保分区被正确读取。在我的设置中,我刚刚安装了一个新驱动器,我将在我的第二个硬盘驱动器 (/dev/hdb) 上创建一个逻辑分区

#fdisk /dev/hdb
Command (m for help): n
First cylinder (205-731): 205
Last cylinder or +size or +sizeM or +sizeK (205-731): +30M
Warning: partition 5 has an odd number of sectors.
Command (m for help): w
The partition table has been altered!
Calling BLKRRPART ioctl() to reread partition table
Syncing disks
Reboot your system to ensure partition table is updated
#
创建文件系统

创建 Second Extended Filesystem 的命令是 mke2fs。我正在使用 EXT2FS(俗称),因为它现在提供了许多功能,并且具有内置的未来支持能力。例如,它支持一个干净位,如果您成功卸载文件系统,您以后就不会被要求执行文件系统检查。这使得 Linux 启动速度更快。还可以支持压缩文件系统,其中文件会自动压缩。这尚未编码到文件系统中,但当内核支持它时,您将拥有一个压缩文件系统。但回到创建文件系统。键入命令:mke2fs -c <partition> <size in blocks> 其中 <partition> 是您希望格式化的硬盘驱动器分区,<blocks> 是您在上一步中记下的 1K 块的数量。-c 告诉 mke2fs 自动检查坏块。这将有助于避免以后硬盘驱动器尝试写入坏块时出现意外。

在我的情况下

#mke2fs -c /dev/hdb5 31019
{Various data about number of inodes, number of blocks, etc} #
复制您要移动的分区

最好的方法是使用 tar (磁带归档) 命令。tar 文件将存储重要的信息,如文件所有权、权限和文件日期,而复制命令会丢失这些信息。使用 du -s <directory> 命令找出您正在复制的文件的大小,其中 <directory> 是您要移动到新分区的目录。-s 选项将给出所有文件和目录的总大小。我想要 /user 目录的磁盘使用情况,所以 df -s /user 将告诉我 /user 目录当前占用了多少空间

#df -s /user
11906 #

由于这个数字是以 1K 块为单位的,我知道我的 /user 目录和该目录下的所有用户文件占用略低于 12Meg 的空间。幸运的是,我的根分区有 15Meg 的可用空间(您可以使用 df 命令检查您的可用空间)。使用以下命令创建您的 /user 目录的 tar 文件:tar -cvf <tar file> <directory>,其中 <tarfile> 告诉您要将 tar 文件命名为什么,而 <directory> 是您要 tar 压缩的目录。对我来说,这将是

#cd / #tar -cvf /user.tar /user user user/root user/root/.bashrc
{list of files} #

c 选项告诉 tar 您要创建一个 tar 文件,v 选项告诉 tar 告诉您它正在将哪些文件添加到 tar 文件中,f 选项告诉 tar 它看到的下一个东西是要创建的文件。现在,如果您在根目录中并键入 ls -la user.tar,您应该会看到类似

#ls -la user.tar -rw-r-r-   1 root     root        12103680 Mar  1 01:41
user.tar #
删除旧目录

现在是有趣的部分。是的,您可以使用可怕的、致命的、但又微妙的 rm -r 命令。但请注意!以任何方式错误地键入此命令都可能导致您的系统崩溃,或者丢失您不想丢失的文件!在您执行此操作之前,请确保您的数据已备份在某处!确保它在您刚刚创建的 tar 文件中,或者如果您真的想确保安全,请创建第二个备份!

我将逐步进行

  1. 进入您要删除的目录。对我来说,这是 /user 目录,所以我键入

    #cd /user #
    
  2. 验证您是否在正确的目录中!使用 pwd 命令告诉您您在哪里。如果您不在正确的目录中,请返回步骤 1。我的响应应该是

    #pwd /user #
    
  3. 如果您仍然对使用 rm -r * 有顾虑,请进入每个目录,删除目录中的文件,然后手动删除目录。这更安全,但需要更多时间。使用 rm <file> 命令删除文件,目录可以使用 rmdir <directory> 命令删除。rm -rv 命令将删除当前目录中的所有内容,以及该目录的所有子目录。`v' 选项将列出删除过程中删除的所有内容,以便您知道正在发生什么。

    #rm -rv * {list of files and subdirectories} #
    
挂载新分区

确保您要挂载的目录存在。例如,如果我想在 /user 上挂载分区,则 /user 目录必须存在。现在您可以挂载您几分钟前创建的分区,并使其成为您系统的功能部分:mount -t ext2 <partition> <directory>,其中 <partition> 是您要挂载的分区,而 <directory> 是您要挂载该分区的挂载点。在我的例子中,我将使用

#mount -t ext2 /dev/hdb5 /user
#

如果您更改目录到您的新目录,它看起来就像以前一样,只是有一个新目录 - lost+found。此目录是 e2fsck 放置它不知道的块的地方。这类似于 DOS chkdsk 命令创建的文件。但是,只要您正确关闭系统并且很少发生断电或系统崩溃,您可能永远不需要进入此目录。

将文件复制到目录中

现在我们将像上次一样使用 tar 命令,只是现在我们要提取 user.tar 中的文件。这将恢复文件到其原始外观。它们将具有相同的所有权、相同的文件日期,最重要的是,相同的数据。键入

cd / tar -xvf <tar file>

其中 <tar file> 是我们之前步骤中的磁带归档文件。

对我来说

#cd / #tar -xvf user.tar user user/root user/root/.bashrc {list
        of files} #

现在您又回到了本文开始时的状态,只是用户空间更大了很多。还有一件事必须做。那就是将您的新文件系统添加到启动文件中,以便您的新分区在您每次启动 Linux 时都会自动挂载。这是一个简单的部分。进入 /etc 目录,并编辑 fstab 文件。在文件末尾,添加一行格式为

<partition> <mount point> <fstype> defaults

其中 <partition> 是硬盘驱动器分区,<mount point> 是您要将分区挂载到的目录,而 <fstype> 是您正在使用的文件系统类型。您可能会看到其他条目,其中 fstype 为 ext2、proc 或 swap。这些描述了 EXT2FS(我们正在使用的文件系统)、/proc 文件系统(用于系统状态信息)以及虚拟内存或交换空间。

我必须添加的行看起来像

/dev/hdb5  /user   ext2    defaults

保存文件,下次您启动 Linux 时,分区将自动从 /user 分区挂载。

哇,这很有趣,孩子们?现在继续介绍您的配置文件的一部分。我将介绍大部分配置文件,我们将从首先被读取的程序之一开始 - /etc/inittab。

您可能已经注意到,当您运行 ps aux 时,有一个名为 init 或 /etc/init 的文件正在运行。这是您系统上所有其他程序的父程序,从初始化文件(如 /etc/inetd)到允许您登录系统的 getty 程序,init 都会启动它。

由于 inittab 文件的各个部分随 /etc 实用程序的各种版本而变化,我将向您展示 inittab 的一些主要部分。任何精细的细节都可以在 init 和 inittab 的手册页中找到。

首先,init 在很大程度上基于运行级别。例如,一个运行级别可以定义为“安全启动”,其中只有 root 可以登录。

另一个运行级别可以设置您的串行端口以接受登录。您可以在启动时设置这些运行级别,您可以在启动时手动输入运行级别,或者可以使用 /etc/telinit 命令动态更改运行级别。

inittab 文件中的条目有四个字段

   rc:123456:wait:/etc/rc.M

字段 1 是唯一标识符,字段 2 列出了此命令适用的运行级别,字段 3 告诉 init 在运行程序时要执行的操作,字段 4 列出了要运行的程序。

在您的 inittab 文件中,您可能会看到一行在第三个字段中包含 `initdefault'。该行上的数字将指定启动时要使用的运行级别。如果 inittab 文件中没有该行,系统将提示您输入运行级别。我的设置为 `5',我的行看起来像这样

   id:5:initdefault:

如果默认运行级别设置为 `S' 或 `s',Linux 将进入单用户模式,其中 /bin/sh 会在控制台上自动启动。

接下来,init 查找与它们关联的类型为 `boot' 或 `bootwait' 的条目。这允许运行诸如您的 /etc/rc 文件之类的文件,以便在第一个用户登录之前挂载所有分区。`boot' 条目意味着启动该进程,但不等待它完成。`bootwait' 条目意味着运行该程序并等待它成功完成,然后再执行下一步。我没有这些条目,因为它允许我使用不同的 /etc/rc 文件。

接下来,init 查找列出了该特定运行级别的行。在第二个字段中,您应该有一个程序可以在其中启动的运行级别列表。例如,我有一个运行级别 6,它会自动启动 X-Windows,而我的其他 5 个运行级别当前未使用。我的配置文件的条目看起来像这样

rc:123456:wait:/etc/rc.d/rc.M x1:6:wait:/etc/rc.d/rc.6

在这里,/etc/rc.d/rc.M(M 代表多用户)每次都会启动。但在运行级别 6 上,它将启动启动 X-Windows 自动启动所需的额外程序。正如您所看到的,rc.M 文件将在除 `S' (单用户) 之外的每个运行级别上执行,因为所有其他运行级别都列在第二个字段中。第三个字段 `wait' 告诉 init 等待该程序完成,然后再转到下一个 init 条目。

下一组重要的条目是控制 getty 的条目,getty 是监视控制台和串行端口以进行登录的程序。我的看起来像这样

c1:12345:respawn:/sbin/agetty 38400 tty1

以及其他几行,不同之处在于 `tty1' 是 `tty2',`c1' 是 `c2'。这里重要的是第三个和第四个字段。`respawn' 条目告诉 init,如果程序停止运行,则重新启动另一个程序。这意味着当您注销时,init 将自动启动另一个 getty 程序,以便您再次获得登录提示。如果没有 `respawn',在您注销后,您将无法在该虚拟控制台上重新登录。

如果您想将哑终端连接到您的机器,您可能需要注意其他几行。这些行可能是通过在行首添加 `#' 注释掉的两行

   #s1:45:respawn:/sbin/agetty 9600 ttyS0 #s2:45:respawn:/sbin/agetty
        9600 ttyS1

如果您取消注释某行并在运行级别 4 或 5 中重新启动(或使用 /etc/telinit),则将在该特定串行端口上启动 getty 进程。请记住,ttyS0 与 DOS 中的 COM1 相关,ttyS1 与 COM2 相关,依此类推。重新启动后,如果您键入 `ps aux',您应该会看到 `/sbin/agetty 9600 ttyS0',并且如果您将终端或另一台 PC 连接到串行端口,您应该会获得登录提示。

加载 Disqus 评论