免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 987 | 回复: 0
打印 上一主题 下一主题

inode [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-01 00:09 |只看该作者 |倒序浏览

一.inode size 定义
单位:Byte


inode table sample
inode table是data area的索引表。

 一、inode的定义
  inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等。
  二、inode的分类及其具体涵义
  inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS inode, 而后者以EXT2为代表,我们称为Ext2 inode。下面分别对VFS inodee与Ext2 inode做一下简单的描述:
  1、VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过inode缓存访问。虽然每个文件都有相应的inode结点,但是只有在需要的时候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也为已分配的inode构造缓存和哈希表,以提 高系统性能。inode结构中的struct inode_operations *i_op为我们提供了一个inode操作列表,通过这个列表提供的函数我们可以对VFS inode结点进行各种操作。每个inode结构都有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。
  struct inode {
  struct list_headi_hash;
  struct list_headi_list;
  struct list_headi_dentry;
  struct list_headi_dirty_buffers;
  unsigned longi_ino; /*每一个inode都有一个序号,经由super block结构和其序号,我们可以很轻易的找到这个inode。*/
  atomic_t i_count; /*在Kernel里,很多的结构都会记录其reference count,以确保如果某个结构正在使用,它不会被不小心释放掉,i_count就是其reference count。*/
  kdev_t i_dev; /* inode所在的device代码 */
  umode_t i_mode; /* inode的权限 */
  nlink_t i_nlink; /* hard link的个数 */
  uid_t i_uid; /* inode拥有者的id */
  gid_t i_gid; /* inode所属的群组id */
  kdev_t i_rdev; /* 如果inode代表的是device的话,那此字段将记录device的代码 */
  off_t i_size; /* inode所代表的档案大小 */
  time_t i_atime; /* inode最近一次的存取时间 */
  time_t i_mtime; /* inode最近一次的修改时间 */
  time_t i_ctime; /* inode的产生时间 */
  unsigned long i_blksize; /* inode在做IO时的区块大小 */
  unsigned long i_blocks; /* inode所使用的block数,一个block为512 byte*/
  unsigned long i_version; /* 版本号码 */
  unsigned short i_bytes;
  struct semaphore i_sem;
  struct rw_semaphore i_truncate_sem;
  struct semaphore i_zombie;
  struct inode_operations *i_op;
  struct file_operations *i_fop;/* former ->i_op->default_file_ops */
  struct super_block *i_sb; /* inode所属档案系统的super block */
  wait_queue_head_t i_wait;
  struct file_lock *i_flock; /* 用来做file lock */
  struct address_space *i_mapping;
  struct address_space i_data;
  struct dquot *i_dquot [MAXQUOTAS];
  /* These three should probably be a union */
  struct pipe_inode_info *i_pipe;
  struct block_device *i_bdev;
  struct char_device *i_cdev;
  unsigned longi_dnotify_mask; /* Directory notify events */
  struct dnotify_struct *i_dnotify; /* for directory notifications */
  unsigned long i_state; /* inode目前的状态,可以是I_DIRTY,I_LOCK和 I_FREEING的OR组合 */
  unsigned int i_flags; /* 记录此inode的参数 */
  unsigned char i_sock; /* 用来记录此inode是否为socket */
  atomic_t i_write count;
  unsigned int i_attr_flags; /* 用来记录此inode的属性参数 */
  __u32 i_generation;
  union {
  struct minix_inode_info minix_i;
  struct ext2_inode_info ext2_i;
  struct ext3_inode_info ext3_i;
  struct hpfs_inode_info hpfs_i;
  struct ntfs_inode_info ntfs_i;
  struct msdos_inode_info msdos_i;
  struct umsdos_inode_info umsdos_i;
  struct iso_inode_info isofs_i;
  struct sysv_inode_info sysv_i;
  struct affs_inode_info affs_i;
  struct ufs_inode_info ufs_i;
  struct efs_inode_info efs_i;
  struct romfs_inode_info romfs_i;
  struct shmem_inode_info shmem_i;
  struct coda_inode_info coda_i;
  struct smb_inode_info smbfs_i;
  struct hfs_inode_info hfs_i;
  struct adfs_inode_info adfs_i;
  struct qnx4_inode_info qnx4_i;
  struct reiserfs_inode_info reiserfs_i;
  struct bfs_inode_info bfs_i;
  struct udf_inode_info udf_i;
  struct ncp_inode_info ncpfs_i;
  struct proc_inode_info proc_i;
  struct socketsocket_i;
  struct usbdev_inode_info usbdev_i;
  struct jffs2_inode_infojffs2_i;
  void *generic_ip;
  } u;
  };
  2、EXT2 inode用来定义文件系统的结构以及描述系统中每个文件的管理信息,每个文件都有且只有一个inode,即使文件中没有数据,其索引结点也是存在的。每个文件用一个单独的Ext2 inode结构来描述,而且每一个inode都有唯一的标志号。Ext2 inode为内存中的inode结构提供了文件的基本信息,随着内存中inode结构的变化,系统也将更新Ext2 inode中相应的内容。Ext2 inode对应的是Ext2_inode结构。
  struct ext2_inode {
  __u16 i_mode;/* File mode */
  __u16 i_uid;/* Low 16 bits of Owner Uid */
  __u32 i_size;/* Size in bytes */
  __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 count */
  __u32 i_flags;/* File flags */
  union {
  struct {
  __u32 l_i_reserved1;
  } linux1;
  struct {
  __u32 h_i_translator;
  } hurd1;
  struct {
  __u32 m_i_reserved1;
  } masix1;
  } osd1;/* OS dependent 1 */
  __u32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
  __u32 i_generation;/* File version (for NFS) */
  __u32 i_file_acl;/* File ACL */
  __u32 i_dir_acl;/* Directory ACL */
  __u32 i_faddr;/* Fragment address */
  union {
  struct {
  __u8l_ i_frag;/* Fragment number */
  __u8l_ i_fsize;/* Fragment size */
  __u16 i_pad1;
  __u16l_ i_uid_high;/* these 2 fields */
  __u16l_ i_gid_high;/* were reserved2[0] */
  __u32l_ i_reserved2;
  } linux2;
  struct {
  __u8h_ i_frag;/* Fragment number */
  __u8h_ i_fsize;/* Fragment size */
  __u16h_ i_mode_high;
  __u16h_ i_uid_high;
  __u16h_ i_gid_high;
  __u32h_ i_author;
  } hurd2;
  struct {
  __u8m_ i_frag;/* Fragment number */
  __u8m_ i_fsize;/* Fragment size */
  __u16m_ pad1;
  __u32m_ i_reserved2[2];
  } masix2;
  } osd2;/* OS dependent 2 */
  };
  从结构的定义中可以看出来inode(VFS inode)与ext2_inode的差别是很大的,它们都包含动态信息和静态信息,通过union指定的内容一定是动态的。inode结构中的union u实际上反映了VFS支持的文件系统。
  可以看出inode结构与ext2_inode结构有些内容是相似的,如:
  inode定义的
  unsigned long i_ino;
  umode_t i_mode;
  nlink_t i_nlink;
  uid_t i_uid;
  gid_t i_gid;
  loff_t i_size;
  time_t i_atime;
  time_t i_mtime;
  time_t i_ctime;
  unsigned long i_blksize;
  unsigned long i_blocks;
  和ext2_inode定义的定义部分
  __u16 i_mode;/* File mode */
  __u16 i_uid;/* Low 16 bits of Owner Uid */
  __u32 i_size;/* Size in bytes */
  __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 count */
  __u32 i_flags;/* File flags */
  这些都可以对应上,当然还有一些不同的地方,如inode中定义的
  kdev_t i_rdev;
  kdev_t i_dev;
  unsigned short i_bytes;
  struct semaphore i_sem;
  在ext2_inode中没有体现,不过这部分对ext2_inode是没有用途而且无法确定的。类似的,可以推广到两个结构的其余部分,最终在代码中的区别还是与原理中分析的区别相关的,也是原理的具体体现。
  3、从上面的描述,我们可以对VFS inode与ext2 inode做出比较:
  位置:VFS inode结构位于内存中,而Ext2_inode位于磁盘。
  生存期:VFS inode在需要时才会被建立,如果系统断电,此结构也随之消失。
  Ext2_inode的存在与系统是否上电无关,而且无论文件是否包含数据,Ext2_inode都是存在的。
  唯一性:两者在自己的作用域中都是唯一的。
  关系:VFS inode是Ext2 inode的抽象、映射与扩充,而后者是前者的静态信息部分,也是对前者的具体化、实例化和持久化。
  操作:对VFS inode的操作具有通用性,对文件系统inode的操作则是文件系统相关的,依赖于特定的实现。
  组织管理:系统通过VFS inode链表来对其进行组织,并且为了提高访问效率相应地构造了inode构造缓存和hash table。
  Ext2 inode的信息位于EXT2文件系统的划分的块组中,在每个块组中包含相应的inode位图、inode表指定具体的inode信息,每个inode对应Ext2_inode结构。
  三、 inode的分配 (对于ext2 inode)
  1、每个inode的大小为128个字节,下面具体介绍哪几个字节代表什么内容。
  0~1 表示文件的类型和属性(2 bytes)0x41ed (rwxr-xr-x) 0x8180 (-rw-------)
  2~3 表示文件的长度(2 bytes)
  4~7 表示文件宿主用户id(4 bytes)
  8~19 表示三个时间属性,每4个字节代表一个时间,分别是atime,ctime,mtime(12B)
  20~23 表示Deletion Time 即删除的时间。
  24~25 表示用户组id (2 bytes)
  26~27 表示硬链接的个数。
  28~31 表示Blockcount 的大小
  32~39 暂不清楚??
  40~99 这60个字节就是inode中的15个指针,每个指针占4个字节。
  100~103 暂不清楚??
  104~107 表示文件访问控制表号(File ACL)
  108~111 表示(Directory ACL)
  112~127 暂不清楚??
  2、在分割扇区时,系统会先做出一堆inode以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。有时候,这些inode或许会不够用,例如当一个程序产生大量小文件的时候,此时文件系统就需要增加索引节点。
  同样,如果我们事先知道此文件系统只用来存放少数大文件,我们就可以通过减少索引节点的数目来达到节省磁盘空间的目的--毕竟每个索引节点占用128字节。
  创建文件系统的时候,可以使用newfs命令的-i选项来增加或者减少索引节点的数目。
  3、newfs -i 2048 -b 8192 -f 1024
  newfs创建新的文件系统
  -i 2048更改inode每2KB创建一个
  -b 8192设置block size的大小为8kB
  -f 1024设置fragments的大小为1KB
  四、inode与ln (对于ext2 inode)
  1、当我们用ls 查看某个目录或文件时,如果加上-i 参数,就可以看到inode节点了;
  [root@localhost ~]# ls -li lsfile.sh
  2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
  可见lsfile.sh 的inode值是2408949 ;
  2、创建硬链接,硬链接和源文件关系;
  用ln创建文件硬链接的语法:
  [root@localhost ~]#ln 源文件 目标文件
  下面我们举一个例子,在这个例子中,我们要为sun.txt创建其硬链接sun002.txt。然后看一下 sun.txt和sun002.txt的属性的变化;
  [root@localhost ~]# ls -li sun.txt 注:查看sun.txt的属性;
  2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注:这是sun.txt的属性;
  [root@localhost ~]# ln sun.txt sun002.txt 注:我们通过ln 来创建sun.txt的硬链接文件sun002.txt
  [root@localhost ~]# ls -li sun* 注:我们列一下sun.txt 和sun002.txt
  2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
  2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt
  我们可以看到sun.txt在没有创建硬链接文件sun002.txt的时候,其链接个数是1(也就是-rw-r--r--后的那个数值),创建了硬链接 sun002.txt创建后,这个值变成了2。也就是说,我们每次为sun.txt创建一个新的硬链接文件后,其硬链接个数都会增加1。
  inode值相同的文件,他们的关系是互为硬链接的关系。当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,其它的文件并不受影响。比如我们把sun.txt删除后,我们还是一样能看到sun002.txt的内容,并且sun02.txt仍是存在的。
  可以这么理解,互为硬链接关系的文件,他们好像是克隆体,他们的属性几乎是完全一样;
  下面的例子,我们把sun.txt删除,然后我们看一下sun002.txt是不是能看到其内容。
  [root@localhost ~]# rm -rf sun.txt
  [root@localhost ~]# more sun002.txt
  注意:硬链接不能为目录创建,只有文件才能创建硬链接。
  3、软链接的创建,及软接与源文件的关系;
  创建软链接(也被称为符号链接)的语法;
  [root@localhost ~]# ln -s 源文文件或目录 目标文件或目录
  软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。
  [root@localhost ~]# ls -li linuxsir001.txt
  2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
  [root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt
  [root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
  2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
  2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
  上面的例子,首先我们查看 linuxsir001.txt 的属性,比如inode、所属文件种类、创建或修改时间等... ...我们来对比一下:
  首先 对比一下节点:两个文件的节点不同;
  其次 两个文件的归属的种类不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一个链接文件;
  第三 两个文件的读写权限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的读写权限是 rwxrwxrwx
  第三 两者的硬链接个数相同;都是1
  第四 两文件的属主和所归属的用户组相同;
  第五 修改(或访问、创建)时间不同;
  我们还注意到了linuxsir002.txt 后面有一个标记 ->,这表示linuxsir002.txt 是linuxsir001.txt的软链接文件。
  值得我们注意的是:当我们修改链接文件的内容时,就意味着我们在修改源文件的内容。当然源文件的属性也会发生改变,链接文件的属性并不会发生变化。当我们把源文件删除后,链接文件只存在一个文件名,因为失去了源文件,所以软链接文件也就不存在了。这一点和硬链接是不同的;
  [root@localhost ~]# rm -rf linuxsir001.txt 注:删除linuxsir001.txt
  [root@localhost ~]# ls -li linuxsir002.txt 注:查看linuxsir002 的属性;
  2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
  [root@localhost ~]# more linuxsir002.txt 注:查看linuxsir002.txt的内容;
  linuxsir002.txt: 没有那个文件或目录 注:得到提示,linuxsir002.txt不存在。
  上面的例子告诉我们,如果一个链接文件失去了源,就意味着他已经不存在了;
  我们可以看到软链接文件,其实只是源文件的一个标记,当源文件失去时,他也就是存在了。软链接文件只是占用了inode来存储软链接文件属性等信息,但文件存储是指向源文件的。
  软链接,可以为文件或目录都适用。无论是软链接还是硬链接,都可以用rm来删除。rm工具是通用的。




Inode分为内存中的inode和文件系统中的inode,我们这里说的是文件系统中的inode。
1. linux FS 可以简单分成 inode table与data area两部份。inode table上有许多的inode, 每个inode分别记录一个档案的属性与这个档案分布在哪些datablock上(也就是我们说的指针)。
inode两个功能:记录档案属性和指针
2. inode table中红色区域即inode size,是128Byte,在liunx系统上通过命令我们可以看到,系统就是这么定义的。
Inode size是指分配给一个inode来记录文档属性的磁盘块的大小。
dumpe2fs -h /dev/hda6 | grep node
Inode size:128
3. data ares中紫色的区域block size,就是我们一般概念上的磁盘块。这块区域是我们用来存放数据的地方。
4. 还有一个逻辑上的概念:FS中每分配2048 byte给data area, 就分配一个inode。但一个inode就并不一定就用掉2048 byte, 也不是说files allocation的最小单位是2048 byte, 它仅仅是代表filesystem中inode table/data area分配空间的比例是128/2048,也就是1/16。
mkfs.ext3 -i 2048 这条命令中的-i参数就是我们所说的逻辑概念,它的大小决定inode count的大小,redhat5默认-i最小为可设置为1024.
网上很多介绍关于inode的文章,把inode size的定义搞错了,他们把-i参数这个值或block size解读为inode size 所以很多文章令人费解。
5. inode参数是可以通过mkfs.ext3命令改变的:
mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2
-i 2048更改inode为每2KB创建一个
-b 8192设置block size的大小为8kB
-f 1024设置fragments的大小为1KB
mkfs.ext3 –N 2939495  /dev/sdb2

–N 2939495
更改inode count。
二.更改一个分区inode参数的完整操作过程:
1. 卸载硬盘分区:
[root@localhost ~]# umount /dev/hda7
2. 调整inode参数
[root@localhost ~]# mkfs.ext3 -i 1024 -b 8192 /dev/hda7
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2048256 inodes, 512064 blocks
25603 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=525250560
63 block groups
8240 blocks per group, 8240 fragments per group
32512 inodes per group
Superblock backups stored on blocks:
        8240, 24720, 41200, 57680, 74160, 206000, 222480, 403760
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
3.修改/etc/fstab
修改前
[root@localhost ~]# vi /etc/fstab
LABEL=/       /              ext3    defaults  1 1
LABEL=/boot /boot        ext3    defaults  1 2
devpts         /dev/pts   devpts  gid=5,mode=620  0 0
tmpfs          /dev/shm   tmpfs   defaults  0 0
LABEL=/opt  /opt          ext3    defaults          1 2
proc           /proc         proc    defaults          0 0
sysfs          /sys          sysfs   defaults          0 0
LABEL=/usr  /usr          ext3    defaults          1 2
LABEL=/var  /var          ext3    defaults          1 2
LABEL=SWAP-hda8   swap   swap    defaults        0 0
~
修改后:
[root@localhost ~]# vi /etc/fstab   
LABEL=/      /       ext3    defaults    1 1
LABEL=/boot /boot ext3    defaults   1 2
devpts   /dev/pts  devpts  gid=5,mode=620  0 0
tmpfs   /dev/shm tmpfs   defaults    0 0
/dev/hda7 /opt   ext3    defaults   1 2
proc  /proc  proc    defaults   0 0
sysfs  /sys   sysfs   defaults  0 0
LABEL=/usr   /usr    ext3    defaults  1 2
LABEL=/var  /var     ext3    defaults  1 2
LABEL=SWAP-hda8  swap  swap   defaults  0 0
4.挂载分区
mount -a
5.完成后,参数-i 最小值是1024,这个值的大小决定inode count的大小,他们之间的对应关系是:
i=2048 Inode count:1025024
i=1024 Inode count:2048256
inode size的值在这是没有变化的,这也可以证明我上面定义的inode size。
让我们更加清晰的这几个定义之间的关系。
Inode size
Block size
Inode conut
[root@localhost ~]# dumpe2fs -h /dev/hda7
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   
Last mounted on:         
Filesystem UUID:          440696ad-80e7-4810-8648-a9efda177ea9
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2048256
Block count:              1024128
Reserved block count:     51206
Free blocks:              873767
Free inodes:              2048245
First block:              0
Block size:               2048
Fragment size:            2048
Reserved GDT blocks:      512
Blocks per group:         8176
Fragments per group:      8176
Inodes per group:         16256
Inode blocks per group:   1016
Filesystem created:       Fri Jul 11 18:10:33 2008
Last mount time:          Fri Jul 11 18:11:02 2008
Last write time:          Fri Jul 11 18:11:02 2008
Mount count:              1
Maximum mount count:      34
Last checked:             Fri Jul 11 18:10:33 2008
Check interval:           15552000 (6 months)
Next check after:         Wed Jan  7 18:10:33 2009
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      ad1b7c40-6978-49e9-82f6-2331c5cac122
Journal backup:           inode blocks
Journal size:             32M
由于时间关系:关于mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2中这个-i参数的定义,我是根据对应关系推断,给了它只是个逻辑概念的定义。
欢迎大虾们有更有力的论据来解释一下,或推翻我的观点。
三.读取一个树状目录下的文件/etc/crontab 的流程
1.操作系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的 inode ,并前往读取 /etc 这个目录的所有相关属性;
2.根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有文件的关连数据是放置在哪一个 Block 当中,并前往该 block 读取文件的关连性容;
3.由上个步骤的 Block 当中,可以知道 crontab 这个文件的 inode 所在地,并前往该 inode ;
4.由上个步骤的 inode 当中,可以取得 crontab 这个文件的所有属性,并且可前往由 inode 所指向的 Block 区域,顺利的取得 crontab 的文件内容


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/96362/showart_1950779.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP