Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1712918
  • 博文数量: 186
  • 博客积分: 3044
  • 博客等级: 中校
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-25 15:04
文章分类

全部博文(186)

文章存档

2024年(2)

2022年(4)

2021年(3)

2020年(1)

2019年(5)

2018年(13)

2017年(6)

2016年(10)

2015年(11)

2014年(11)

2013年(13)

2012年(23)

2011年(25)

2010年(2)

2008年(1)

2007年(5)

2006年(51)

分类:

2007-01-25 17:17:00

如何对ext3分区大小进行无损更改

分类:

翻译者:windwithstorm.blogspot.com

    这篇文章是关于如何对ext3分区的大小进行无损转换的。文章详细说明了如何增大或缩小一个已有的ext3分区,以及如何合并两个ext3分区。当你发现你已有的分区方案已经不满足实际需求,而又不想用LVM的时候,这种方式将非常有用。当然,要达成这个目标,有很多不同的方法,而我是使用的这个方法,因此,我不保证对于所有人都是适用的。

1 基础事项:

    首先请注意,下面所有的命令都需要以root身份执行,所以如果你是ubuntu用户的话,使用sudo su命令来切换身份。
    所有步骤都是在ubuntu Edgy Eft桌面系统中测试的,这个系统的所有文件都位于一个大的分区中(大概10GB,设备名/dev/sda1)。就像这样:
df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.5G  4.1G  4.9G  46% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

    需要被更改大小的分区在进行操作之前应该首先被卸载(umount),很显然,如果像本例中这种装有所有重要的系统文件的分区,这样的操作是不可行的。因此,我们需要一张live-CD,当然是Linux的,一会就可以用它来帮忙启动系统。假设你的操作对象是无法实际接触到的远程系统,就需要保证在该机器上拥有能够用于启动的,取代live-CD的rescue系统,而且还需要附带以下工具:fdisk,umount,fsck,tune2fs,e2fsck,resize2fs。从目前的情况看,绝大多数主机公司都会提供带rescue系统的相应的服务器。如果你需要重分配大小的分区没有任何系统文件(例如/home分区,用于备份的分区等等),那就不需要knoppix Live-CD或者rescue系统了,下面所有介绍的步骤都能够直接执行。

    如果你是想对工作系统的分区进行调配,一定要注意首先备份你的数据,因为一旦新分区的大小计算错误的话,你很有可能失去所有的数据,这种情况在缩小分区大小的情况下相当常见!关于备份的方法指导,可以参考网络上的文章。
    
    我将在这份教程中对/dev/sda1进行重分区,如果你的分区名字和这个不一样,请用自己的分区名字来替换/dev/sda1(例如/dev/sdb5或者/dev/hda7等等)。

2 缩小一个ext3分区

    这个章节介绍如何缩小一个ext3分区。在这个例子中,我将缩小我的/dev/sda1。首先让我们来看看目前系统的一些情况:
df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              9859036   4234908   5123304  46% /
varrun                   95480       132     95348   1% /var/run
varlock                  95480         0     95480   0% /var/lock
udev                     10240        52     10188   1% /dev
devshm                   95480         0     95480   0% /dev/shm
lrm                      95480     17580     77900  19% /lib/modules/2.6.17-10-generic/volatile

df -B 4k

Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1              2464759   1058727   1280826  46% /
varrun                   23870        33     23837   1% /var/run
varlock                  23870         0     23870   0% /var/lock
udev                      2560        13      2547   1% /dev
devshm                   23870         0     23870   0% /dev/shm
lrm                      23870      4395     19475  19% /lib/modules/2.6.17-10-generic/volatile

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.5G  4.1G  4.9G  46% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

fdisk -l


Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        1247    10016496   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

fdisk -s /dev/sda1

10016496

    接下来,如果你的分区中没有任何系统文件,则继续下面的步骤,否则,请重新启动系统,并启动到knoppix下或者rescue系统下。
shutdown -r now

    当knoppix启动后,打开终端,切换用户身份:
su

    此时,/dev/sda1默认应该是umount的,当面,我们还是手工umount一次:
umount /dev/sda1

    接下来运行:
fsck -n /dev/sda1

    输出应该是这样的:
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/dev/sda1: clean, 159037/1254176 files, 1095299/2504124 blocks

    现在,我们将日志从/dev/sda1中去除,等于将其转成ext2系统:
tune2fs -O ^has_journal /dev/sda1

    输出是这样的:
tune2fs 1.38 (30-Jun-2005)

    接下来运行:
e2fsck -f /dev/sda1
    
    运行结果:
e2fsck 1.38 (30-Jun-2005)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda1: 164178/1254176 files (0.6% non-contiguous), 1051617/2504124 blocks

    现在,我们用resize2fs来改变文件系统的大小。这个程序只能改变ext2文件系统的大小,这就是为什么刚才我们要先将ext3转换成ex2的原因。当前/dev/sda1已用4.1GB(刚才的df输出可以看到),因此,将10GB的分区缩小到6GB是比较安全的(不能转换到4.1GB以下,否则会丢失数据)。我们运行:
resize2fs /dev/sda1 6000M

    输出:
resize2fs 1.38 (30-Jun-2005)
Resizing the filesystem on /dev/sda1 to 1536000 (4k) blocks.
The filesystem on /dev/sda1 is now 1536000 blocks long.

    请注意这些信息:块的数量(1536000)和大小(4k),一会我们将用到。接下来,我们将删除/dev/sda1分区,并创建一个新的,更小的分区。别害怕,不会有数据损失的。我们在fdisk下进行:
fdisk /dev/sda

    注意阿,是sda,不是sda1。之后会显示:
The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

    按下m键,获得命令列表:
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

    现在,我们来删除/dev/sda1:
Command (m for help): d
Partition number (1-5): 1

    然后创建一个新的/dev/sda1。由于之前它是一个主分区,所以这里我们选择p,并且是一号分区:
Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
p
Partition number (1-4): 1

    现在,就到了关键步骤了:我们被要求输入新分区的大小。首柱面号不是问题,这可以从文章开始时fdisk -l的输出中获得,但我们还不清楚新分区的末柱面号是多少。幸运的是,我们能够确定以k位单位的分区大小,然后按照这个公式计算:

1536000 * 4k * 1.03 = 6328320k

    然后,我们在结果前面加上一个+号,并将小写的k换成大写的K,再输入:
Last cylinder or +size or +sizeM or +sizeK (1-1247, default 1247): +6328320K

    从fdisk的输出我们可以看出,之前的/dev/sda1带有bootable启动标志,因此,我们必须给新的分区加上这个标志:
Command (m for help): a
Partition number (1-5): 1

    现在,写入新的分区表并退出:
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

    然后重新启动。注意,这次还是启动到live-CD环境中(或者rescue模式),用su命令再次切换成root用户,然后运行:
fsck -n /dev/sda1

    输出应该是这样的:
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/dev/sda1: clean, 159036/765536 files, 1047239/1536000 blocks

    接下来,在新的/dev/sda1上创建日志文件,转换回ext3文件系统:
tune2fs -j /dev/sda1

tune2fs 1.38 (30-Jun-2005)
Creating journal inode: done
This filesystem will be automatically checked every 30 mounts or
0 days, whichever comes first. Use tune2fs -c or -i to override.

    好了,这下完成了。再次重启,启动到你原来的系统中,看看:

df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              6047868   4224140   1639408  73% /
varrun                   95480       132     95348   1% /var/run
varlock                  95480         0     95480   0% /var/lock
udev                     10240        52     10188   1% /dev
devshm                   95480         0     95480   0% /dev/shm
lrm                      95480     17580     77900  19% /lib/modules/2.6.17-10-generic/volatile

df -B 4k

Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1              1511967   1056035    409852  73% /
varrun                   23870        33     23837   1% /var/run
varlock                  23870         0     23870   0% /var/lock
udev                      2560        13      2547   1% /dev
devshm                   23870         0     23870   0% /dev/shm
lrm                      23870      4395     19475  19% /lib/modules/2.6.17-10-generic/volatile

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             5.8G  4.1G  1.6G  73% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

fdisk -l


Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         789     6337611   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

fdisk -s /dev/sda1

6337611

    搞定!

3 扩大一个ext3分区

    在这里,我们拥有一个大约是6GB的/dev/sda1分区,在它后面,有一个大约4GB的未用空间(刚刚分出来的,呵呵)。现在,我们要做的就是把这4GB的空闲空间增加到/dev/sda1分区中。请注意,如果这4GB的空余空间不在/dev/sda1后面,而是在硬盘的其它地方,就无法实现这个目的!
    首先,我们收集一些当前分区的资料。

df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              6047868   4224140   1639408  73% /
varrun                   95480       132     95348   1% /var/run
varlock                  95480         0     95480   0% /var/lock
udev                     10240        52     10188   1% /dev
devshm                   95480         0     95480   0% /dev/shm
lrm                      95480     17580     77900  19% /lib/modules/2.6.17-10-generic/volatile

df -B 4k

Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1              1511967   1056035    409852  73% /
varrun                   23870        33     23837   1% /var/run
varlock                  23870         0     23870   0% /var/lock
udev                      2560        13      2547   1% /dev
devshm                   23870         0     23870   0% /dev/shm
lrm                      23870      4395     19475  19% /lib/modules/2.6.17-10-generic/volatile

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             5.8G  4.1G  1.6G  73% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

fdisk -l


Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         789     6337611   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

fdisk -s /dev/sda1

6337611

    然后,我们需要关闭系统,并启动到我们的Knoppix Live-CD(或者rescue系统)中:
