Thinking in Peak
是技术?是信息?还是思想?! 是垃圾?是堆积?还是思想?! Version:1.2
Page layout from PHP& More
 Peak.name

Home | About me | Life history | Mood story | >>Thinking in Peak | My Diary | Photography | Project | Contact me

Search


Categories
Recent Archives
February 12 - February 18
November 20 - November 26
July 31 - August 06
July 24 - July 30
June 26 - July 02
May 29 - June 04
March 27 - April 02
February 27 - March 05
January 09 - January 15
November 14 - November 20
>>> All archives <<<
Links
24hour online
Charset.org
Peak Jing's home page
Peak正在读看听...

BlogBus.Com
东方网景商务网站
超越PHP

美丽新世纪
wendy's Space
avenger::Blog()
Lemon & YB
Snoopy Home
Donna's Story
ZhaoJMan : My Eye(s)
混混程序员
Raid Cheng's Blog
Boyan.net
一个军人的旅程

IBUZZO, THE SOCIALIST
De Dream
人生攻略
海风乱吹
妖蛊
ByBye

跳舞的小蚂蚁
小三摄影
Momoko World
车东BLOG
LEON也博客
Vol de Nuit
Eosin的什锦糖果盒子
fanroc的凡人生活
1-Game@第1游戏
Tools
Recent Comments
Share bookmarks
Syndicate this site (XML)
Free Guestmap from Bravenet.com

Count :
Powered by MT3.11



July 27, 2005


Ext2 文件系统的硬盘布局

  文章来源:IBM DeveloperWorks

  本文主要讲述 Linux 上比较流行的 ext2 文件系统在硬盘分区上的详细布局情况。Ext2 文件系统加上日志支持的下一个版本是 ext3 文件系统,它和 ext2 文件系统在硬盘布局上是一样的,其差别仅仅是 ext3 文件系统在硬盘上多出了一个特殊的 inode(可以理解为一个特殊文件),用来记录文件系统的日志,也即所谓的 journal。由于本文并不讨论日志文件,所以本文的内容对于 ext2 和 ext3 都是适用的。

一、前言

  本文的资料来源是 Linux 内核中 ext3 文件系统的源代码。为了便于读者查阅源代码,本文中一些关键的技术词汇都使用了内核源代码中所使用的英语单词,而没有使用相应的中文翻译。(这种方法是否恰当,还请读者朋友们指教。)

二、粗略的描述

  对于 ext2 文件系统来说,硬盘分区首先被划分为一个个的 block,一个 ext2 文件系统上的每个 block 都是一样大小的,但是对于不同的 ext2 文件系统,block 的大小可以有区别。典型的 block 大小是 1024 bytes 或者 4096 bytes。这个大小在创建 ext2 文件系统的时候被决定,它可以由系统管理员指定,也可以由文件系统的创建程序根据硬盘分区的大小,自动选择一个较合理的值。这些 blocks 被聚在一起分成几个大的 block group。每个 block group 中有多少个 block 是固定的。
  每个 block group 都相对应一个 group descriptor,这些 group descriptor 被聚在一起放在硬盘分区的开头部分,跟在 super block 的后面。所谓 super block,我们下面还要讲到。在这个 descriptor 当中有几个重要的 block 指针。我们这里所说的 block 指针,就是指硬盘分区上的 block 号数,比如,指针的值为 0,我们就说它是指向硬盘分区上的 block 0;指针的值为 1023,我们就说它是指向硬盘分区上的 block 1023。我们注意到,一个硬盘分区上的 block 计数是从 0 开始的,并且这个计数对于这个硬盘分区来说是全局性质的。
  在 block group 的 group descriptor 中,其中有一个 block 指针指向这个 block group 的 block bitmap,block bitmap 中的每个 bit 表示一个 block,如果该 bit 为 0,表示该 block 中有数据,如果 bit 为 1,则表示该 block 是空闲的。注意,这个 block bitmap 本身也正好只有一个 block 那么大小。假设 block 大小为 S bytes,那么 block bitmap 当中只能记载 8*S 个 block 的情况(因为一个 byte 等于 8 个 bits,而一个 bit 对应一个 block)。这也就是说,一个 block group 最多只能有 8*S*S bytes 这么大。
  在 block group 的 group descriptor 中另有一个 block 指针指向 inode bitmap,这个 bitmap 同样也是正好有一个 block 那么大,里面的每一个 bit 相对应一个 inode。硬盘上的一个 inode 大体上相对应于文件系统上的一个文件或者目录。关于 inode,我们下面还要进一步讲到。
  在 block group 的 descriptor 中另一个重要的 block 指针,是指向所谓的 inode table。这个 inode table 就不止一个 block 那么大了。这个 inode table 就是这个 block group 中所聚集到的全部 inode 放在一起形成的。

  一个 inode 当中记载的最关键的信息,是这个 inode 中的用户数据存放在什么地方。我们在前面提到,一个 inode 大体上相对应于文件系统中的一个文件,那么用户文件的内容存放在什么地方,这就是一个 inode 要回答的问题。一个 inode 通过提供一系列的 block 指针,来回答这个问题。这些 block 指针指向的 block,里面就存放了用户文件的内容。

回顾
  现在我们回顾一下。硬盘分区首先被分为好多个 block。这些 block 聚在一起,被分成几组,也就是 block group。每个 block group 都有一个 group descriptor。所有这些 descriptor 被聚在一起,放在硬盘分区的开头部分,跟在 super block 的后面。从 group descriptor 我们可以通过 block 指针,找到这个 block group 的 inode table 和 block bitmap 等等。从 inode table 里面,我们就可以看到一个个的 inode 了。从一个 inode,我们通过它里面的 block 指针,就可以进而找到存放用户数据的那些 block。我们还要提一下,block 指针不是可以到处乱指的。一个 block group 的 block bitmap 和 inode bitmap 以及 inode table,都依次存放在这个 block group 的开头部分,而那些存放用户数据的 block 就紧跟在它们的后面。一个 block group 结束后,另一个 block group 又跟着开始。

三、详细的布局情况

Super Block
  所谓 ext2 文件系统的 super block,就是硬盘分区开头(开头的第一个 byte 是 byte 0)从 byte 1024 开始往后的一部分数据。由于 block size 最小是 1024 bytes,所以 super block 可能是在 block 1 中(此时 block 的大小正好是 1024 bytes),也可能是在 block 0 中。

  硬盘分区上 ext3 文件系统的 super block 的详细情况如下。其中 __u32 是表示 unsigned 不带符号的 32 bits 的数据类型,其余类推。这是 Linux 内核中所用到的数据类型,如果是开发用户空间(user-space)的程序,可以根据具体计算机平台的情况,用 unsigned long 等等来代替。下面列表中关于 fragments 的部分可以忽略,Linux 上的 ext3 文件系统并没有实现 fragments 这个特性。另外要注意,ext3 文件系统在硬盘分区上的数据是按照 Intel 的 Little-endian 格式存放的,如果是在 PC 以外的平台上开发 ext3 相关的程序,要特别注意这一点。如果只是在 PC 上做开发,倒不用特别注意。

struct ext3_super_block {
/*00*/ __u32 s_inodes_count;      /* inodes 计数 */
       __u32 s_blocks_count;      /* blocks 计数 */
       __u32 s_r_blocks_count;    /* 保留的 blocks 计数 */
       __u32 s_free_blocks_count; /* 空闲的 blocks 计数 */
/*10*/ __u32 s_free_inodes_count; /* 空闲的 inodes 计数 */
       __u32 s_first_data_block;  /* 第一个数据 block */
       __u32 s_log_block_size;    /* block 的大小 */
       __s32 s_log_frag_size;     /* 可以忽略 */
/*20*/ __u32 s_blocks_per_group;  /* 每 block group 的 block 数量 */
       __u32 s_frags_per_group;   /* 可以忽略 */
       __u32 s_inodes_per_group;  /* 每 block group 的 inode 数量 */
       __u32 s_mtime;             /* Mount time */
/*30*/ __u32 s_wtime;             /* Write time */
       __u16 s_mnt_count;         /* Mount count */
       __s16 s_max_mnt_count;     /* Maximal mount count */
       __u16 s_magic;             /* Magic 签名 */
       __u16 s_state;             /* File system state */
       __u16 s_errors;            /* Behaviour when detecting errors */
       __u16 s_minor_rev_level;   /* minor revision level */
/*40*/ __u32 s_lastcheck;         /* time of last check */
       __u32 s_checkinterval;     /* max. time between checks */
       __u32 s_creator_os;        /* 可以忽略 */
       __u32 s_rev_level;         /* Revision level */
/*50*/ __u16 s_def_resuid;        /* Default uid for reserved blocks */
       __u16 s_def_resgid;        /* Default gid for reserved blocks */
       __u32 s_first_ino;         /* First non-reserved inode */
       __u16 s_inode_size;        /* size of inode structure */
       __u16 s_block_group_nr;    /* block group # of this superblock */
       __u32 s_feature_compat;    /* compatible feature set */
/*60*/ __u32 s_feature_incompat;  /* incompatible feature set */
       __u32 s_feature_ro_compat; /* readonly-compatible feature set */
/*68*/ __u8  s_uuid[16];          /* 128-bit uuid for volume */
/*78*/ char  s_volume_name[16];   /* volume name */
/*88*/ char  s_last_mounted[64];  /* directory where last mounted */
/*C8*/ __u32 s_algorithm_usage_bitmap; /* 可以忽略 */
       __u8  s_prealloc_blocks;        /* 可以忽略 */
       __u8  s_prealloc_dir_blocks;    /* 可以忽略 */
       __u16 s_padding1;               /* 可以忽略 */
/*D0*/ __u8  s_journal_uuid[16]; /* uuid of journal superblock */
/*E0*/ __u32 s_journal_inum;     /* 日志文件的 inode 号数 */
       __u32 s_journal_dev;      /* 日志文件的设备号 */
       __u32 s_last_orphan;      /* start of list of inodes to delete */
/*EC*/ __u32 s_reserved[197];    /* 可以忽略 */
};
  我们可以看到,super block 一共有 1024 bytes 那么大。在 super block 中,我们第一个要关心的字段是 magic 签名,对于 ext2 和 ext3 文件系统来说,这个字段的值应该正好等于 0xEF53。如果不等的话,那么这个硬盘分区上肯定不是一个正常的 ext2 或 ext3 文件系统。从这里,我们也可以估计到,ext2 和 ext3 的兼容性一定是很强的,不然的话,Linux 内核的开发者应该会为 ext3 文件系统另选一个 magic 签名才对。

  在 super block 中另一个重要的字段是 s_log_block_size。从这个字段,我们可以得出真正的 block 的大小。我们把真正 block 的大小记作 B,B = 1 << (s_log_block_size + 10),单位是 bytes。举例来说,如果这个字段是 0,那么 block 的大小就是 1024 bytes,这正好就是最小的 block 大小;如果这个字段是 2,那么 block 大小就是 4096 bytes。从这里我们就得到了 block 的大小这一非常重要的数据。

