GNU Parted 不完全攻略

http://pkkjws.blog.163.com/blog/static/326934532007101011647570/

1.介绍

1.1关于GNU Parted

GNU Parted是一个用于对分区及其文件系统进行建立、修改、调整、检查、复制等操作的一个工具。对于安装新的系统来说,使用GNU Parted来为它进行分区是十分方便的。此外,你还可以用它来检查磁盘的使用状况,在不同的磁盘之间复制数据,甚至是“映象”磁盘——将一个磁盘的安装完好地复制到另一个磁盘中。

我们假设读者您已经对文件系统和分区的概念有所认识。如果您想深入了解这方面的知识,那么我们推荐你读一下GNU Storage Guide。 (译者注:这个文档似乎还不是那么完整,所以建议看一些其他的相关的中文的资料,网上应该会有很多)

GNU Parted的设计宗旨之一就是尽量减少用户数据的损失的可能。例如,若对分区进行操作期间发生意外(如突如其来的断电),GNU Parted能确保你数据的损失的可能性减到最少。此外,GNU Parted还会进行许多安全检查。尽管如此,软件的bugs总会带来一些不稳定的因素。因此,我们建议您先将您的数据备份后再使用GNU Parted进行磁盘操作。另外请注意,libreiserfs提供了对reiserfs分区格式的支持,它可能没有达到上面所说的那样“将数据损失降到最低”的设计宗旨。同样,ntfsresize等等第三方工具也不一定绝对可靠。因而,进行磁盘操作时请您慎重。

GNU Parted的主页是:http://www.gnu.org/software/parted。一些库文件和前端可以从这里下载:ftp://ftp.gnu.org/gnu/parted。你同样会找到许多邮件列表、如何对该软件作贡献的指引以及其他许多有用的相关信息。

若您发现GNU Parted中有bug,那么请将bug报告发送至[email protected],同时附上GNU Parted的版本号,以及下面这个命令所返回的信息(将命令中的/dev/hda换成你实际的硬盘)# parted /dev/hda print unit s print unit chs print。

如果你有问题,那么请大胆地在邮件列表中提出吧——只要这个问题没有被人回答过。如果你对文档中的某些地方感到疑惑,那么请您向我们提出,我们会尽力将给你一个更好的解释。我们的哲学是:用户提出问题是因为我们的文档不够完善。我们会修改它直到你不需要提出问题。

总之,我们乐于倾听您的意见。

1.2 GNU Parted所需要的软件

如果您亲自动手编译和安装 GNU Parted,那么你需要先安装一些其他程序。如果你要编译 GNU Parted,那么你还需要安装这些程序的普通包和开发包。

• libuuid, e2fsprogs包中的一部分。如果没有这个包,那么您可以从下面这个网站中获取它:

http://web.mit.edu/tytso/www/linux/e2fsprogs.html

如果您需要同时编译GNU Parted和e2fsprogs,那么请注意, 你需要对e2fsprogs进行 make install

和make install-libs操作。

• GNU Readline (可选), 可以从下面这个网站中获取它:

ftp://ftp.gnu.org/gnu/readline

如果你需要编译Parted,,但你又没有readline,,那么你可以使用以下编译配置选项来关闭Parted的readline功能:

./configure --disable-readline

• GNU gettext (或其他兼容的软件) 用于编译,如果你需要国际化支持

ftp://ftp.gnu.org/gnu/gettext

• libreiserfs, 如果你需要对reiserfs文件系统的支持

http://reiserfs.osdn.org.ua

请注意,parted在每次运行时都会自动检测并载入libreiserfs 来打开对reiserfs 的支持。然而,libreiserfs 还是非常新,未经过广泛的测试,有可能不是很完善。

1.3 GNU Parted运行平台

GNU Parted所能运行的平台会很有希望地增加。但是,如果你的电脑没有这些平台,那么你需要一张急救磁盘和一个static binary(静态二进制程序)版本的 GNU Parted。请阅读1.6 节[Static binaries]

GNU/Linux

Linux系统:Alpha, x86 PCs, PC98, Macintosh PowerPC, Sun等硬件的构下,内核版本2.0或以上的Linux操作系统

GNU/Hurd

需要GNU libc 2.1 或更高的版本支持。你也许会正在使用比较旧的版本,那么这时你可以用--disable-nls选项。请参考1.5 节[编译GNU Parted]。

此外,还有FreeBSD和BeOS。

1.4 再次发行GNU Parted

GNU Parted是一个自由软件,在 GNU General Public License Version 2下发行。如果你需要再次发行GNU Parted,那么请你附上GNU Parted的COPYING文件。如果你不想这样做,请写信给自由软件基金会(Free Software Foundation):Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.

GNU Parted的库也是GNU Parted的一部分,也是在GPL V2下发行的,而不是LGPL。

1.5 编译GNU Parted

如果你需要编译GNU Parted,那么你只需要这样做:

$ ./configure

$ make

然而,请留意一下这些配置选项

--without-readline

关闭readline.功能。这个选项对于制作急救磁盘非常有用,因为这些库可能不存在。

--disable-debug

关闭调试功能

--disable-dynamic-loading

关闭动态载入程序库的功能(不过现在只有libreiserfs 库支持该功能,因此我们希望会有更多支持这个功能的库)动态载入是一个非常有用的功能,因为它能让你使用libparted ,特别是在你不知道有哪些库可用的时候,这个功能显得更加有用。当然,你可能会需要在特定的情况下关闭这个功能(如制作bootdisk)。

--disable-fs

关闭所有文件系统的支持

--disable-nls

关闭对本地语言的支持。使用旧版本的glibc时,这个选项会非常有用。(有时候急救磁盘中的glibc版本会很旧)

--disable-shared

关闭共享库。在使用旧版本的GNU libc时,如果发生了编译错误“spilled register”,那么你可能需要使用这个选项。建立急救磁盘和引导盘时这个选项同样会很有用。

--disable-Werror

关闭编译时的警告信息的显示

--enable-discover-only

使perted只支持读

--enable-mtrace

打开malloc() 调试

--enable-read-only

关闭写入功能(调试时使用)

1.6 使用 GNU Parted的 Static binaries

1.6.1 介绍

如果你需要在一台没有安装 GNU/Linux使用GNU Parted,或者你需要调整Linux系统的根分区或引导分区,那么你就需要使用一张引导磁盘。以前我们有专门的引导磁盘映象。但是现在已经没有什么必要用到它了,因为大量包含GNU Parted 的live CD 和急救磁盘已经出现。然而,你要留意一下,可能上面的GNU Parted 的版本是过时的。为了弥补其不足,Static binariy格式的GNU Parted出现了。你可以轻易地得到最新版本的Static binariy GNU Parted,并按照一下方法使用之。

1.6.2 建立 Parted 磁盘

1. 引导你的系统

2. 从 ftp://ftp.gnu.org/parted/static中下载‘parted-static-VERSION.tgz’

3. 将压缩包解压,你会得到一个名叫parted.static的文件Unpack the tarball, resulting in a file called “parted.static".

4.插入一张软盘 Insert a floppy.

5. 对插入的软盘进行低级格式化。(在GNU/Linux下可以使用util-linux包里面的fdformat工具)这样做是因为软盘中有可能有一些坏区,我们要将它检查出来。

6.建立文件系统。例如:

$ parted /dev/fd0 mklabel loop mkpartfs primary ext2 0 1.4

7. 挂载软盘:

$ mount -t ext2 /dev/fd0 /mnt/floppy

8. 将 ‘parted.static’ 复制到软盘上

$ cp parted.static /mnt/floppy

9. 卸载软盘

$ umount /mnt/floppy

1.7 若干个GNU Parted的图形前端

1.GParted,一个基于GTK的分区工具,后台使用的正是GNU Parted的库:libparted

clip_image001

2.QtParted。基于QT的分区工具。有点像PQ Magic。不过现在仍在开发之中,不能说十分稳定。后台使用的也是GNU Parted的库。

clip_image002[4]

clip_image003

不过本文介绍的重点依旧是GNU Parted。

2 使用Parted

2.1 关于分区

很不幸,对磁盘分区是十分复杂的。因为各个操作系统对磁盘操作的差异,所以你需要考虑许多因素。因此你最好对这方面的知识有一个充分的了解。

2.2 使用 GNU Parted

GNU Parted有两种运行模式:命令行模式和交互模式。你必须用一下的这种方式来运行 GNU Parted

# parted device

device就是你想要编辑的硬盘设备名称。如果你是一个比较懒的人,省略了这个参数,不要紧, GNU Parted会尝试猜测一下你想要操作的设备。在命令行模式下,你需要将parted的命令一个接一个地输入到一行中。

而在交互模式下,每次只能输入一条parted命令。一旦你按回车键确认,命令就马上执行,对磁盘的更改就立刻生效。例如:

(parted) resize 1 52.0005Mb 104.5Mb

(parted) mkfs 2 fat16

在不被混淆的前提下,你可以对命令进行缩写。例如,你可以用p代替print。若软件被翻译成了你的本国语言,那么你甚至可以用本国语言来输入命令,而不单是英语。不过,这也许会造成混乱,所以还是建议使用英语输入命令。注意, GNU Parted对大小写不敏感。

对于表示分区位置的数字可以使用整数和小数。而数字后面的字母就表示了你所使用的单位。关于 GNU Parted的单位的介绍请参考第2.4.17 节[Unit]。如果没有指明数字的单位,那么就会采用默认值。若数字为负数,那么就表示从磁盘的末尾开始计算。如“-1s”就表示硬盘最后一个扇区,就是硬盘的最末尾处。对于你所给出的位置,parted会稍作计算使之合理。例如,当你使用GB作为单位时,分区位置的误差不会超过+-500M。当然,你可以使用代表扇区的单位s来指定精确的位置。

对于一条命令,如果你没有给出一个参数,那么 GNU Parted会再次向你提问,例如:

(parted) resize 1

Start? 0Gb

End? 40Gb

当你的某些操作具有一定的危险性时,Parted 会警告你,除非是那些本来就是很危险的操作(想rm,mklabel和mkfs)。例如当你想将一个分区过分地缩小,缩小后的空间不足以存放该分区现有的数据,那么Parted 就会自动给出一个安全的分区缩小的方案,以免丢失数据。如果这个Parted 给出的缩小结果和你给出的相差太大,那么Parted 会询问你是否愿意继续。因为不同的分区系统都有复杂的限制,因此Parted 所实际的更改会和你给出的数字有一些微小的出入(例如,你要Parted 为你建立一个10.4MB的分区,但你得到的分区最终只有10.325MB)。如果误差太大,Parted 同样会让你确认一下是否继续。

2.3 命令行模式的选项

当你调用命令行模式时,Parted的语法是这样的:

# parted [option] device [command [argument]]

有几个选项可以供你使用。对于其他涉及分区细节的Parted命令,请参见下一节。选项以一个横杠开头,而Parted命令前则没有这个横杠。

选项:

‘-h’

‘--help’ 显示帮助信息

‘-i’

‘--interactive’

进入交互模式

‘-v’

‘--version’

显示软件的版本号

2.4 Parted 交互模式下的命令

GNU Parted 提供以下命令:

2.4.1 check(检查)

格式:check number

检查编号中所指定的文件系统是否有什么错误.。

例:

(parted) check 1

检查分区1上的文件系统.

2.4.2 cp(复制)

格式:cp [from-device] from-number to-number

将分区 from-number上的文件系统完整地复制到分区to-number 中。分区to-number 上的数据会被全部删除。你可以再指定一个来源硬盘的设备名称 from-device来指定来源分区所在的硬盘。

该命令支持以下文件系统:

* ext2, ext3 (所提供的目标分区必须比源分区要大)

* fat16, fat32

* linux-swap (相当于再目标分区执行mkswap 命令)

* reiserfs (如果安装了libreiserfs库)

例:

(parted) cp /dev/hdb 2 3

将/dev/hdb上的第二个分区的内容复制到第三个分区上。

2.4.3 help(帮助)

格式:help [command]

输出一个命令的帮助信息

例:

(parted) help resize

输出rezize 命令的帮助信息。

2.4.4 mklabel(建立分区表)

格式:mklabel label-type

建立一个 label-type 类型的磁盘分区表。新的分区表不会有任何分区。这个命令通常不会破坏你的数据,但是它有可能让你的数据变得不可读。这是你就需要用到rescue 命令来恢复分区。关于rescue 命令的用法请参见后文。Parted 能在各种分区表上工作。

label-type 必须是一下这些类型:

* bsd

* loop (raw disk access)

* gpt

* mac

* msdos

* pc98

* sun

例:

(parted) mklabel msdos

建立一个MS-DOS格式的分区表。这对于PC而言是一个非常常见的操作。

2.4.5 mkfs(建立文件系统)

格式:mkfs number fs-type

在指定的分区上建立指定的文件系统。这个命令会破坏该分区上的所有数据。

该命令支持以下文件系统:

* ext2

* fat16, fat32

* linux-swap

* reiserfs (如果安装了libreiserfs库)

例:

(parted) mkfs 2 fat32

在第二个分区上建立FAT32格式的文件系统。

2.4.6 mkpart(建立新分区)

格式:mkpart part-type [fs-type] start end

建立一个新的分区。若要建立非扩展分区,就最好用fs-type来指定文件系统。start和end是新分区开始和结束的具体位置。part-type是以下类型之一: primary(主分区), extended(扩展分区), logical(逻辑分区). 扩展分区和逻辑分区只对msdos 和dvh分区表有效。

fs-type必须是以下文件系统:

* ext2

* fat16, fat32

* hfs, hfs+, hfsx

* linux-swap

* NTFS

* reiserfs

* ufs

例:

(parted) mkpart logical 0.0 692.1

建立一个包含ext2文件系统的逻辑分区,其位置是从磁盘的开始位置(0.0)到692.1M之间 。

2.4.7 mkpartfs(建立分区及其文件系统)

格式:mkpartfs part-type fs-type start end

建立一个新的分区,并在上面建立文件系统。与mkpart相似,分区的位置处于begin和end之间,默认的单位是MB.。请勿使用这个命令来恢复一个被删除了的分区(应使用mkpart)。part-type是以下类型之一: primary(主分区), extended(扩展分区), logical(逻辑分区). 扩展分区和逻辑分区只对msdos 和dvh分区表有效。 fs-type必须是以下文件系统:

* ext2

* fat16, fat32

* linux-swap

* reiserfs (如果安装了libreiserfs库)

例:

(parted) mkpartfs logical ext2 440 670

建立一个a包含ex2格式文件系统的逻辑分区。其开始位置是440 MB,结束位置是670MB。

2.4.8 move(移动)

格式:move number start end

该命令能将选定的分区在硬盘中移动。start 可以指定一个新的分区的起始位置。不过,你不能将一个分区移到另一个分区上。也就是说,你只能在空闲的地方中移动分区。如果你想改变分区的大小,那么你所需要的命令是resize 。另外,虽然分区被移动了,但它的分区编号是不会改变的。

该命令支持以下文件系统:

* ext2, ext3 (所提供的目标分区必须比源分区要大)

* fat16, fat32

* linux-swap

* reiserfs (如果安装了libreiserfs库)

例:

(parted) move 2 150M 500M

将编号为2的分区移动到硬盘中150M至500M的位置。

2.4.9 name (命名)

格式:name number name

为编号所指定的分区命名(只支持GPT, Mac, MIPS 和PC98 格式的分区)。名字可以用引号括起来。

例:

(parted) name 2 ’Secret Documents’

将第2个分区命名为 ’Secret Documents’。

2.4.10 print (输出信息)

格式:print [number]

输出parted正在操作的硬盘的分区表的信息,或者是某一个具体分区的信息。

例:

(parted) print

Disk geometry for /dev/hda: 0.000-2445.679 megabytes

Disk label type: msdos

Minor Start End Type Filesystem Flags

1 0.031 945.000 primary fat32 boot, lba

2 945.000 2358.562 primary ext2

3 2358.562 2445.187 primary linux-swap

(parted) print 1

Minor: 1

Flags: boot, lba

File System: fat32

Size: 945.000Mb (0%)

Minimum size: 84.361Mb (0%)

Maximum size: 2445.679Mb (100%)

2.4.11 quit (退出)

格式:quit

退出Parted.

只有当Parted退出后,Linux内核才会知道磁盘的设置已经被改变了。但是实际上只要你一执行一条命令,更改马上就会写入磁盘。不过,磁盘缓存有可能延缓写入的操作。

2.4.12 rescue (恢复)

格式:rescue start end

如果你不小心用Parted的rm命令删除了一个分区,那么这个命令可以帮你恢复。你需要给出所误删的分区的大概的开始和结束的位置。Parted 就会在你给出的磁盘区域内去寻找,如果找到这个分区,那么Parted 就会询问你是否重新建立这个分区。

例:

(parted) print

Disk geometry for /dev/hdc: 0.000-8063.507 megabytes

Disk label type: msdos

Minor Start End Type Filesystem Flags

1 0.031 8056.032 primary ext3

(parted) rm

Partition number? 1

(parted) print

Disk geometry for /dev/hdc: 0.000-8063.507 megabytes

Disk label type: msdos

Minor Start End Type Filesystem Flags

糟糕了!我们不小心删除了这个ext3分区。不怕,Parted可以将它起死回生。

(parted) rescue

Start? 0

End? 8056

Information: A ext3 primary partition was found at 0.031MB ->

8056.030MB. Do you want to add it to the partition table?

Yes/No/Cancel? y

(parted) print

Disk geometry for /dev/hdc: 0.000-8063.507 megabytes

Disk label type: msdos

Minor Start End Type Filesystem Flags

1 0.031 8056.032 primary ext3

呵呵。这就恢复了。

2.4.13 resize (调整大小)

格式:resize number start end

将编号所指定的分区调整大小。分区的开始位置和结束位置由start和end决定。resize不会改变分区的编号。注意,如果更改扩展分区的大小,那么你必须保证新的分区大小能够容纳里面的逻辑分区。另外,在调整大小前你无须对分区进行碎片整理。

该命令支持以下文件系统:

* ext2, ext3 – 限制:新的分区开始位置必须和原来的开始位置相同。也就是说,你只能向后扩展分区的大小。

* fat16, fat32

* hfs, hfs+, hfsx – 限制:新的分区开始位置必须和原来的开始位置相同。而且新的end必须小于原来的end。也就是说,你只能够缩小分区。

* linux-swap

* reiserfs (如果安装了libreiserfs库)

例:

(parted) resize 3 200M 850M

改变编号为3的分区的大小。其新的位置是200MB至 850MB 之间。

2.4.14 rm (删除分区)

格式:rm number

将编号所指定的分区删除。如果你误删了某个分区,那么你还可以用mkpart来挽救它(而不是用mkpartds)。注意,如果你使用的是MSDOS格式的分区表,那么假如你删除了一个逻辑分区,那么该分区后面的逻辑分区的编号都会相应地向前改变。例如,你删除了编号为6的逻辑分区,那么后面的7、8号逻辑分区的编号将会改变,分别变成6、7号逻辑分区。若在Linux下。这意味着你可能要改变/etc/fstab文件。

例:

(parted) rm 3

将编号为3的分区删除。

2.4.15 select (选择设备)

格式:select device

选择Parted将要编辑的磁盘设备。这个磁盘设备可以是一个Linux硬盘设备,一个软盘、一个软RAID磁盘阵或者是LVM逻辑卷。

例:

(parted) select /dev/hdb

选择/dev/hdb作为Parted所要编辑的设备。

2.4.16 set (设置标记)

格式:set number flag state

更改编号所指定的分区的标记。哪些标记可用是由你的分区表决定的。标记有两种状态,要么是on(生效),要么是off(失效)。

‘boot’ (用于Mac, MS-DOS, PC98分区表) - 如果你想从某个分区引导,那么你应该将这个分区的boot标记设置为on。对于MS-DOS分区表,一个硬盘上只能有一个分区是可引导的。如果你将LILO装到某个分区上,那么这个分区一定是可引导的(也就是说你应该将安装了LILO的分区的boot标记设为on)。对于PC98分区表,所有ext3分区都必须是设置为可引导的。(Parted会对此强行操作)

‘lba’ (用于MS-DOS分区表)-这个标记可以告诉MS DOS、MS Windows 9x和 MS Windows ME等系统使用LBA(Logic Block Addressing)模式。

‘root’ (用于Mac分区表) - 如果某分区是Linux系统的根分区,那么就要对该分区启用这个标记。

‘swap’ (用于Mac分区表) - 如果某分区是Linux系统的交换分区,那么就要对该分区启用这个标记。

‘hidden’ (用于MS-DOS, PC98分区表) - 启用这个标记能使一个分区‘隐藏’起来。(仅对微软的操作系统有效)

‘raid’ (用于MS-DOS分区表)-启用这个标记能够告诉Linux系统这是一个软RAID磁盘阵。

‘LVM’(用于MS-DOS分区表)-启用这个标记能够告诉Linux系统这是一个LVM逻辑。

使用print命令能够将所有能用的标记显示出来。

例:

(parted) set 1 boot on

将编号为1的分区的boot标记设定为on(生效)

2.4.17 unit (设置单位)

格式:unit unit

为Parted选择一个表示磁盘大小的单位。之后,凡是关于磁盘的位置(如分区的开始位置等等)的数字都是使用这个单位,你就可以不用给出单位后缀。(如:如果你选择了MB作为单位,那么512就代表512MB,你就不用额外打多个MB之类的东西)你可以使用下列单位:

‘s’ :扇区 (通常一个扇区的大小是512个字节)

‘B’ byte

‘kB’ kilobyte (1000 bytes)

‘MB’ megabyte (1000000 bytes)

‘GB’ gigabyte (1000000000 bytes)

‘TB’ terabyte (1000000000000 bytes)

‘%’ 表示占整个磁盘设备的百分之多少(显而易见,这个数字必须在0和100之间)

‘cyl’ 柱面(这个具体的位置和BIOS的CHS地址有关)

‘chs’ 柱面(cylinders),磁头(heads),扇区(sectors)的地址(这个具体的位置和BIOS的CHS地址有关)

‘compact’ 这是一个比较奇怪的单位。输入时是使用MB作为单位,输出时的单位有可能不同,但是它确保输出时的单位能使用户一眼就看得出来磁盘的大小的,而不用心里默默地进行复杂的换算。(例如。它会使用1GB而不是使用1024MB,使用2MB而不是2048KB)

一般来说,Parted只会使用默认的单位进行输出,除非输入的时候你没有给出数字的后缀。你可以在输入的数字后面加上一个单位来代替默认的单位(单位和数字之间是没有空格的)。不过若你使用CHS地址作为单位时,你就不需要给定后缀。使用chs地址的格式是:“柱面:磁头:扇区”。对你所给出的数字地址,Parted可能进行一些调整。例如,当你使用GB作为单位时,分区位置可能会有+-500M的误差。不过Parted总会尽量地使误差尽量地小。当然,你可以使用单位s(也就是扇区)来指定一个精确的位置。若无法做到精确,Parted会让你给出一个最接近的解决方案。另外,若你给出的数字为负数,那么就表示从磁盘的末尾开始计算。如“-1s”就表示硬盘最后一个扇区,就是硬盘的最末尾处。

例:

(parted) unit compact

(parted) print

Disk geometry for /dev/hda: 0kB - 123GB

Disk label type: msdos

Number Start End Size Type File system Flags

1 32kB 1078MB 1077MB primary reiserfs boot

2 1078MB 2155MB 1078MB primary linux-swap

3 2155MB 123GB 121GB extended

5 2155MB 7452MB 5297MB logical reiserfs

(parted) unit chs print

Disk geometry for /dev/hda: 0,0,0 - 14946,225,62

BIOS cylinder,head,sector geometry: 14946,255,63. Each cylinder

is 8225kB.

Disk label type: msdos

Number Start End Type File system Flags

1 0,1,0 130,254,62 primary reiserfs boot

2 131,0,0 261,254,62 primary linux-swap

3 262,0,0 14945,254,62 extended

5 262,2,0 905,254,62 logical reiserfs

(parted) unit mb print

Disk geometry for /dev/hda: 0MB - 122942MB

Disk label type: msdos

Number Start End Size Type File system Flags

1 0MB 1078MB 1077MB primary reiserfs boot

2 1078MB 2155MB 1078MB primary linux-swap

3 2155MB 122935MB 120780MB extended

5 2155MB 7452MB 5297MB logical reiserfs

3.译后记

这篇文章大部分是翻译自GNU Parted 的官方文档GNU Parted User Manual。这是我的第一篇比较完整的翻译的文档。本人不是专业的英语翻译,英语水平有限,所以翻译出来的某些句子有些生硬冷涩,不大好明白,希望大家原谅。由于本人水平有限,不能够将原文的精髓完全地翻译出来。不过,本人以后会尽量地将它修改得更好。另外,为了使读者更好理解,本人对原来的文档稍稍作了一些修改。

转载本文时希望您注明作者。

PKKJ

2007.11.10

你可能感兴趣的:(part)