shutdown -r now

    之后,切换用户:
su

    卸载sda1:
umount /dev/sda1

    然后执行:
fsck -n /dev/sda1

    输出:
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/dev/sda1: clean, 159036/765536 files, 1080014/1536000 blocks

    然后是:
tune2fs -O ^has_journal /dev/sda1

    输出:
tune2fs 1.38 (30-Jun-2005)

    接下来运行:
fdisk /dev/sda

    输出:

(Yes, it's /dev/sda, not /dev/sda1.)

The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Type m to get a list of all commands:

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

    我们来打印分区表:
Command (m for help): p

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         789     6337611   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

    现在,删除第一个分区:
Command (m for help): d
Partition number (1-5): 1

    然后创建一个新的sda1分区,大体事项和缩小分区步骤一样:
Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
p
Partition number (1-4): 1

    现在就该确定最开始和末尾的柱面号,首先输出起始柱面号:
First cylinder (1-1305, default 1):

    然后fdisk会告述我们可能的最大柱面号,在这里是1247,然后我们直接输入就行了:
Last cylinder or +size or +sizeM or +sizeK (1-1247, default 1247): 1247

    然后看一下新的分区表:
Command (m for help): p

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        1247    10016496   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

    别忘了,之前的分区是启动分区,所以还需要做:
Command (m for help): a
Partition number (1-5): 1

    最后写入:
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

    然后重新启动。还是启动到live-CD环境中(或者rescue模式),用su命令再次切换成root用户,然后运行:
fsck -n /dev/sda1

    输出应该是这样的:
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/dev/sda1: clean, 159036/765536 files, 1047239/1536000 blocks

    接下来,在新的/dev/sda1上创建日志文件,转换回ext3文件系统:
tune2fs -j /dev/sda1

tune2fs 1.38 (30-Jun-2005)
Creating journal inode: done
This filesystem will be automatically checked every 30 mounts or
0 days, whichever comes first. Use tune2fs -c or -i to override.

    好了,这下完成了。再次重启,启动到你原来的系统中,看看:
df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              9859036   4224032   5234348  45% /
varrun                   95480       132     95348   1% /var/run
varlock                  95480         0     95480   0% /var/lock
udev                     10240        52     10188   1% /dev
devshm                   95480         0     95480   0% /dev/shm
lrm                      95480     17580     77900  19% /lib/modules/2.6.17-10-generic/volatile

df -B 4k

Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1              2464759   1056008   1308587  45% /
varrun                   23870        33     23837   1% /var/run
varlock                  23870         0     23870   0% /var/lock
udev                      2560        13      2547   1% /dev
devshm                   23870         0     23870   0% /dev/shm
lrm                      23870      4395     19475  19% /lib/modules/2.6.17-10-generic/volatile

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.5G  4.1G  5.0G  45% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

fdisk -l


Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        1247    10016496   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

fdisk -s /dev/sda1

10016496

4 合并两个ext3分区:

    在这个实例中,我的系统分区还是6GB左右的/dev/sda1,其后紧跟着/dev/sda3分区(大概4GB)。/dev/sda3挂载于/data目录,没有系统所需要的文件,只有用户数据。用df -h看,当前的分区就像这样:
df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             5.8G  4.1G  1.6G  73% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   56K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile
/dev/sda3             3.5G   72M  3.3G   3% /data

    为了合并两个分区,我们必须删除/dev/sda3分区,然后增大sda1分区,就像第三部分描述的那样。也就是说,所有/sda3上的数据全部都会消失。因此,如果你还需要它们的话,请首先备份数据,之后再拷贝到新的,并且更大的sda1上面。
    现在,我们打开/etc/fstab,移除与/dev/sda3有关的行(如果存在的话)。新的,不包含/sda3分区信息的fstab应该是像这样的:

# /etc/fstab: static file system information.
#
#                
proc            /proc           proc    defaults        0       0
# /dev/sda1
UUID=566fd9e9-098f-4aae-9908-51efe171d8ba /               ext3    defaults,errors=remount-ro 0       1
# /dev/sda5
UUID=82102b65-35db-469a-9532-03d619d8cffb none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/           /media/floppy0  auto    rw,user,noauto  0       0

    然后,让我们umount /dev/sda3,用fdisk来删除它。首先umount /dev/sda3,然后fdisk /dev/sda(注意,这里是sda,不是sda3):
The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Type m to get a list of all commands:

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

    现在,删除sda3:
Command (m for help): d
Partition number (1-5): 3

    接下来,向硬盘写入新的分区表:
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

    最后,重新启动系统,进入Live-CD环境或者rescue系统,从这里开始,步骤和第三部分就完全一样的,从su到umount /dev/sda1,其后的步骤请自行参考第三部分。

5 参考链接:

Knoppix:
阅读(7048) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~