Group Descriptors
  我们继续往下,看跟在 super block 后面的一堆 group descriptors。首先注意到 super block 是从 byte 1024 开始,一共有 1024 bytes 那么大。而 group descriptors 是从 super block 后面的第一个 block 开始。也就是说,如果 super block 是在 block 0,那么 group descriptors 就是从 block 1 开始;如果 super block 是在 block 1,那么 group descriptors 就是从 block 2 开始。因为 super block 一共只有 1024 bytes 那么大,所以不会超出一个 block 的边界。如果一个 block 正好是 1024 bytes 那么大的话,我们看到 group descriptors 就是紧跟在 super block 后面的了,没有留一点空隙。而如果一个 block 是 4096 bytes 那么大的话,那么在 group descriptors(从 byte 4096 开始)和 super block 的结尾之间,就有一定的空隙(4096 - 2048 bytes)。

  那么硬盘分区上一共有多少个 block group,或者说一共有多少个 group descriptors,这我们要在 super block 中找答案。super block 中的 s_blocks_count 记录了硬盘分区上的 block 的总数,而 s_blocks_per_group 记录了每个 group 中有多少个 block。显然,文件系统上的 block groups 数量,我们把它记作 G,G = (s_blocks_count - s_first_data_block - 1) / s_blocks_per_group + 1。为什么要减去 s_first_data_block,因为 s_blocks_count 是硬盘分区上全部的 block 的数量,而在 s_first_data_block 之前的 block 是不归 block group 管的,所以当然要减去。最后为什么又要加一,这是因为尾巴上可能多出来一些 block,这些 block 我们要把它划在一个相对较小的 group 里面。

  注意,硬盘分区上的所有这些 group descriptors 要能塞在一个 block 里面。也就是说 groups_count * descriptor_size 必须小于等于 block_size。

  知道了硬盘分区上一共有多少个 block group,我们就可以把这么多个 group descriptors 读出来了。先来看看 group descriptor 是什么样子的。

struct ext3_group_desc
{
 __u32 bg_block_bitmap;      /* block 指针指向 block bitmap */
 __u32 bg_inode_bitmap;      /* block 指针指向 inode bitmap */
 __u32 bg_inode_table;       /* block 指针指向 inodes table */
 __u16 bg_free_blocks_count; /* 空闲的 blocks 计数 */
 __u16 bg_free_inodes_count; /* 空闲的 inodes 计数 */
 __u16 bg_used_dirs_count;   /* 目录计数 */
 __u16 bg_pad;               /* 可以忽略 */
 __u32 bg_reserved[3];       /* 可以忽略 */
};

  每个 group descriptor 是 32 bytes 那么大。从上面,我们看到了三个关键的 block 指针,这三个关键的 block 指针,我们已经在前面都提到过了。

Inode
  前面都准备好了以后,我们现在终于可以开始读取文件了。首先要读的,当然是文件系统的根目录。注意,这里所谓的根目录,是相对于这一个文件系统或者说硬盘分区而言的,它并不一定是整个 Linux 操作系统上的根目录。这里的这个 root 目录存放在一个固定的 inode 中,这就是文件系统上的 inode 2。需要提到 inode 计数同 block 计数一样,也是全局性质的。这里需要特别注意的是,inode 计数是从 1 开始的,而前面我们提到过 block 计数是从 0 开始,这个不同在开发程序的时候要特别留心。(这一奇怪的 inode 计数方法,曾经让本文作者大伤脑筋。)

  那么,我们先来看一下得到一个 inode 号数以后,怎样读取这个 inode 中的用户数据。在 super block 中有一个字段 s_inodes_per_group 记载了每个 block group 中有多少个 inode。用我们得到的 inode 号数除以 s_inodes_per_group,我们就知道了我们要的这个 inode 是在哪一个 block group 里面,这个除法的余数也告诉我们,我们要的这个 inode 是这个 block group 里面的第几个 inode;然后,我们可以先找到这个 block group 的 group descriptor,从这个 descriptor,我们找到这个 group 的 inode table,再从 inode table 找到我们要的第几个 inode,再以后,我们就可以开始读取 inode 中的用户数据了。

  这个公式是这样的:block_group = (ino - 1) / s_inodes_per_group。这里 ino 就是我们的 inode 号数。而 offset = (ino - 1) % s_inodes_per_group,这个 offset 就指出了我们要的 inode 是这个 block group 里面的第几个 inode。

  找到这个 inode 之后,我们来具体的看看 inode 是什么样的。

struct ext3_inode {
 __u16 i_mode;    /* File mode */
 __u16 i_uid;     /* Low 16 bits of Owner Uid */
 __u32 i_size;    /* 文件大小,单位是 byte */
 __u32 i_atime;   /* Access time */
 __u32 i_ctime;   /* Creation time */
 __u32 i_mtime;   /* Modification time */
 __u32 i_dtime;   /* Deletion Time */
 __u16 i_gid;     /* Low 16 bits of Group Id */
 __u16 i_links_count;          /* Links count */
 __u32 i_blocks;               /* blocks 计数 */
 __u32 i_flags;                /* File flags */
 __u32 l_i_reserved1;          /* 可以忽略 */
 __u32 i_block[EXT3_N_BLOCKS]; /* 一组 block 指针 */
 __u32 i_generation;           /* 可以忽略 */
 __u32 i_file_acl;             /* 可以忽略 */
 __u32 i_dir_acl;              /* 可以忽略 */
 __u32 i_faddr;                /* 可以忽略 */
 __u8  l_i_frag;               /* 可以忽略 */
 __u8  l_i_fsize;              /* 可以忽略 */
 __u16 i_pad1;                 /* 可以忽略 */
 __u16 l_i_uid_high;           /* 可以忽略 */
 __u16 l_i_gid_high;           /* 可以忽略 */
 __u32 l_i_reserved2;          /* 可以忽略 */
};

  我们看到在 inode 里面可以存放 EXT3_N_BLOCKS(= 15)这么多个 block 指针。用户数据就从这些 block 里面获得。15 个 blocks 不一定放得下全部的用户数据,在这里 ext3 文件系统采取了一种分层的结构。这组 15 个 block 指针的前 12 个是所谓的 direct blocks,里面直接存放的就是用户数据。第 13 个 block,也就是所谓的 indirect block,里面存放的全部是 block 指针,这些 block 指针指向的 block 才被用来存放用户数据。第 14 个 block 是所谓的 double indirect block,里面存放的全是 block 指针,这些 block 指针指向的 block 也被全部用来存放 block 指针,而这些 block 指针指向的 block,才被用来存放用户数据。第 15 个 block 是所谓的 triple indirect block,比上面说的 double indirect block 有多了一层 block 指针。作为练习,读者可以计算一下,这样的分层结构可以使一个 inode 中最多存放多少字节的用户数据。(计算所需的信息是否已经足够?还缺少哪一个关键数据?)

  一个 inode 里面实际有多少个 block,这是由 inode 字段 i_size 再通过计算得到的。i_size 记录的是文件或者目录的实际大小,用它的值除以 block 的大小,就可以得出这个 inode 一共占有几个 block。注意上面的 i_blocks 字段,粗心的读者可能会以为是这一字段记录了一个 inode 中实际用到多少个 block,其实不是的。那么这一字段是干什么用的呢,读者朋友们可以借这个机会,体验一下阅读 Linux 内核源代码的乐趣。;-)

