新手squashfs 挂载 可读写读写方式挂载

fengyuzaitu 的BLOG
用户名:fengyuzaitu
文章数:452
评论数:22
访问量:99997
注册日期:
阅读量:5863
阅读量:12276
阅读量:417661
阅读量:1105410
51CTO推荐博文
通过前面的分析,我们已经可以unsquash squashfs.img文件获得ext3fs.img通过直接挂载就是一个完整的根文件系统,一般情况下,我们只需要直接chroot就可以安装rpm包等等操作如果我们想运行什么程序或者干点别的,例如df -Th,发现输出错误,ifconfig也没有任何的显示这个时候我们需要进行如下的操作:&&&mount&--bind&/dev&/mnt/custom/dev
&&&&&mount&--bind&/sys&/mnt/custom/sys
&&&&&mount&--bind&/proc&/mnt/custom/proc
&&&&&chroot&/mnt/custom其中/mnt/custom是ext3fs.img文件的挂载点。修改完毕退出:exit&&&#&This&leaves&the&chrooted&environment
&&&&&umount&/mnt/custom/dev
&&&&&umount&/mnt/custom/sys
&&&&&umount&/mnt/custom/proc
&&&&&umount&/mnt/custom
了这篇文章
类别:┆阅读(0)┆评论(0)下次自动登录
现在的位置:
& 综合 & 正文
Linux内核文档翻译之Squashfs文件系统
对于使用openwrt的嵌入式系统来说,因为硬件绝大多数采用Flash,因此一般使用squashfs文件系统和jffs2文件系统。前者是只读的,后者是可写的。我们一般会把jffs2
mount到某个目录下。这样就存在某些目录如/bin是只读的(squashfs),某些目录是可读写的(jffs2),这样对文件的操作会依赖于文件系统的属性和文件的路径。
openwrt使用了mini_fo文件系统,从用户的使用角度看,会觉得整个文件系统都是可写的。用户可以任意修改、删除、添加文件。这种文件系统可以认为是在squashfs和jffs2的文件系统之上实现了一个符号链接,如果用户读取只读文件,则链接到squashfs文件系统读取,如果用户对只读文件进行了修改,则将修改的文件放到jffs2文件系统上,并修改链接。
如果用户的系统不采用jffs2系统,openwrt会使用ramfs,依旧可以实现上面的功能,不过系统重启后,修改会丢失。
/************************************************************************************************************************************/
原创作品,转载时请务必以超链接形式标明原始出处:,作者:
/************************************************************************************************************************************/
来说下Linux下的squashfs文件系统,使用squashfs文件系统作为只读分区,使用mini_fo文件将squashfs和jffs2文件系统组合成可写可读根文件系统,当写操作时会将写入内容放到jffs2文件系统中,为了深入研究squashfs文件系统工作原理,先将内核文档翻译一下。
原文件位置:Linux源码目录\Documentation\filesystems\squashfs.txt
SQUASHFS 4.0 FILESYSTEM
=======================
Squashfs是Linux下的一种只读压缩文件系统类型。它使用zlib/lzo/xz等压缩来压缩文件,节点及目录。Squashfs文件系统内的节点非常小巧并且所有的数据块都排列紧凑,通过这种方式来降低数据存储开销。数据块大小可以取在4KB到1MB,但默认大小为128KB。
Squashfs为通用只读文件系统所用,常用来保存归档文件(如 .tar.gz文件等),还有用于存储空间受限的系统,更有甚者,嵌入式设备中用于恢复出厂设置的只读分区来用。
邮件列表: squashfs-devel@lists.sourceforge.net
官方网站: www.squashfs.org
1. 文件系统特性
-------------------------------------------
Squashfs 文件系统 VS Cramfs 文件系统特性:
Squashfs 会将数据、节点及目录进行压缩。另外,节点和目录数据是字节对齐并且是高度紧凑的。每个压缩的节点平均仅占用8字节长度(确切长度会因为文件类型而不同,比如普通文件、目录、符号链接及块/字符设备节点等)。
2. 使用 Squashfs文件系统
-----------------
squashfs作为一种只读文件,必须用mksquashfs工具来创建压缩的squashfs文件系统。mksquash工具及unsquashfs等工具可以从http://www.squashfs.org网站获取。这些squashfs相关工具树现在已经被集成到kernel.org内:git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git
3. Squashfs 文件系统设计
-----------------------------
Squashfs 文件系统最多包含9种字节对齐的模块:
压缩的数据块就像从某个目录里读文件一样写到文件系统并进行冗余检查。当文件数据被写入到文件系统, completed inode, directory, fragment, export, uid/gid lookup 和xattr tables也会同时被写入到文件系统里面。
3.1 索引节点
----------
元数据 (索引节点和目录) 一般被压缩成为8KB大小的数据块。每个压缩块前都有2字节的前缀头,当某数据块被压缩时前缀头的最高位会被置1,当然-noI 选项被置1或者压缩部分的大小大于未压缩大小时,数据块将会被解压。
索引节点会被打包进元数据块,但并未以块大小对齐,因此索引节点会覆盖压缩数据块。索引节点是用一个48位数来标示的,这个48位数包括含有该索引点的压缩元数据块的位置及索引节点在块内的偏移量&block,offset&。
为了提高压缩率,Squashfs文件系统针对不同的文件类型(普通文件、目录文件、设备文件等等)采用不同的索引节点,并且这些不同索引节点有不同的数据位数。为了进一步提高压缩率,普通文件索引节点和目录文件索引节点定义如下:为常用的普通文件和目录文件优化并且保存了额外信息的节点类型
---------------
和索引节点一样,目录文件同样是被打包进元数据块内,只是被存放在目录表内而以。同样的,目录文件的存取是通过包含该目录的元数据块的起始地址及块内偏移来完成的&block,offset&。
目录不是通过简单的文件名列表而是一种稍显巧妙的方式来组织的。该组织方式充分利用了文件的索引节点会存放在同一元数据块内的事实,因此可能共享其块起始地址。因此目录组织结构包括两部分:包含共享块起始地址的目录头和使用了共享块起始地址的顺序目录项。当索引节点的起始块地址改变时,目录头也会被修改。目录头和目录项会尽可能的重复。目录包含一个用来快速检索文件的目录索引,并且目录是有序的。目录索引会在每个元数据块储存一个条目,而每个条目里则存放着该元数据块的第一个目录头对应的索引或者文件名。目录名是以字母顺序排列的,检索时内核会线性地搜索大于被查找文件名第一个字母的文件名,这样包含该文件名的元数据块的位置就可以确定了。这种方法的核心所在是这种索引方法可以保证要检索的元数据块不依赖于目录的长度,另外的优点是这种方法不需要额外的内存及磁盘存储空间。
3.3 文件数据
-------------
普通文件由一系列连续的压缩数据块及压缩片段块组成(尾端压缩块)。每个数据块的压缩大小存放在文件节点的块列表内。
为了加快读大“数据”(256MB或者更大)的速度,squashfs实现了一个缓存从块索引映射到磁盘上的数据的缓存索引。
这种缓存索引允许squashfs处理大文件(1.75TiB级别的)但仅仅在磁盘上保存一个简单小巧的块列表。这种缓存又被划分为更小的槽,每个槽可以缓存224GiB大小的文件(128KiB块);大文件即可以使用多个槽,比如1.75TiB使用8个槽。缓存索引被设计为一种内存高效的方法,默认情况下大小为16KiB。
3.4 片段检索表
-------------------------
常规文件可以包含一些被映射了磁盘位置的片段索引和使用片段检索表的压缩数据大小。这种片段检索表本身被压缩地存储元在数据块内部。第二个索引表用来定位这些,第二个索引表可以提高存取速度(因为它很小),在挂载时读取并缓存在内存中。
3.5 uid/gid索引表
------------------------
出于空间效率考虑,普通文件保存了uid/gid索引,这些索引将最终被转换为使用检索表32位uid/gid。这些索引表会被压缩进元数据块内。第二个索引表用来定位这些,第二个索引表可以提高存取速度(因为它很小),在挂载时读取并缓存在内存中。
3.6 导出表
----------------
为了使Squashfs文件系统成为可导出文件系统(通过NFS等),可以选择(通过mksquashfs工具加-no-exports来禁用)包含一个inode号到inode磁盘磁盘位置的查找表。需要使用Squashfs来使能inode号到inode在磁盘上的位置的映射,当导出代码重新实例过期/刷新的inode
时这个很有必要。这个导出表会压缩进元数据块。第二个索引表用来定位这些,第二个索引表可以提高存取速度(因为它很小),在挂载时读取并缓存在内存中。
3.7 扩展属性表
---------------
扩展属性表包含每个节点的扩展属性。 每个索引节点的扩展属性被存储在一个列表中,每个列表条目包含一个type,name和value字段。type字段使用扩展属性前缀("user","trusted."等)来编码,它也确定name/value字段应该被解释。目前type用来指明value值是否内嵌存储(在这种情况下,value字段包含扩展属性值)
,或者外部存储(在这种情况下,value字段中存储有扩展属性实际存储位置的指针) 。这使得较大的属性值可以通过外部存储的方式来提高扫描检索性能,同时 它还允许该值被"反拷贝",该值仅被存储一次,其他的就可以并发使用一个引用来访问该值。
扩展属性列表被打包压缩成8K元数据块。为了减少节点的开销,一个32位扩展属性ID被保存而不是存储扩展属性的磁盘位置到每个inode内。这个32位扩展属性ID使用第二个扩展ID检索表映射了扩展属性列表的位置。
4. 未来的工作及突出问题-------------------------------4.1 未来工作列表-------------实现 ACL 支持
4.2 Squashfs 内部缓存---------------------------
Squashfs的块是以压缩形式存在的。为了避免重复解压最近访问过的数据Squashfs的使用两个小的元数据和片段高速缓存。
这种缓存并不用于那些压缩并在页高速缓存里通过正常方式缓存的数据块,而是用于临时缓存作为一个元数据的结果读取的片段和元数据块(即inode或目录)或片段连接。因为元数据和片段会被一起打包成块(以获得更大的压缩),读取特定的元数据或片段/片段会导致其他元数据检索被挤满,这可能是因为本地引用在不久后会被读取。临时缓存确保它们可在不久的将来不需要额外的读解压缩的情况下被访问。
将来内部缓存将会被内核页面缓存替换,但由于内核页面缓存页是基于页大小单位来操作的,因此可能会引入额外锁及相关竞态条件的复杂性。
&&&&推荐文章:
【上篇】【下篇】温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
静水以深流,宁静以致远。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(512)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)',
blogAbstract:'一、什么是文件系统 (Filesystem);A directory structure contained within a disk drive or disk area. The total available disk space can be composed of one or more filesystems. A filesystem must be mounted before it can be accessed. To mount a filesystem, you must specify a directory to act as the mount point. Once mounted, any access to the mount point directory or its subdirectories will access the separate',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'静水以深流,宁静以致远。',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}基于 SquashFS 构建 Linux 可读写文件系统
在当前的嵌入式操作系统开发中,Linux 操作系统通常被压缩成 Image 后存放在 Flash 设备中。在系统启动过程中,这些 Image 被直接挂载到根文件系统, 然而这时的根文件系统是只读的, 用户不能在这个文件系统中进行任何写的操作。 如果把 Image 解压后直接拷贝到内存中,也可以实现写的功能,但是嵌入式系统一直存在内存大小方面的限制,所以将整个 Linux 系统拷入内存是不可取的。 本文将介绍一种直接挂载 Image 到根目录下,同时实现文件系统可读写的功能。
嵌入式 Linux 启动过程
本文所描述的的 Linux Image 由 BootLoader、kernel、initrd、rootfs 组成,它们共同存在于一个可以启动的存储设备中(本文以 USB 为例)。组成架构如下:
图 1. 可启动 linux 镜像文件结构
各个模块的作用如下:
Boot Loader:由 BIOS 加载,用于将后续的 Kernel 和 initrd 的装载到内存中
kernel:为 initrd 运行提供基础的运行环境
initrd:检测并加载各种驱动程序
rootfs:根文件系统,用户的各种操作都是基于这个被最后加载的文件系统
其调用顺序是 Boot Loader-&kernel-&initrd-&rootfs。
当机器上电时首先 BIOS 会启动,然后装载 USB 设备中的 Boot Loader、kernel,、nitrd 到内存中,由于这些文件大小总和小于 10M,所以我们直接拷贝到内存中再执行不会有问题。
最后要加载的 rootfs 是用户最终进行读写操作的文件系统。
在非嵌入式系统中,这部分文件通常储存在可直接读写的硬盘上,因此直接挂载到根目录后(例如:mount /dev/sda1 /mnt)就可以进行读写操作。
在嵌入式系统中,它是一个压缩的文件系统,大小通常是好几百兆,解压后的大小都超过 1G,如果直接 mount 到系统目录,那么系统目录是只读的,不可进行写入操作。而如果把它加压到内存中可以实现读写的操作,但是这么大的文件直接解压到内存中对于嵌入式设备来说 是不可接受的。因此我们需要找到一种不拷贝 rootfs 到内存中,同时又可以对最终的根文件系统进行读写的方法。
只读式压缩文件系统介绍
在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用 RAMDISK(把内存当作 disk)方式来使用文件系统,那么在系统运行之后,首先要把外存 (Flash) 上的映像文件解压缩到内存中,构造起 RAMDISK 环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在外存中占据了空间 ( 以压缩后的形式存在 ),而且还在内存中占用了更大的空间 ( 以解压缩之后的形式存在 ),这违背了嵌入式环境下尽量节省资源的要求。以下两种方案的诞生就是为了解决这个问题:
CramFS 文件系统是专门针对闪存设计的只读压缩的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的 时侯,马上计算出该数据在 CramFS 中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS 中的解压缩以及解压缩之后的内存中数据存放位置都是由 CramFS 文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。
SquashFS 也是一个只读的文件系统,它可以将整个文件系统压缩在一起,存放在某个设备,某个分区或者普通的文件中。如果您将其压缩到一个设备中,那么您可以将其直接 mount 起来使用,而如果它仅仅是个文件的话,您可以将其当为一个 loopback 设备使用。
更多信息请参考“”和“”。
本文主要介绍基于 SquashFS 的可读写文件系统构建。
Squash 压缩文件系统的创建
步骤 1:创建空的根文件系统,文件系统的大小为 65536 & /G。接下来我们会在这个空的根文件系统中存放文件。
dd: 读取源文件的内容并创建一个新文件,if 指定源文件内容,of 指定新文件名字,bs 和 count 指定新文件的大小
mke2fs: 将新创建的 rootfs 格式化为 Linux 可识别的文件系统
清单 1. 创建空的根文件系统&
dd if=/dev/zero of=rootfs bs=65536 count=24000
mke2fs -F rootfs 步骤 2:挂载空的根文件系统,将 1.5G 的文件系统挂载在 mnt 目录下,然后通过 mnt 目录将内容写入根文件系统。
清单 2. 挂载空的根文件系统
mount rootfs mnt -o loop 步骤 3:拷贝根文件目录的内容到文件系统
清单 3. 拷贝根文件目录统
cp -rp yourRootDir mnt
umount mnt 拷贝完后根文件系统的内容,如图 2 所示:
图 2. 根文件系统内容
步骤 4:完成根文件系统的创建,这时的 rootfs 没有被压缩,接下来我们用工具将其压缩成 Squash 格式的文件系统
mksquashfs-4.1 是在安装 Squash 工具的过程中生成的命令,用于将一个文件夹下的内容打包并压缩成一个文件系统。其后第一个参数为文件夹,第二个参数为生成的文件系统。
清单 4. 创建根文件系统
mkdir squashfs-dir
mv rootfs squshfs-dir
mksquashfs-4.1 squashfs-dir squashRootfs 到这里我们就完成了 Squash 压缩文件系统的创建。接下来我们将讨论如何在 Linux 启动的过程中加载这个压缩文件系统。
加载压缩文件系统所使用的工具
在加载压缩文件系统之前,我们需要确定您的 Linux 内核支持这种文件系统。 Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。
确保在 initrd 中已经集成“”
加载 Squash 压缩文件系统
可读写文件系统原理如图 3 所示:
图 3. 可读写文件系统原理
squashRootfs 里面存储了我们原始的根文件系统,我们在根文件系统中所有的写操作会直接写入 cowfile.out(cow:copy-on-write), 当我们读取根文件系统时,如果读取的内容没有变化,将直接从 squashRootfs 中读取,如果读取的内容被更新过,将从 cowfile.out 中读取。cowfile.out 文件的大小一般要比 squshRootfs 小,如果 cowfile.out 被写满,根文件系统的读写操作将会出错,因此有必要给 cowfile.out 设置一个合理的大小以防止被写满。
由于 rootfs 是被 initrd 加载的,因此我们需要在 initrd 里面加入装载 rootfs 的代码。initrd 整个的执行过程是调用 /sbin/init 这个脚本文件,因此我们在这个脚本的最后加入以下代码逻辑即可。
1. dm-mirror 为 device mapper 工作所需要的驱动&
2. mknod: 创建一些设备文件,参数 1:设备文件名 参数 2:设备类型 参数 3:主设备号 参数 4:次设备号
3. 将 squashRootfs 通过 loop 设备的形式挂载在目录 /realroot/mnt/ 下
4. 将 /realroot/mnt/rootfs 设置为 loop 设备,并和 /dev/loop1 绑定
5. &|&之前的部分是构建 dmsetup 的参数,其中 $(blockdev --getsize /dev/loop1) 表示创建镜像文件的大小,/dev/loop1 /dev/loop2 表示镜像文件是以 /realroot/mnt/rootfs 和 /realroot/mnt/cowfile.out 为蓝本进行创建的(在前面的操作中 loop1 和 loop2 分别进行了绑定操作)
清单 5. 构建可读写文件系统脚本
# 加载驱动 ,参见注释 1 modprobe dm-mirror
# 创建设备 ,参见注释 2 mknod /dev/zero c 1 5
mknod /dev/loop0 b 7 0
mknod /dev/loop1 b 7 1
mknod /dev/loop2 b 7 2
mkdir /dev/cow
mknod /dev/cow/ctl b 241 255
mknod /dev/cow/0 b 241 0
# 挂载 squash 根文件系统,挂载完后您可以在 /realroot/mnt/ 下找到 rootfs 文件 ,参见注释 3 mount /realroot/mnt/squashRootfs /realroot/mnt/ -o loop
# 设置 rootfs 为 loop 设备 ,参见注释 4 losetup /dev/loop1 /realroot/mnt/rootfs
# 创建 cowfile.out 并挂载为 loop 设备,我们将来的写操作都会写入 cowfile.out
dd if=/dev/zero of=/realroot/mnt/cowfile.out bs=2K count=137500
losetup /dev/loop2 /realroot/mnt/cowfile.out
# 将 /realroot/mnt/rootfs 和 /realroot/mnt/cowfile.out 结合起来创建一个逻辑根文件设备,
# 设备文件为 /dev/mapper/root_fs,,参见注释 5 echo &0 $(blockdev --getsize /dev/loop1) snapshot /dev/loop1 /dev/loop2 p 64& |
dmsetup create root_fs
# 将上面创建的逻辑根文件设备 /dev/mapper/root_fs 挂载就可以看到一个可读写的根文件系统
mount /dev/mapper/root_fs /realroot/mnt/Image
# 切换到最终可读写的根文件系统
cd /realroot/mnt/Image
chroot ./sbin/init -i 加下来您就可以看到 rootfs 的所有内容,如图 4 所示:
图 4. 被挂载的根文件系统内容
还可以在这个文件系统中进行写操作,如图 5 所示:
图 5. 根文件系统的写操作
最重要的是 rootfs 没有被拷贝到内存中。
由于篇幅的限制,本文只给出了基本的描述。希望有更一步了解的读者可以通过对以下 linux 命令的学习来深入了解。
构建 Squash 压缩文件系统构所使用的主要命令:
mksquashfs:创建 Squash 压缩文件系统
使用 Squash 压缩文件系统构所使用的主要命令:
mknod:创建 Squash 压缩文件系统
losetup:设置并控制 Loop 设备
chroot:改变根目录
dmsetup:低水平逻辑卷管理
文章出处:微信公众号
Linux挂载Image到根目录实现文件系统可读写的功能(2)
Squash 压缩文件系统的创建
步骤 1:创建空的根文件系统,文件系统的大小为 65536 & /G。接下来我们会在这个空的根文件系统中存放文件。
清单 1. 创建空的根文件系统
dd if=/dev/zero of=rootfs bs=65536 count=24000
mke2fs -F rootfs
步骤 2:挂载空的根文件系统,将 1.5G 的文件系统挂载在 mnt 目录下,然后通过 mnt 目录将内容写入根文件系统。
清单 2. 挂载空的根文件系统
mount rootfs mnt -o loop
步骤 3:拷贝根文件目录的内容到文件系统
清单 3. 拷贝根文件目录统
cp -rp yourRootDir mnt
umount mnt
拷贝完后根文件系统的内容,如图 2 所示:
图 2. 根文件系统内容
步骤 4:完成根文件系统的创建,这时的 rootfs 没有被压缩,接下来我们用工具将其压缩成 Squash 格式的文件系统
清单 4. 创建根文件系统
mkdir squashfs-dir
mv rootfs squshfs-dir
mksquashfs-4.1 squashfs-dir squashRootfs
到这里我们就完成了 Squash 压缩文件系统的创建。接下来我们将讨论如何在 Linux 启动的过程中加载这个压缩文件系统。
下一篇:没有了
其他类似的新闻
● ● ● ● ● ● ● ● ● ●
其他相关的新闻
大家感兴趣的内容
小伙伴最爱的新闻
小伙伴还关注了以下信息
小伙伴关注的焦点
小伙伴都在关注的热门词
Copyright (C) 2006- Inc. All Rights Reserved
孝感风信信息技术有限公司 ● 版权所有}

我要回帖

更多关于 system挂载读写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信