Nexus S中的Android将使用ext4文件系统

  Google 新发布的 Nexus S 智能手机将是 Android 设备第一个使用 Ext4 文件系统的手机。ext4(第四扩展文件系统)文件系统是Linux系统下的日志文件系统,是ext3文件系统的后继版本。

  Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

  1. 与 Ext3 兼容。 执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

  2. 更大的文件系统和更大的文件。 较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=">1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

  3. 无限数量的子目录。 Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。

  4. Extents。 Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

  5. 多块分配。 当 写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

  6. 延迟分配。 Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

  7. 快速 fsck。 以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。

  8. 日志校验。 日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

  9. “无日志”(No Journaling)模式。 日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

  10. 在线碎片整理。 尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

  11. inode 相关特性。 Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

  12. 持久预分配(Persistent preallocation)。 P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

  13. 默认启用 barrier。 磁 盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 "mount -o barrier=0" 命令禁用该特性。)

时间: 2024-10-01 15:56:09

Nexus S中的Android将使用ext4文件系统的相关文章

如何在CentOS 6.x x64系统中创建超过16TB的ext4文件系统

如何在CentOS 6.x x64系统中创建超过16TB的ext4文件系统 作者 digoal 日期 2016-09-18 标签 ext4 , 16TB 背景 在使用Ext4文件系统时,发现无法创建超过16TB的文件系统. 例如我的服务器中有多块8T的盘,使用逻辑卷或者软RAID做成较大的块设备,然后使用mkfs.ext4格式化,当LVM或软RAID设备大于16TB时,出现这样的报错 # mkfs.ext4 -b 4096 /dev/md0 mke2fs 1.41.12 (17-May-2010

TextView 中的 android:textAppearance

问题描述 TextView 中的 android:textAppearance 如果我按下面的方法指定 TextView,为什么会得到一个 'white on white'? 我是在Nexus上运行,android上 的 TextView 默认不是黑色的吗? <TextView android:id="@+id/atext" android:layout_width="wrap_content" android:layout_height="wrap

在整个应用程序中锁定 android 方向为横向模式

问题描述 在整个应用程序中锁定 android 方向为横向模式 如何在整个应用程序中锁定 android 方向为横向模式? <activity android:screenOrientation=""landscape"" android:name="".BasicLayoutCheckActivity"" /> 这段代码不能运行,如果使用另外一个 activity,就变成纵向模式. 解决方案 在 Manifest

在eclipse中新建Android工程出现错误提示

在eclipse中新建Android工程,却出现了r cannot be resolved to a variable android的提示.从提示中可以看出是R.java资源文件没有生成,但是具体如何修改没有提示.看到了stackoverflow中的相同问题,问题的回复中给出了一个解答. 具体的解决办法就是在project->properties中侧边栏中选择Java Build Path,之后将相应的android sdk的版本的复选框勾上就可以了.这个问题应该是由eclipse本身带来的,

component-如何读取自定义的组件中的 android:src ?

问题描述 如何读取自定义的组件中的 android:src ? 我想创建一个自定义组件,继承 RelativeLayout. 在我的 xml 布局文件中是这样设置的: <Mycomponent android:src="@drawable/my_test_image"> <TestView> </Mycomponent> 如何在 Mycomponent 的 constructor 里创建一个 Drawable 类? 我想查看 ImageView 的源

如何在AndroidManifest.xml中获取android:targetPackage的值?

问题描述 如何在AndroidManifest.xml中获取android:targetPackage的值? 根据 Junit 测试代码,如何在 Junit 的测试程序中的 Manifest 中访问 android:targetPackage 的值? 我想提取 ""com.mycompany.mytestapp"" <?xml version=""1.0"" encoding=""utf-8"

基于 GMT 的 SqlLite 中的 android 数据

问题描述 基于 GMT 的 SqlLite 中的 android 数据 在 android 的 SqlLite 中有 MyDate 行,如 DATETIME DEFAULT CURRENT_TIMESTAMP.但是当我读取数据时,一个小时后数据又返回了.我在 android 环境中使用 GMT + 1. MyDate: 12:03 Android date: 13:03 当我从 SqlLite 读取数据时,根据 android 环境如何转换成 GMT + X? Cursor cursor = l

改变服务器中的android sensor

问题描述 改变服务器中的android sensor 程序中有个服务器用来检查电话是否响了.在这个服务器中我想检查电话是否开启或关闭. 是否可以一直运行 sensor 来检查服务器是否在运行,还是这个特别损耗电池和 CPU 资源呢? @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { boolean turnAroun

仔eclipse中配置android虚拟设备时出现no target select怎么解决?

问题描述 仔eclipse中配置android虚拟设备时出现no target select怎么解决? 解决方案 这个版本或型号的固件包没下载 解决方案二: 就是你下SDK的时候这个版本的模拟器包没有下下来,推荐使用真机模拟,再不济使用Genymotion模拟器,网上很多教程,别用官方的,速度很慢 解决方案三: 下一个夜神模拟器,自带的模拟器启动速度比较慢不好用 解决方案四: 你选的那个版本没有对应的镜像吧 解决方案五: android ndk-build 时出现target pattern c