文件系统的目录结构
  现在我们已经可以读取 inode 的内容了,再往后,我们将要读取文件系统上文件和目录的内容。读取文件的内容,只要把相应的 inode 的内容全部读出来就行了;而目录只是一种固定格式的文件,这个文件按照固定的格式记录了目录中有哪些文件,以及它们的文件名,和 inode 号数等等。

struct ext3_dir_entry_2 {
 __u32 inode;    /* Inode 号数 */
 __u16 rec_len;  /* Directory entry length */
 __u8  name_len; /* Name length */
 __u8  file_type;
 char  name[EXT3_NAME_LEN]; /* File name */
};

  上面用到的 EXT3_NAME_LEN 是 255。注意,在硬盘分区上的 dir entry 不是固定长度的,每个 dir entry 的长度由上面的 rec_len 字段记录。

四、小结

  有了以上的这些信息,我们就可以读取一个 ext3 文件系统的全部内容了。如果读者有 Windows 驱动程序开发的经验,从本文的信息,开发一个 Windows 下只读的 ext3 文件系统是可能的。但是要想又读又写,那还需要了解 Ext3 的日志文件的结构,而本文限于篇幅,并没有包括这方面的内容。

五、参考资料

  1. Remy Card, Theodore Ts'o, Stephen Tweedie, Design and Implementation of the Second Extended Filesystem, http://web.mit.edu/tytso/www/linux/ext2intro.html
  2. Linux Kernel 2.4.18 Source Code, http://lxr.linux.no/source/fs/ext3/


六、关于作者
  赵蔚,是中国大陆第二个注册的 Debian GNU/Linux 义务开发人员。作者对于 LISP 和 Lambda Calculus 也有浓厚的兴趣。

Posted by Peak at July 27, 2005 01:33 PM | Comments (0) | TrackBack (5)


August 27, 2004


Apache Modules助你轻松搭建更多高级应用

Peak Jing:: Apache LOGOApache HTTPD 已经成为在Unix平台下Web server的重要角色,占据着大部分的市场份额。做为Apache子项目之一,与 Apache其它多个子项目 有着良好的结合特性,共同造就了 Apache 应用的大船。
在B/S结构的系统中,Web server可以发挥很大作用,Apache的项目都是开源的,所以有最大可能让最终用户去扩展。 Modules.apache.org 为用户和第三方Module开发者提供了集中发布和查询平台,目前注册的Module共有343个,包含了 Apahce HTTPD 的多个方面扩展应用,通过这些Module可以实现更多实用的高级功能,举两个例子:
Apache HTTPD 的访问日志是记录在文本文件中的,如果要对其进行分析,就必须先对日志文件进行处理,筛选后再存储到关系型数据库中,最后对数据提取分析。在 Modules.apache.org 中有一个 mod_log_mysql 可以把日志直接存入 MySQL 数据库中,这样就可以轻松实现实时的访问统计分析。
再如虚拟主机提供商希望能够实现方便可靠的虚拟主机管理系统,而且 Apahce HTTPD 的虚拟主机配置是CONF文件中,虽然可以使用虚拟路径别名来改进,但也不能确保数据的同步。 mod_vhs 就可以实现类似的功能,虚拟主机配置信息记录在数据库中。
Modules.apache.org 中提供了根据 Apache HTTPD 的两个版本进行查询的功能,你可以找到所需要的Module。如果你是开发人员可以参照其 API文档 开发新的Module,并可以 注册到这个系统 中。如果对使用这些Module有任何问题, Google 的英文搜索会给你更多的信息。

Posted by Peak at August 27, 2004 05:36 PM | Comments (0) | TrackBack (2)


August 13, 2004


Proftpd-1.2.9+MySQL4.1.3-beta安装方法

近日在试验一些新的软件,发现Proftpd-1.2.9+MySQL4.1.3-beta安装会编译失败,在网上未找到可以解决这个问题的方法,自己用了简单的方法已经解决了这个问题。
在make时会报以下错误:

