基本步骤:
1确认内核版本和系统环境支持ext4 (推荐升至2.6.28以上,lsmod |grep ext4)
2卸载要升级的分区(在线卸不掉则需要进单用户)
3 tune2fs -O has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize来给分区加入ext4的特性
4 e2fsck -fDC0 /dev/sdb1 –y修复分区错误
5修改fstab中分区格式为ext4,reboot
关键点:
1tune2fs版本要高于1.41 否则不支持ext4的特性
2官方推荐使用2.6.28以上内核才稳定支持ext4
3对在使用的分区如var,一定要先卸载再操作,并且重启之前一定要挨个执行完tune2fs,e2fsck,和vi /boot/fstab的修改,再重启,否则挂载就会出问题
网络资料:
一、测试场景
操作系统:CentOS 5.6 x86 64bit(内核2.6.18)
文件系统:ext3
硬盘:2块(sda1、sdb1),sdb1的挂载点为/android,专门用来存储编译文件,在编译时报错。
二、升级前状态
查看系统内核版本:
# uname -r
2.6.18-238.el5
查看文件系统的情况:
# df -T
文件系统 类型 1K-块 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
ext3 13077624 3342968 9059636 27% /
/dev/sda1 ext3 101086 15876 79991 17% /boot
tmpfs tmpfs 257452 0 257452 0% /dev/shm
/dev/sdb1 ext3 8254240 149624 7685324 2% /android
查看ext4特征是否激活:
# tune2fs -l /dev/sdb1 | grep extent
执行上述命令后无任何信息返回,说明/dev/sdb1的ext4特征没有激活,唯一的解决办法就是升级文件系统到ext4了。
三、软件下载及安装
e2fsprogs软件包下载页面:http://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/
接下来是源码编译安装过程:
# wget http://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/e2fsprogs-1.41.14.tar.gz
# tar -zxvf e2fsprogs-1.41.14.tar.gz
# cd e2fsprogs-1.41.14
# ./configure
# make && make install
安装完毕后暂时不需要重启系统。第一次安装完毕时我就重启系统了,结果系统竟然崩溃了,因此e2fsprogs软件包安装完毕后不要立即重启服务器。
四、制作系统引导镜像
查找并加载相应的模块,如只需ext4支持,可将--with=ext3去掉:
# mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img.old
# mkinitrd -v --with=ext4 --with=ext3 /boot/initrd-`uname -r`.img `uname -r`
Creating initramfs
Looking for deps of module ehci-hcd
……
Adding module ext4
这时可以放心的重启服务器了:
# init 6
五、文件系统格式升级转换
服务器重启后,看看文件系统又变化没。任然没有变化:
# df -T
文件系统 类型 1K-块 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
ext3 13077624 3342968 9059636 27% /
/dev/sda1 ext3 101086 15876 79991 17% /boot
tmpfs tmpfs 257452 0 257452 0% /dev/shm
/dev/sdb1 ext3 8254240 149624 7685324 2% /android
文件系统格式转换:
# umount /dev/sdb1
# tune2fs -O has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize /dev/sdb1
tune2fs 1.41.14 (22-Dec-2010)
修改转换文件系统错误:
# e2fsck -fDC0 /dev/sdb1 -y
e2fsck 1.41.14 (22-Dec-2010)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 3A: Optimizing directories
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/sdb1: ***** 文件系统已修改 *****
/dev/sdb1: 11/524288 files (0.0% non-contiguous), 70320/2096474 blocks
重新挂载:
# mount -t ext4 /dev/sdb1 /android
修改文件系统信息(重要!否则重启后会还原为ext3)。绿色字体为需要修改的地方,没有这项纪录的话则新增:
# vi /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
/dev/sdb1 /android ext4 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
使对fstab的修改立即生效:
# mount -a
六、升级后的文件系统状态
查看文件系统的变化,哈哈,挂载点/android的文件系统已经是ext4了。
# df -T
文件系统 类型 1K-块 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
ext3 13077624 3343024 9059580 27% /
/dev/sda1 ext3 101086 15876 79991 17% /boot
/dev/sdb1 ext4 8254240 149624 7685324 2% /android
tmpfs tmpfs 257452 0 257452 0% /dev/shm
ext4的特征全激活了:
# tune2fs -l /dev/sdb1 | grep extent
Filesystem features:has_journal ext_attr resize_inode dir_index
filetype needs_recovery extent flex_bg sparse_super large_file
huge_file uninit_bg dir_nlink extra_isize
七、后记
经过上述一系列的操作,可以顺利将挂载点/android的文件系统从ext3升级到ext4。但是,如果你硬盘上只有两个分区,即“/”和“/boot”,这时转换的就是挂载点“/”了。我试过,将“/”由ext3升级到ext4没有成功。原因是在进行文件系统升级时,必须先umount,升级完后再mount回来,而操作系统启动后,“/”是不能被卸载(umount)的。我的解决方案是给服务器加一个分区(通过加硬盘或创建VG来实现),然后将新的分区转换成ext4文件系统。不知谁有更好的解决方案,若有的话一定要告诉我。