mod_sql_mysql.c: In function `cmd_checkauth':
mod_sql_mysql.c:1293: too many arguments to function `make_scrambled_password'
make[1]: *** [mod_sql_mysql.o] Error 1
make[1]: Leaving directory `/home/admin/software/proftpd-1.2.9/modules'
make: *** [modules] Error 2
解决方法是把contrib/mod_sql_mysql.c的1293行改成make_scrambled_password(scrambled, c_clear);,重新编译,搞定。
Proftpd+MySQL的详细安装方法请参阅张微波的proftpd学习笔记
Posted by Peak at August 13, 2004 12:59 PM | Comments (1) | TrackBack (2)


June 15, 2004


[转载]RHCE考试Trouble Shooting中,linux 系统不能开机或可能出现的错误情况

文章来源:中国Linux论坛

作者:羊(flaunt@rest7.com)
主页:http://blueflybird.rest7.com
欢迎转载,但请保留此段

下周一(2004年4月19日)就要到上海参加RHCE考试,考完后基本上不会再碰这些无
关紧要的问题。实际上,只要有充足的时间,任何一个对linux有充分兴趣的大虾小虾们
都能想办法在不重装系统的前提下,上google查资料修复这些问题。但RHCE考试中时间
比较紧张,而一个系统管理员也不可能把所有千奇百怪的问题都遇到,所以了解一些常见
trouble还是有好处的。

RHCE不代表甚麽,虽然相对于其他许多考试RHCE要难一些,通过后也不会成为理论
家,不知如何实战,尤其在国内假文凭满天飞的情况下(假不是指制假文凭假证
书那种假,现在非常多的非常正规的教育部门的文凭,实际上与假的没甚麽区别),RHCE
比较容易受人尊敬(同时向CCIE敬礼),但RHCE考得毕竟比较浅,象许多坛子里的RHCE
们说的,RHCE的服务设置贵在广而不是精,RHCE仅仅是开始,拿不拿这个证就看
它对你有没有用了。anyway,在准备RHCE的过程中,你会发现自己以前忽略的一些基础
知识,对于考RHCE值不值这个问题总是仁者见仁,智者见智,就懒得想那么多了。


(假设系统中至少已经安装有grub或lilo程序,按错误可能发生的顺序,包括root帐号不
能正常登录的情况,写这个错误情况最初的目的是让自己有个大的概念,希望没有误人子
弟)


一、MBR错误。

由于意外原因,主引导记录被破坏,新手安装多操作时系统常发生先装linux再装windows
类系统后只能引导win的情况。这种情况下,grub.conf或lilo.conf正常,只需进入rescue
模式重安装一次MBR即可。
情况描述:只能进入win类系统或开机后BIOS自检通过后黑屏无任何提示。


二(1)、引导程序错误

grub.conf或lilo.conf文件错误。修改了grub.conf或lilo.conf后,或者硬盘物理位置和分区
发生变化后造成不能正常启动。进入rescue模式,修改grub.conf或lilo.conf即可。注意修
改了lilo.conf后需执行lilo命令(可加-v 参数查看详细信息)
情况描述:
(一)grub的一般情况
1、如果没有找到内核(vmlinuz-x.x.x文件),
  出现File not found
    Press any key to continue....
  说明root(hdx,x)错误,或内核文件名不对
2、如果找到内核后,运行一会,
  出现kernel Panic:Not init Found,
  一般来说是没有找到根分区(/分区)即root=/dev/xxx不对
3、如果找到内核后,运行一会,
  出现Kernel panic: VFS: Unable to mount root fs on ...,
  一般来说可能忘了加上initrd /initrd-2.4.21-4.EL.img(大多情况发生在使用scsi硬盘)
4、总的来说grub.conf里面必须存在的就几行。
#more grub.conf
title linux
root (hd0,1) #/boot分区所在位置
kernel /vmlinuz-2.4.21-4.EL ro root=/dev/TEST/root 
#内核和根分区(/分区)位置
(根分区可能是LVM和raid,而不仅是hdx和sdx)
initrd /initrd-2.4.21-4.EL.img

平时练习grub.conf菜单文件的最好办法是把这个文件删掉,每次重启时自己使用grub的
交互命令行就快就会对文件里面的内容熟悉。
(二)lilo的一般情况
lilo中没有找到内核文件或ramdisk文件(initrd-2.4.xx.x.ximg)出现的提示与grub中相同,
但如果是分区发生变化就会出现众所周知的L、LI、010101等错误。
lilo.conf中必须出现的几行。
image=/boot/vmlinuz-2.4.21-4.EL #内核所在位置
label=linux           #等于grub中的title
root=/dev/sdc1  #根分区所在位置
initrd=/boot/initrd-2.4.21-4.EL.img
注意如果lilo中不加boot=/dev/sdx,则运行lilo程序时,需加参数指明
lilo -b /dev/sdx

(三)综述
1、grub.conf文件设置错误可以使用交互命令进入系统,而lilo.conf文件设置错误又没有
设delay值的话,连sigle模式都无法进入,只能用rescue修复。修改文件后发正常的重启
信号就行了,不用执行sync命令。
2、lilo.conf文件中基本上不管有没有/boot分区,而grub就要区别有无/boot分区,grub.conf
中root(hdx,x),如果有/boot分区,这个root就是指/boot分区,如果/boot只是作为一个目
录在根分区中(/分区),这个root(hdx,x)就是/分区的所在位置。
3、那麽:lilo.conf文件中的内核和根分区(/分区)的位置能不能象grub.conf这样写呢:
lilo:
image=/boot/vmlinuz-2.4.21-4.EL root=/dev/sdc1
grub:
kernel /vmlinuz-2.4.21-4.EL ro root=/dev/TEST/root 
结果lilo是无法找到/分区。
4、记住lilo.conf和grub.conf都有4行必须写,不同之处在于grub.conf中多了一行指明/boot
目录(注意不是/boot分区,而仅仅是/boot目录)所在分区的位置,而lilo.conf中把kernel
和根分区(/分区)拆行为两行。
5、我估计grub和lilo是troubleshooting中必考项目


二(2)、/initrd目录

这个该死的问题搞了我一整个下午,说来话长,写在最后(估计考试中不大可能出这种题,
要不就太缺德了)。


三、/etc/inittab

***(/etc/initab还可能在后面发生错误)*****

(一)如果出现INIT: No inittab file found
    Enter runlevel:
一般来说就是inittab文件丢失或者有错误。
(二)如果启动基本正常,到了
INIT:Entering runlevel: 3     (或者 5)
后,就开始出现一系列错误,很有可能/etc/inittab文件中
si::sysinit:/etc/rc.d/rc.sysinit 这一行发生错误
由于系统许多模块还没有初始化。

只能进入rescue模式,如果对inittab文件不很熟悉的话,最好把initscripts的rpm包重装
一次。默认的/etc/inittab文件应该能正常启动。


四、/etc/fstab

/etc/fstab文件错误(比/etc/inittab文件后出错)

(一)出现WARNING:coundn't open /etc/fstab: No such file or directory
/etc/fstab文件丢失
/etc/fstab文件不属于任何rpm包,利用fdisk和e2label命令查看根分区(/分区)、/boot、/home、
/usr、/var分区(如果有这几个分区),然后编辑/etc/fstab文件,注意fstab文件的格式,如
果记不住,可以查看帮助:如果未mount /分区,则先装载,如果/usr分区单列,装载/usr
分区。如果在rescue模式下则先chroot。
查找fstab的帮助文件:
1、直接man fstab
2、locate fstab
  你会发现有个叫fstab.5.gz的文件,一般在/usr/share/man/man5/fstab.5.gz
  可以 man /usr/share/man/man5/fstab.5.gz
  或者 zless /usr/share/man/man5/fstab.5.gz
3、rpm -ql mount | grep fstab 也能找到fstab的帮助文件
4、find / -iname "*fstab*"  最笨的办法
如果不是在rescue模式,修改fstab文件时出来Read-only file system咋办?重新装载成读
写模式
mount -o remount,rw /dev/sdax /

(二)mount 文件丢失或被替换
mount 文件错误会出现/proc文件相关错误,红字显示很醒目,
此时比较麻烦,需进入rescue模式而不是进入输入root口令进行修改,因为根分区现在被
mount成只读(ro)模式,你没有mount命令来把根分区mount 成读写的(rw)。

(三)文件系统错误
1、使用fsck进行修复,郁闷的是无论出现什么提示只能选y,要不系统依然有问题。
2、可能文件系统的superblock有问题,把备份的恢复即可。(考试中这种情况几乎不可能)
fsck.ext3 -b (8192*n)+1

(四)raid或LVM错误
使用raid和lvm的知识进行修复,如果raid盘或lvm盘中没有数据,则可把/etc/fstab中提
到的/dev/mdx和/dev/xxxxxx/xxx相关的注释掉。如何修复raid或lvm上的数据估计Redhat
是不会考的。
我在做实验时,发现RedHat Enterprise AS3的/etc/rc.sysinit有个小bug
如果我在做raid的基础上把raid做到LVM里面去,重启系统时,会报告出错。
例如:
1、编辑/etc/raidtab #设一个任意级别的 md0
2、mkraid /dev/md0  #假设一切都正常,该raid则可使用了
3、pvcreate /dev/md0 #建立LVM的pv
4(方法一)、vgextend VGname /dev/md0 #把md0加到现有vg中
4(方法二)、vgcreate VGname /dev/md0 /dev/sdax #新建一个vg
5、lvcreate -L 5G -n newlv VGname #在VGname这个vg中建立一个5G
的名字newlv的lv
6、mkfs.ext3 /dev/VGname/newlv #格式化成ext3文件系统
7、把/dev/VGname/newlv加到/etc/fstab中
8、reboot
你会发现系统出错。原来/etc/rc.sysinit在启动raid时,是根据/etc/fstab这个文件来的,如
果/etc/fstab中没有以/dev/mdx开头行,则不启动/etc/raidtab中的md0、md1.....,重启系统,
你会发现启动raid时有(skiped)的东东。如果这个raid是属于LVM中的一个pv,所以在
启动LVM的时候,也跟着出错。
临时办法倒是有:编辑/etc/rc.sysinit,因为在rc.sysinit文件中确定/etc/fstab中是否有raid?br>?用的grep命令:
INFSTAB=`LC_ALL=C grep -c "^$i" /etc/fstab`
其中INFSTAB是确定命令是否成功的变量,$i是/etc/raidtab 文件中的md0或md1...etc,
把$i前面的^去掉即可。

(五)quota设置错误
大不了把/etc/fstab中的usrquota和grpquota全部关闭。
FIXME:是否还有其他发生错误的可能?


五、/etc/inittab

***/etc/inittab文件错误***
系统反复重启或启动后就关机
设置了错误的runlevel,如0或6


六、其他daemon错误

情霰冉细丛樱菹允境龃砦笮畔⒕龆ㄈ绾涡薷础?


七、/etc/inittab

***如果服务基本已经启动完毕却出现***

INIT: no more processes left in this runlevel

可能是没有程序守护 tty1或tty2等,即/etc/inittab文件中少了
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
等等

出现这种情况,如果不大明白//etc/inittab的格式,强制重装initscripts的rpm包即可


八、xwindow错误

一般来说与/etc/X11/XF86config文件有关,考试中不可能涉及硬盘问题。
运行redhat-config-xfree86一般都能解决,可能发生的问题较多,普通点的就是刷新率,显
示模式如800x600等。


九、root不能正常登录

********密码及PAM相关*******

(一)出现Login incorrect 多半与密码相关
1、的确是密码错误 单用户模式修改
2、root用户被锁 单用户模式 usermod -U root 即可
3、没有root用户,即没有uid为0的用户
4、/etc/securetty文件中没有tty*(*表示1,2,3,4等)

(二)输入用户名和密码后,只见屏幕一闪,,那多半与authconfig、pam有关了
1、三轮车夫同志遇到的。authconfig时,选了ldap认证,后来ldap服务器的地址变了后,
就无法登录。
   解决办法:运行 authconfig取消该选项。
2、/etc/pam.d/system-auth中添加了
   account required /lib/security/$ISA/pam_access.so
   或其他类似的pam模式限制,如pam_listfile.so、pam_time.so等。
  解决办法同上,运行authconfig后会自动删掉。
3、/etc/pam.d/login中添加了
   account required /lib/security/$ISA/pam_access.so
   或其他类似的pam模式限制,如pam_listfile.so、pam_time.so等。
  解决办法:只有手工去查看login文件,运行authconfig后不会自动取消。
4、/etc/pam.d/ 目录中的system-auth 或login中的模块文件名有误。
  模块文件名错误同样会使系统无法登录。
  建议发生无法登录的情况时,到单用户或rescue模式,首先查看/var/log/secure 和
message文件。


*****关于第二点的说明*****

二(2)、/initrd目录

该问题困扰了整个下午。从头说起:

中午在linuxsir.org的论坛上发现一位叫Proarfei的发了个贴子,内容如下:

----------发贴内容-----------
RHAS3-请求帮助!
安装RHAS3时很顺利,由于是双系统,而且我希望是ntldr做主启动程序,所以我选择了
GRUB安装位置在引导分区的第一扇区,但很奇怪的是,AS在安装完成处没有提示创建
引导盘,在RH9中是有这一步的,我在查询AS3的安装说明中也没有这步骤,但在说明
GRUB配置时说可以创建引导在别的盘上,我不是很清楚AS3是如何创建引导程序在软盘
上的,请各位高手指点一二。
-----------发帖结束-----------


AS3中的确没有创建引导盘这一步,当时我不明白Proarfei究竟是想用软盘引导还是想在
ntldr中引导linux,于是回贴如下:


-----------回帖内容-----------
如果想用软盘启动linux与grub无关。
制作启动盘
mkbootdisk `uname -r`

如果想在nt启动菜单选择启动
ntldr是由配置文件boot.ini提供工作参数的,该文件位于Windows XP系统分区的根目录下,
具有隐藏、系统、只读属性。我们只需要将Red Hat Linux的引导记录作为一个文件备份到
C盘的根目录下,并相应地在boot.ini文件里添加一个项目来指向它们,就可以实现双重系
统了。
参见:
target="_blank">http://tech.ccidnet.com/pub/article/c738_a79178_p1.html
-----------回帖结束-----------


由于平时从来没有用过mkbookdisk做过系统盘,不知是否有效,于是自己顺便做个实验,
以免乱说误人子弟。谁知道偶在AS3上用这个命令做盘时,显示:

[root@blueflybird root]# mkbootdisk --device /dev/fd0 `uname -r`
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press to continue or ^C to abort:
cp: writing `/tmp/mkbootdisk.MPg6Cy/initrd.img': No space left on device
cat: write error: No space left on device
cat: write error: No space left on device
20+0 records in
20+0 records out

靠,空间不足,而且还不说到底是哪个盘的空间不足,整得我连忙用df查看。
结果毕竟还是做好了启动盘(只是不能使用该盘正常启动)

而此时偶又想起,如果Proarfei同志只是要引导linux,把lilo或grub安装到软盘上也行啊,
根本不用mkbookdisk做系统盘。等到论坛上回完贴,心里很不爽,为什么偶用mkbookdisk
做的盘就不能启动呢?

突然偶又想起(偶已经想起了很多次什么东东了),是不是偶用的scsi硬盘造成ramdisk太
大的原因哦,管他三七二十二,还是二十三,去找个IDE盘接上,把scsi中的文件复制到
ide中

cp -a /bin /sbin /var /lib /etc /boot /dev /usr /IDE/
由于根分区中的/root区内编译2.6的内核也占了1G,所以/root /tmp /proc 几个区就自己建
了,swap,暂时不用吧
象/mnt /home /misc 目前对我来说毫无价值,懒得管他,这样拷了好久(幸亏还有笔记本
可以用)。

终于拷完,把grub也装上,卸下scsi盘,再把IDE放到第一个位置,reboot
从SCSI开始出错。

-----------屏幕结束-----------
/lib/BusLogic.o:init_module:
Hint: insmod errors can be caused by incorrect module parameters, including invalid IOor IRQ
parameters.
you may find more information in syslog or the output from dmesg
ERROR:/bin/insmod exited abnormally!
.
.
调ext3.o module正常
.
.
Mounting root filesystem 正常
.
.
pivortroot:pivot_root(/sysroot,/sysroot/initrd)failed: 2
umount /initrd/proc failed: 2
Freeing unused kernel memory: 164k freed
Kernel panic: No init found. Try passing init= option to kernel
-----------显示结束-----------

以后的事让我越来越不爽,甚至变得气急败坏,许许多多的事反反复复做了许多遍。
一、拆下IDE,装上SCSI
二、拆下SCSI,装上IDE
三、看/var/log/dmesg,反复拆,反复看,里面屁都没有一个最新的
四、mkinitrd /boot/initrd.2.4.x.x.xEl `uname -r`
五、加参数--omit-scsi-modules
六、加参数--omit-raid-modules
七、加参数--omit-lvm-modules
八、试用各种组合方式
九、重新回想系统启动的顺序
十、IDE和SCSI整在一起,考文件,拷了删,再删了拷
十一、差点就准备用dd
十二、发狂中
十三、看电视、胃痛
十四、启动时向内核加参数init=/bin/sh、加1。
十五、用带scsi-modules 的ramdisk和不带scsi-modules 的ramdisk
十六、明明知道本来许多无关的情况,都尽量试试关掉再打开。
十七、再重新回想系统启动的顺序

怎么会想得到与/initrd 这个目录有关系?????正绝望中看到
umount /initrd/proc failed: 2
心想总不可能与/initrd有关系吧,管他妈的,试了再说。

好了,进入rescue建立/initrd目录后,他妈的一切正常了。
然后制作了一个不带scsi、raid、lvm的ramdisk,initrd.2.4..x.x.x.img的尺寸小了一大半,
重启也正常,再用

[root@blueflybird root]# mkbootdisk `uname -r`

一切非常正常,也可以正常用该软盘启动。说明ramdisk调用的模块多了后可能无法建系
统盘。

Posted by Peak at June 15, 2004 10:42 AM | Comments (0) | TrackBack (33)


May 25, 2004


硬件时间(for Linux)

感谢Raid Cheng对知识的共享。
以下内容是Raid Cheng对于系统中两个时间的描述:

机器里有两个时钟。硬件时钟从根本上讲是CMOS时钟;而系统时钟是由内核维护的。
而在Linux系统中,起作用的是系统时钟。在启动时,它靠读取硬件时钟获得计时起点,而不是靠记忆计时。
你可以通过BIOS修改系统硬件时钟,或者如果你不想重起机器,那就用hwclock命令。
-----------------------------------
修改硬件时间(bios):
hwclock --set --date="4/30/04 14:38:00"
查看硬件时间:
hwclock --show
让系统时间同步为硬件时间:
hwclock --hctosys
让硬件时间同步为系统时间:
hwclock --systohc

Posted by Peak at May 25, 2004 03:03 AM | Comments (0) | TrackBack (1)


[转载]iptables

来源:中国Linux论坛 中文 man page 计划
引用网址:iptables 主题文档

手册页 (man page)
iptables(txt)
iptables-save(txt)
iptables-restore(txt)
简体中文 HowTo
包过滤HowTo (Packet Filter)
NAT HowTo (Network Address Translation)

相关连接:iptables及netfilter主站点

Posted by Peak at May 25, 2004 02:59 AM | Comments (0) | TrackBack (27)


May 21, 2004


[整理]LINUX中增加硬盘

1、装上硬盘
  IDE和SCSI方法各有不同
2、让计算机认出硬盘
  IDE和SCSI方法各有不同
3、分区
  启动Linux,然后给新硬盘分区: 以root身份,执行 fdisk /dev/hdb.
  [主分区,Linux native]
4、格式化新硬盘
  mke2fs -cv /dev/hdb1
  [详细的输出和检查坏块]
5、创建一个mount point。
  决定你想把它Mount在那里,并创建这个mount point。
  例如,你想把它作为/mnt/drive2,以root身份执行:
  cd /mnt
  mkdir drive2
6、测试
  以root身份,执行: mount -t ext2 /dev/hdb1 /mnt/drive2. 如果没有错误信息,cd /mnt/drive2, 然后试着创建一个目录,并创建几个文件。 如果可以,那就行了。继续最后的几步。
7、修改 /etc/fstab.
  把下面的行加到/etc/fstab文件里:
  /dev/hdb1 /mnt/drive2 ext2 defaults 1 1
8、重新启动,看看新硬盘是否被自动mounts上了。
Yves Bellefeuille的Hard-Disk-Upgrade miniHOWTO文档包含了一些上面的信息,但大都是针对另外一些不同的情况的。

Posted by Peak at May 21, 2004 02:19 AM | Comments (0) | TrackBack (13)


May 20, 2004


Linux系统命令(磁盘管理)

sync
symlinks(symbolic links)
swapon
swapoff
sfdisk
mpartition
mkswap
mkisofs(make iso file system)
mkinitrd(make initial ramdisk images)
mkfs(make file system)
mkfs.minix
mke2fs(make ext2 file system)
mkdosfs(make Dos file system)
mkbootdisk(make boot disk)
mformat
mbadblocks
losetup(loop setup)
hdparm(hard disk parameters)
fsconf(file system configurator)
fsck(file system check)
fsck.minix(file system check-minix filesystem)
fsck.ext2(file system check-second filesystem)
fdisk
ext2ed(ext2 file system editor)
e2fsck(ext2 file system check)
dd
cfdisk
badblocks

==================================
  sync

  功能说明:将内存缓冲区内的数据写入磁盘。
  语  法:sync [--help][--version]
  补充说明:在Linux系统中,当数据需要存入磁盘时,通常会先放到缓冲区内,等到适当的时刻再写入磁盘,如此可提高系统的执行效率。
  参  数:
  --help 显示帮助。
  --version 显示版本信息。
  -----------------------------------------------

  symlinks(symbolic links)

  功能说明:维护符号连接的工具程序。
  语  法:symlinks [-cdrstv][目录]
  补充说明:symlinks可检查目录中的符号连接,并显示符号连接类型。以下为symlinks可判断的符号连接类型:
  absolute:符号连接使用了绝对路径。
  dangling:原始文件已经不存在。
  lengthy:符号连接的路径中包含了多余的"../"。
  messy:符号连接的路径中包含了多余的"/"。
  other_fs:原始文件位于其他文件系统中。
  relative:符号连接使用了相对路径。
  参  数:
  -c 将使用绝对路径的符号连接转换为相对路径。
  -d 移除dangling类型的符号连接。
  -r 检查目录下所有子目录中的符号连接。
  -s 检查lengthy类型的符号连接。
  -t 与-c一并使用时,会显示如何将绝对路径的符号连接转换为相对路径,但不会实际转换。
  -v 显示所有类型的符号连接。
  ----------------------------------------------
  swapon

  功能说明:启动系统交换区(swap area)。
  语  法:swapon [-ahsV][-p <优先顺序>][设备]
  补充说明:Linux系统的内存管理必须使用交换区来建立虚拟内存。
  -a 将/etc/fstab文件中所有设置为swap的设备,启动为交换区。
  -h 显示帮助。
  -p<优先顺序> 指定交换区的优先顺序。
  -s 显示交换区的使用状况。
  -V 显示版本信息。
  ----------------------------------------------

  swapoff

  功能说明:关闭系统交换区(swap area)。
  语  法:swapoff [设备]
  补充说明:swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。
  ------------------------------------

  sfdisk

  功能说明:硬盘恩区工具程序。
  语  法:sfdisk [-?Tvx][-d <硬盘>][-g <硬盘>][-l <硬盘>][-s <分区>][-V <硬盘>]
  补充说明:sfdisk为硬盘分区工具程序,可显示分区的设置信息,并检查分区是否正常。
  参  数:
  -?或--help 显示帮助。
  -d<硬盘> 显示硬盘分区的设置。
  -g<硬盘>或--show-geometry<硬盘> 显示硬盘的CHS参数。
  -l<硬盘> 显示后硬盘分区的相关设置。
  -s<分区> 显示分区的大小,单位为区块。
  -T或--list-types 显示所有sfdisk能辨识的文件系统ID。
  -v或--version 显示版本信息。
  -V<硬盘>或--verify<硬盘> 检查硬盘分区是否正常。
  -x或--show-extend 显示扩展分区中的逻辑分区。
  --------------------------------------------

  mpartition

  功能说明:建立或删除MS-DOS的分区。
  语  法:mpartition [-acdfIprv][-b <磁区数>][-h <磁头数>][l <磁区数>][-s <磁区数>][-t <柱面数>][驱动器代号]
  补充说明:mpartition为mtools工具指令,可建立或删除磁盘分区。
  参  数:
  -a 将分区设置为可开机分区。
  -b<磁区数> 建立分区时,指定要从第几个磁区开始建立分区。
  -c 建立分区。
  -d 将分区设置为无法开机的分区。
  -f 强制地修改分区而不管检查时发生的错误信息。
  -h<磁头数> 建立分区时,指定分区的磁头数。
  -I 删除全部的分区。
  -l<磁区数> 建立分区时,指定分区的容量大小,单位为磁区数。
  -p 当要重新建立分区时,显示命令列。
  -r 删除分区。
  -s<磁区数> 建立分区时,指定每个磁轨的磁区数。
  -t<柱面数> 建立分区时,指定分区的柱面数。
  -v 与-p参数一并使用,若没有同时下达修改分区的命令,则显示目前分区的状态。
  ---------------------------------------

  mkswap

  功能说明:设置交换区(swap area)。
  语  法:mkswap [-cf][-v0][-v1][设备名称或文件][交换区大小]
  补充说明:mkswap可将磁盘分区或文件设为Linux的交换区。
  参  数:
  -c 建立交换区前,先检查是否有损坏的区块。
  -f 在SPARC电脑上建立交换区时,要加上此参数。
  -v0 建立旧式交换区,此为预设值。
  -v1 建立新式交换区。
  [交换区大小] 指定交换区的大小,单位为1024字节。
  ----------------------------------------------

  mkisofs(make iso file system)

  功能说明:建立ISO 9660映像文件。
  语  法:mkisofs [-adDfhJlLNrRTvz][-print-size][-quiet][-A <应用程序ID>][-abstract <摘要文件>][-b <开机映像文件>][-biblio ][-c <开机文件名称>][-C <盘区编号,磁区编号>][-copyright <版权信息文件>][-hide <目录或文件名>][-hide-joliet <文件或目录名>][-log-file <记录文件>][-m <目录或文件名>][-M <开机映像文件>][-o <映像文件>][-p <数据处理人>][-P <光盘发行人>][-sysid <系统ID >][-V <光盘ID >][-volset <卷册集ID>][-volset-size <光盘总数>][-volset-seqno <卷册序号>][-x <目录>][目录或文件]
  补充说明:mkisofs可将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘。
  参  数:
  -a或--all mkisofs通常不处理备份文件。使用此参数可以把备份文件加到映像文件中。
  -A<应用程序ID>或-appid<应用程序ID> 指定光盘的应用程序ID。
  -abstract<摘要文件> 指定摘要文件的文件名。
  -b<开机映像文件>或-eltorito-boot<开机映像文件> 指定在制作可开机光盘时所需的开机映像文件。
  -biblio 指定ISBN文件的文件名,ISBN文件位于光盘根目录下,记录光盘的ISBN。
  -c<开机文件名称> 制作可开机光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件。
  -C<盘区编号,盘区编号> 将许多节区合成一个映像文件时,必须使用此参数。
  -copyright<版权信息文件> 指定版权信息文件的文件名。
  -d或-omit-period 省略文件后的句号。
  -D或-disable-deep-relocation ISO 9660最多只能处理8层的目录,超过8层的部分,RRIP会自动将它们设置成ISO 9660兼容的格式。使用-D参数可关闭此功能。
  -f或-follow-links 忽略符号连接。
  -h 显示帮助。
  -hide<目录或文件名> 使指定的目录或文件在ISO 9660或Rock RidgeExtensions的系统中隐藏。
  -hide-joliet<目录或文件名> 使指定的目录或文件在Joliet系统中隐藏。
  -J或-joliet 使用Joliet格式的目录与文件名称。
  -l或-full-iso9660-filenames 使用ISO 9660 32字符长度的文件名。
  -L或-allow-leading-dots 允许文件名的第一个字符为句号。
  -log-file<记录文件> 在执行过程中若有错误信息,预设会显示在屏幕上。
  -m<目录或文件名>或-exclude<目录或文件名> 指定的目录或文件名将不会房入映像文件中。
  -M<映像文件>或-prev-session<映像文件> 与指定的映像文件合并。
  -N或-omit-version-number 省略ISO 9660文件中的版本信息。
  -o<映像文件>或-output<映像文件> 指定映像文件的名称。
  -p<数据处理人>或-preparer<数据处理人> 记录光盘的数据处理人。
  -print-size 显示预估的文件系统大小。
  -quiet 执行时不显示任何信息。
  -r或-rational-rock 使用Rock Ridge Extensions,并开放全部文件的读取权限。
  -R或-rock 使用Rock Ridge Extensions。
  -sysid<系统ID> 指定光盘的系统ID。
  -T或-translation-table 建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统上。
  -v或-verbose 执行时显示详细的信息。
  -V<光盘ID>或-volid<光盘ID> 指定光盘的卷册集ID。
  -volset-size<光盘总数> 指定卷册集所包含的光盘张数。
  -volset-seqno<卷册序号> 指定光盘片在卷册集中的编号。
  -x<目录> 指定的目录将不会放入映像文件中。
  -z 建立通透性压缩文件的SUSP记录,此记录目前只在Alpha机器上的Linux有效。
  -----------------------------------------

  mkinitrd(make initial ramdisk images)

  功能说明:建立要载入ramdisk的映像文件。
  语  法:mkinitrd [-fv][--omit-scsi-modules][--version][--preload=<模块名称>][--with=<模块名称>][映像文件][Kernel 版本]
  补充说明:mkinitrd可建立映像文件,以供Linux开机时载入ramdisk。
  参  数:
  -f 若指定的映像问家名称与现有文件重复,则覆盖现有的文件。
  -v  执行时显示详细的信息。
  --omit-scsi-modules 不要载入SCSI模块。
  --preload=<模块名称> 指定要载入的模块。
  --with=<模块名称> 指定要载入的模块。
  --version 显示版本信息。
  ------------------------------------------------------

  mkfs(make file system)

  功能说明:建立各种文件系统。
  语  法:mkfs [-vV][fs][-f <文件系统类型>][设备名称][区块数]
  补充说明:mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。
  参  数:
  fs 指定建立文件系统时的参数。
  -t<文件系统类型> 指定要建立何种文件系统。
  -v 显示版本信息与详细的使用方法。
  -V 显示简要的使用方法。
  --------------------------------------------

  mkfs.minix

  功能说明:建立Minix文件系统。
  语  法:mkfs.minix [-cv][-i ][-l <文件>][-n <文件名长度>][设备名称][区块数]
  补充说明:mkfs.minix可建立Minix文件系统。
  参  数:
  -c 检查是否有损坏的区块。
  -i 指定文件系统的inode总数。
  -l<文件> 从指定的文件中,读取文件系统中损坏区块的信息。
  -n<文件名长度> 指定文件名称长度的上限。
  -v 建立第2版的Minix文件系统。
  ---------------------------------------

  mke2fs(make ext2 file system)

  功能说明:建立ext2文件系统。
  语  法:mke2fs [-cFMqrSvV][-b <区块大小>][-f <不连续区段大小>][-i <字节>][-N ][-l <文件>][-L <标签>][-m <百分比值>][-R=<区块数>][ 设备名称][区块数]
  补充说明:mke2fs可建立Linux的ext2文件系统。
  参  数:
  -b<区块大小> 指定区块大小,单位为字节。
  -c 检查是否有损坏的区块。
  -f<不连续区段大小> 指定不连续区段的大小,单位为字节。
  -F 不管指定的设备为何,强制执行mke2fs。
  -i<字节> 指定"字节/inode"的比例。
  -N 指定要建立的inode数目。
  -l<文件> 从指定的文件中,读取文件西中损坏区块的信息。
  -L<标签> 设置文件系统的标签名称。
  -m<百分比值> 指定给管理员保留区块的比例,预设为5%。
  -M 记录最后一次挂入的目录。
  -q 执行时不显示任何信息。
  -r 指定要建立的ext2文件系统版本。
  -R=<区块数> 设置磁盘阵列参数。
  -S 仅写入superblock与group descriptors,而不更改inode able inode bitmap以及block bitmap。
  -v 执行时显示详细信息。
  -V 显示版本信息。
  --------------------------------------------

  mkdosfs(make Dos file system)

  功能说明:建立MS-DOS文件系统。
  语  法:mkdosfs [-cv][-f ][-F ][-i <磁盘序号>][-l <文件名>][-m <信息文件>][-n <标签>][-r <根目录项目数>][-s <磁区数>][设备名称][区块数]
  补充说明:mkdosfs可在Linux下,将磁盘格式化为MS-DOS文件系统的格式。
  参  数:
  -c 检查是否有损坏的区块。
  -f 指定FAT的数目,目前支持1与2两种选项。
  -F 指定FAT记录的单位为12或16位。
  -i<磁盘序号> 设置文件系统的磁盘序号。
  -l<文件名> 从指定的文件中,读取文件系统中损坏区块的信息。
  -m<信息文件> 若以次文件系统开机,而却因操作系统没有正常安装,则会显示选项中所指定的信息文件内容。
  -n<标签> 设置文件系统的磁盘标签名称。
  -r<根目录项目数> 设置根目录最多能记载项目数。
  -s<磁区数> 指定每个丛集所包含的磁区数。
  -v 执行时显示详细的信息。
  ---------------------------------------------------

  mkbootdisk(make boot disk)

  功能说明:建立目前系统的启动盘。
  语  法:mkbootdisk [--noprompt][--verbose][--version][--device <设备>][--mkinitrdargs <参数>][kernel 版本]
  补充说明:mkbootdisk可建立目前系统的启动盘。
  参  数:
  --device<设备> 指定设备。
  --mkinitrdargs<参数> 设置mkinitrd的参数。
  --noprompt 不会提示用户插入磁盘。
  --verbose 执行时显示详细的信息。
  --version 显示版本信息。
  -----------------------------------------------------

  mformat

  功能说明:对MS-DOS文件系统的磁盘进行格式化。
  语  法:mformat [-1aCFIKX][-0 <数据传输率>][-2 <磁区数>][-A <数据传输率>][-B <开机区文件>][-c <丛集大小>][-h <磁头数>][-H <隐藏磁区数>][-l <磁盘标签>][-M <磁区大小>][-n <序号>][-r <根目录大小>][-s <磁区数>][-S <磁区大小>][-t <柱面数>][驱动器代号]
  补充说明:mformat为mtools工具指令,模拟MS-DOS的format指令,可将指定的磁盘或硬盘分区格式化为MS-DOS文件系统。
  参  数:
  -0<数据传输率> 指定第0磁轨的数据传输率。
  -1 不使用2M格式。
  -2<磁区数> 指定在第0磁轨的第0个磁头的磁区数,也就是所谓的2M格式。
  -a 指定产生Atari格式的序号。
  -A<数据传输率> 指定第0磁轨以外所有磁轨的数据传输率。
  -B<开机区文件> 从指定的文件来建立开机区。
  -c<丛集大小> 指定丛集大小,单位为磁区。
  -C 建立磁盘MS-DOS文件系统的映像文件。
  -F 以FAT32来格式化磁盘。
  -H<隐藏磁区数> 指定隐藏磁区的数目。
  -I 指定FAT32的frVersion编号。
  -k 尽可能地保留原有的开机区。
  -l<磁盘标签> 指定磁盘标签名称。
  -M<磁区大小> 指定MS-DOS文件系统所使用的磁区大小,预设应该与硬体磁区大小相同,单位为字节。
  -n<序号> 指定序号。
  -r<根目录大小> 指定根目录的大小,单位为磁区。
  -s<磁区数> 指定每一磁轨所包含的磁区数目。
  -S<磁区大小> 指定硬件磁区大小。
  -t<柱面数> 指定柱面数目。
  -X 格式化XDF磁盘。
  ------------------------------------

  mbadblocks

  功能说明:检查MS-DOS文件系统的磁盘是否有损坏的磁区。
  语  法:mbadblocks [驱动器代号]
  补充说明:mbadblocks为mtools工具指令,可用来扫描MS-DOS文件系统的磁盘驱动器,并标示出损坏的磁区。
  ----------------------------------------------------

  losetup(loop setup)

  功能说明:设置循环设备。
  语  法:losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]
  补充说明:循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。
  参  数:
  -d 卸除设备。
  -e<加密方式> 启动加密编码。
  -o<平移数目> 设置数据平移的数目。
  ----------------------------

  hdparm(hard disk parameters)

  功能说明:显示与设定硬盘的参数。
  语  法:hdparm [-CfghiIqtTvyYZ][-a <快取分区>][-A <0或1>][-c ][-d <0或1>][-k <0或1>][-K <0或1>][-m <分区数>][-n <0或1>][-p ][-P <分区数>][-r <0或1>][-S <时间>][-u <0或1>][-W <0或1>][-X <传输模式>][设备]
  补充说明:hdparm可检测,显示与设定IDE或SCSI硬盘的参数。
  参  数:
  -a<快取分区> 设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。
  -A<0或1> 启动或关闭读取文件时的快取功能。
  -c 设定IDE32位I/O模式。
  -C 检测IDE硬盘的电源管理模式。
  -d<0或1> 设定磁盘的DMA模式。
  -f 将内存缓冲区的数据写入硬盘,并清楚缓冲区。
  -g 显示硬盘的磁轨,磁头,磁区等参数。
  -h 显示帮助。
  -i 显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供。
  -I 直接读取硬盘所提供的硬件规格信息。
  -k<0或1> 重设硬盘时,保留-dmu参数的设定。
  -K<0或1> 重设硬盘时,保留-APSWXZ参数的设定。
  -m<磁区数> 设定硬盘多重分区存取的分区数。
  -n<0或1> 忽略硬盘写入时所发生的错误。
  -p 设定硬盘的PIO模式。
  -P<磁区数> 设定硬盘内部快取的分区数。
  -q 在执行后续的参数时,不在屏幕上显示任何信息。
  -r<0或1> 设定硬盘的读写模式。
  -S<时间> 设定硬盘进入省电模式前的等待时间。
  -t 评估硬盘的读取效率。
  -T 平谷硬盘快取的读取效率。
  -u<0或1> 在硬盘存取时,允许其他中断要求同时执行。
  -v 显示硬盘的相关设定。
  -W<0或1> 设定硬盘的写入快取。
  -X<传输模式> 设定硬盘的传输模式。
  -y 使IDE硬盘进入省电模式。
  -Y 使IDE硬盘进入睡眠模式。
  -Z 关闭某些Seagate硬盘的自动省电功能。
  ---------------------------------------------

  fsconf(file system configurator)

  功能说明:设置文件系统相关功能。
  语  法:fsconf [--check]
  补充说明:fsconf是Red Hat Linux发行版专门用来调整Linux各项设置的程序。
  参  数:
  --chedk 检查特定文件的权限。
  -------------------------------------------------

  fsck(file system check)

  功能说明:检查文件系统并尝试修复错误。
  语  法:fsck [-aANPrRsTV][-t <文件系统类型>][文件系统...]
  补充说明:当文件系统发生错误四化,可用fsck指令尝试加以修复。
  参  数:
  -a 自动修复文件系统,不询问任何问题。
  -A 依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统。
  -N 不执行指令,仅列出实际执行会进行的动作。
  -P 当搭配"-A"参数使用时,则会同时检查所有的文件系统。
  -r 采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式。
  -R 当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查。
  -s 依序执行检查作业,而非同时执行。
  -t<文件系统类型> 指定要检查的文件系统类型。
  -T 执行fsck指令时,不显示标题信息。
  -V 显示指令执行过程。
  ---------------------------------------------------

  fsck.minix(file system check-minix filesystem)

  功能说明:检查文件系统并尝试修复错误。
  语  法:fsck.minix [-aflmrsv][外围设备代号]
  补充说明:当minix文件系统发生错误时,可用fsck.minix指令尝试加以参考。
  参  数:
  -a 自动修复文件系统,不询问任何问题。
  -f 强制对该文件系统进行完整检查,纵然该文件系统在慨略检查下没有问题。
  -l 列出所有文件名称。
  -m 使用类似MINIX操作系统的警告信息。
  -r 采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式。
  -s 显示该分区第一个磁区的相关信息。
  -v 显示指令执行过程。
  ------------------------------------------------

  fsck.ext2(file system check-second filesystem)

  功能说明:检查文件系统并尝试修复错误。
  语  法:fsck.ext2 [-acdfFnprsStvVy][-b <分区第一个磁区地址>][-B <区块大小>][-C <反叙述器>][-I ][-l/L <损坏区块文件>][-P <处理inode大小>][外围设备代号]
  补充说明:当ext2文件系统发生错误时,可用fsck.ext2指令尝试加以修复。
  参  数:
  -a 自动修复文件系统,不询问任何问题。
  -b<分区第一个磁区地址> 指定分区的第一个磁区的起始地址,也就是Super Block。
  -B<区块大小> 设置该分区每个区块的大小。
  -c 检查指定的文件系统内,是否存在有损坏的区块。
  -C<反叙述器> 指定反叙述器,fsck.ext2指令会把全部的执行过程,都交由其逆向叙述,便于排错或监控程序执行的情形。
  -d 详细显示指令执行过程,便于排错或分析程序执行的情形。
  -f 强制对该文件系统进行完整检查,纵然该文件系统在慨略检查下没有问题。
  -F 检查文件系统之前,先清理该保存设备块区内的数据。
  -I 设置欲检查的文件系统,其inode缓冲区的区块数目。
  -l<损坏区块文件> 把文件中所列出的区块,视为损坏区块并将其标示出来,避免应用程序使用该区块。
  -L<损坏区块文件> 此参数的效果和指定"-l"参数类似,但在参考损坏区块文件标示损坏区块之前,会先将原来标示成损坏区块者统统清楚,即全部重新设置,而非仅是加入新的损坏区块标示。
  -n 把欲检查的文件系统设成只读,并关闭互动模式,否决所有询问的问题。
  -p 此参数的效果和指定"-a"参数相同。
  -P<处理inode大小> 设置fsck.ext2指令所能处理的inode大小为多少。
  -r 此参数将忽略不予处理,仅负责解决兼容性的问题。
  -s 检查文件系统时,交换每对字节的内容。
  -S 此参数的效果和指定"-s"参数类似,但不论该文件系统是否已是标准位顺序,一律交换每对字节的内容。
  -t 显示fsck.ext2指令的时序信息。
  -v 详细显示指令执行过程。
  -V 显示版本信息。
  -y 关闭互动模式,且同意所有询问的问题。
  ------------------------------------------------------

  fdisk

  功能说明:磁盘分区。
  语  法:fdisk [-b <分区大小>][-uv][外围设备代号] 或 fdisk [-l][-b <分区大小>][-uv][外围设备代号...] 或 fdisk [-s <分区编号>]
  补充说明:fdisk是用来磁盘分区的程序,它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。
  参  数:
  -b<分区大小> 指定每个分区的大小。
  -l 列出指定的外围设备的分区表状况。
  -s<分区编号> 将指定的分区大小输出到标准输出上,单位为区块。
  -u 搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址。
  -v 显示版本信息。
  -------------------------------------------------

  ext2ed(ext2 file system editor)

  功能说明:ext2文件系统编辑程序。
  语  法:ext2ed
  补充说明:ext2ed可直接处理硬盘分区上的数据,这指令只有Red Hat Linux才提供。
  参  数:
  一般指令
  setdevice[设备名称] 指定要处理的设备。
  disablewrite 将ext2ed设为只读的状态。
  enablewrite 将ext2ed设为可读写的状态。
  help[指令] 显示个别指令的帮助。
  next 移至下一个单位,单位会依目前所在的模式而异。
  prev 移至前一个单位,单位会依目前所在的模式而异。
  pgup 移至下一页。
  pgdn 移至上一页。
  set 修改目前的数据,参数会依目前所在的模式而异。
  writedata 在执行此指令之后,才会实际修改分区中的数据。
  ext2进入3种模式的指令:
  super 进入main superblock,即Superblock模式。
  group<编号> 进入指定的group,即Group模式。
  cd<目录或文件> 在inode模式下,进入指定的目录或文件,即Inode模式。
  Superblock模式:
  gocopy<备份编号> 进入指定的superblock备份。
  setactivecopy 将目前所在的superblock,复制到main superblock。
  Group模式:
  blockbitmap 显示目前groupo的区块图。
  inode 进入目前group的第一个inode。
  inodebitmap 显示目前group的inode二进制码。
  Inode模式:
  dir 进入目录模式。
  file 进入文件模式。
  ------------------------------------------------------

  e2fsck(ext2 file system check)

  功能说明:检查ext2文件系统的正确性。
  语  法:e2fsck [-acCdfFnprsStvVy][-b ][-B <区块大小>][-l <文件>][-L <文件>][设备名称]
  补充说明:e2fsck执行后的传回值及代表意义如下。
  0 没有任何错误发生。
  1 文件系统发生错误,并且已经修正。
  2 文件系统发生错误,并且已经修正。
  4 文件系统发生错误,但没有修正。
  8 运作时发生错误。
  16 使用的语法发生错误。
  128 共享的函数库发生错误。
  参  数:
  -a 不询问使用者意见,便自动修复文件系统。
  -b 指定superblock,而不使用预设的superblock。
  -B<区块大小> 指定区块的大小,单位为字节。
  -c 一并执行badblocks,以标示损坏的区块。
  -C 将检查过程的信息完整记录在file descriptor中,使得整个检查过程都能完整监控。
  -d 显示排错信息。
  -f 即使文件系统没有错误迹象,仍强制地检查正确性。
  -F 执行前先清除设备的缓冲区。
  -l<文件> 将文件中指定的区块加到损坏区块列表。
  -L<文件> 先清除损坏区块列表,再将文件中指定的区块加到损坏区块列表。因此损坏区块列表的区块跟文件中指定的区块是一样的。
  -n 以只读模式开启文件系统,并采取非互动方式执行,所有的问题对话均设置以"no"回答。
  -p 不询问使用者意见,便自动修复文件系统。
  -r 此参数只为了兼容性而存在,并无实际作用。
  -s 如果文件系统的字节顺序不适当,就交换字节顺序,否则不做任何动作。
  -S 不管文件系统的字节顺序,一律交换字节顺序。
  -t 显示时间信息。
  -v 执行时显示详细的信息。
  -V 显示版本信息。
  -y 采取非互动方式执行,所有的问题均设置以"yes"回答。
  ----------------------------------------------

  dd

  功能说明:读取,转换并输出数据。
  语  法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=<字节数>][if=<文件>][obs=<字节数>][of=<文件>][seek=<区块数>][skip=<区块数>][--help][--version]
  补充说明:dd可从标准输入或文件读取数据,依指定的格式来转换数据,再输出到文件,设备或标准输出。
  参  数:
  bs=<字节数> 将ibs( 输入)与obs(输出)设成指定的字节数。
  cbs=<字节数> 转换时,每次只转换指定的字节数。
  conv=<关键字> 指定文件转换的方式。
  count=<区块数> 仅读取指定的区块数。
  ibs=<字节数> 每次读取的字节数。
  if=<文件> 从文件读取。
  obs=<字节数> 每次输出的字节数。
  of=<文件> 输出到文件。
  seek=<区块数> 一开始输出时,跳过指定的区块数。
  skip=<区块数> 一开始读取时,跳过指定的区块数。
  --help 帮助。
  --version 显示版本信息。
  -------------------------------------------

  cfdisk

  功能说明:磁盘分区。
  语  法:cfdisk [-avz][-c <柱面数目>-h <磁头数目>-s <盘区数目>][-P ][外围设备代号]
  补充说明:cfdisk是用来磁盘分区的程序,它十分类似DOS的fdisk,具有互动式操作界面而非传统fdisk的问答式界面,您可以轻易地利用方向键来操控分区操作。
  参  数:
  -a 在程序里不用反白代表选取,而以箭头表示。
  -c<柱面数目> 忽略BIOS的数值,直接指定磁盘的柱面数目。
  -h<磁头数目> 忽略BIOS的数值,直接指定磁盘的磁头数目。
  -P 显示分区表的内容,附加参数"r"会显示整个分区表的详细资料,附加参数"s"会依照磁区的顺序显示相关信息,附加参数"t"则会以磁头,磁区,柱面的方式来显示资料。
  -s<磁区数目> 忽略BIOS的数值,直接指定磁盘的磁区数目。
  -v 显示版本信息。
  -z 不读取现有的分区,直接当作没有分区的新磁盘使用。
  -------------------------------------------

  badblocks

  功能说明:检查磁盘装置中损坏的区块。
  语  法:badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块]
  补充说明:执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。
  参  数:
  -b<区块大小> 指定磁盘的区块大小,单位为字节。
  -o<输出文件> 将检查的结果写入指定的输出文件。
  -s 在检查时显示进度。
  -v 执行时显示详细的信息。
  -w 在检查时,执行写入测试。
  [磁盘装置] 指定要检查的磁盘装置。
  [磁盘区块数] 指定磁盘装置的区块总数。
  [启始区块] 指定要从哪个区块开始检查。

Posted by Peak at May 20, 2004 02:19 AM | Comments (0) | TrackBack (36)

Peak Jing Project

COPYRIGHT © Peak Jing 2003-2005
Powered By
Peak Jing

Valid HTML 4.01!