0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何学习Linux的文件系统

xCb1_yikoulinux 来源:一口Linux 作者:一口Linux 2022-07-21 14:42 次阅读

文件系统

概述

提到文件系统,Linux的老江湖们对这个概念当然不会陌生,然而刚接触Linux的新手们就会被文件系统这个概念弄得晕头转向,恰好我当年正好属于后者。

windows下转到Linux的童鞋听到最多的应该是fat32ntfs(在windows 2000之后所出现的一种新型的日志文件系统),那个年代经常听到说“我要把C盘格式化成ntfs格式,D盘格式化成fat32格式”。

一到Linux下,很多入门Linux的书籍中当牵扯到文件系统这个术语时,二话不说,不管三七二十一就给出了下面这个图,然后逐一解释一下每个目录是拿来干啥的、里面会放什么类型的文件就完事儿了,弄得初学者经常“丈二和尚摸不着头脑”。

f7ecb8fa-08a7-11ed-ba43-dac502259ad0.jpg

本文的目的就是和大家分享一下我当初是如何学习Linux的文件系统的,也算是一个“老”油条的一些心得吧。

文件系统”的主语是“文件”,那么文件系统的意思就是“用于管理文件的(管理)系统”,在大多数操作系统教材里,“文件是数据的集合”这个基本点是一致的,而这些数据最终都是存储在存储介质里,如硬盘、光盘、U盘等。

另一方面,用户在管理数据时也是文件为基本单位,他们所关心的问题是:

  • • 1.我的文件在什么地方放着?

  • • 2.我如何将数据存入某个文件?

  • • 3.如何从文件里将数据读出来?

  • • 4.不再需要的文件怎么将其删除?

简而言之,文件系统就是一套用于定义文件的命名和组织数据的规范,其根本目的是便对文件进行查询和存取。

虚拟文件系统VFS

在Linux早期设计阶段,文件系统与内核代码是整合在一起的,这样做的缺点是显而易见的。假如,我的系统只能识别ext3格式的文件系统,我的U盘是fat32格式,那么很不幸的是我的U盘将不会被我的系统所识别,

为了支持不同种类的文件系统,Linux采用了在Unix系统中已经广泛采用的设计思想,通过虚拟文件系统VFS屏蔽下层各种不同类型文件系统的实现细节和差异。

其实VFS最早是由Sun公司提出的,其基本思想是将各种文件系统的公共部分抽取出来,形成一个抽象层。对用户的应用程序而言,VFS提供了文件系统的系统调用接口。而对具体的文件系统来说,VFS通过一系列统一的外部接口屏蔽了实现细节,使得对文件的操作不再关心下层文件系统的类型,更不用关心具体的存储介质,这一切都是透明的。

ext2文件系统

虚拟文件系统VFS是对各种文件系统的一个抽象层,抽取其共性,以便对外提供统一管理接口,便于内核对不同种类的文件系统进行管理。那么首先我们得看一下对于一个具体的文件系统,我们该关注重点在哪里。

对于存储设备(以硬盘为例)上的数据,可分为两部分:

  • 用户数据:存储用户实际数据的部分;

  • 管理数据:用于管理这些数据的部分,这部分我们通常叫它元数据(metadata)。

我们今天要讨论的就是这些元数据。这里有个概念首先需要明确一下:块设备。所谓块设备就是以块为基本读写单位的设备,支持缓冲和随机访问。每个文件系统提供的mk2fs.xx工具都支持在构建文件系统时由用户指定块大小,当然用户不指定时会有一个缺省值。

我们知道一般硬盘的每个扇区512字节,而多个相邻的若干扇区就构成了一个,从文件系统的角度看这个簇对应的就是我们这里所说块。用户从上层下发的数据首先被缓存在块设备的缓存里,当写满一个块时数据才会被发给硬盘驱动程序将数据最终写到存储介质上。如果想将设备缓存中数据立即写到存储介质上可以通过sync命令来完成。

块越大存储性能越好,但浪费比较严重;块越小空间利用率较高,但性能相对较低。如果你不是专业的“骨灰级”玩儿家,在存储设备上构建文件系统时,块大小就用默认值。通过命令“tune2fs -l /dev/sda1”可以查看该存储设备上文件系统所使用的块大小:

[root@localhost~]#tune2fs-l/dev/sda1
tune2fs1.39(29-May-2006)
Filesystemvolumename:/boot
Lastmountedon:
FilesystemUUID:6ade5e49-ddab-4bf1-9a45-a0a742995775
Filesystemmagicnumber:0xEF53
Filesystemrevision#:1(dynamic)
Filesystemfeatures:has_journalext_attrresize_inodedir_indexfiletypeneeds_recoverysparse_super
Defaultmountoptions:user_xattracl
Filesystemstate:clean
Errorsbehavior:Continue
FilesystemOStype:Linux
Inodecount:38152
Blockcount:152584
Reservedblockcount:7629
Freeblocks:130852
Freeinodes:38111
Firstblock:1
Blocksize:1024
Fragmentsize:1024
ReservedGDTblocks:256
Blockspergroup:8192
Fragmentspergroup:8192
Inodespergroup:2008
Inodeblockspergroup:251
Filesystemcreated:ThuDec1300:42:522012
Lastmounttime:TueNov2010:35:282012
Lastwritetime:TueNov2010:35:282012
Mountcount:12
Maximummountcount:-1
Lastchecked:ThuDec1300:42:522012
Checkinterval:0()
Reservedblocksuid:0(userroot)
Reservedblocksgid:0(grouproot)
Firstinode:11
Inodesize:128
Journalinode:8
Defaultdirectoryhash:tea
DirectoryHashSeed:72070587-1b60-42de-bd8b-a7b7eb7cbe63
Journalbackup:inodeblocks

该命令已经暴露了文件系统的很多信息,接下我们将详细分析它们。

下图是我的虚拟机的情况,三块IDE的硬盘。容量分别是:

hda: 37580963840/(102410241024)=35GB
hdb: 8589934592/(102410241024)=8GB
hdd: 8589934592/(102410241024)=8GB

f8041f7c-08a7-11ed-ba43-dac502259ad0.jpg

如果这是三块实际的物理硬盘的话,厂家所标称的容量就分别是37.5GB、8.5GB和8.5GB。可能有些童鞋觉得虚拟机有点“假”,那么我就来看看实际硬盘到底是个啥样子。

主角1:西部数据 500G SATA接口 CentOS 5.5

实际容量:500107862016B = 465.7GB

f82376ec-08a7-11ed-ba43-dac502259ad0.jpg

主角2:希捷 160G SCSI接口 CentOS 5.5

实际容量:160041885696B=149GB

f833850a-08a7-11ed-ba43-dac502259ad0.jpg

大家可以看到,VMware公司的水平还是相当不错的,虚拟硬盘和物理硬盘“根本”看不出差别,毕竟属于云平台基础架构支撑者的风云人物嘛。

以硬盘/dev/hdd1为例,它是我新增的一块新盘,格式化成ext2后,根目录下只有一个lost+found目录,让我们来看一下它的布局情况,以此来开始我们的文件系统之旅。

f84a0afa-08a7-11ed-ba43-dac502259ad0.jpg

对于使用了ext2文件系统的分区来说,有一个叫superblock的结构superblock的大小为1024字节,其实ext3的superblock也是1024字节。下面的小程序可以证明这一点

#include
#include
#include

intmain(intargc,char**argv){
printf("sizeofofext2superblock=%d
",sizeof(structext2_super_block));
printf("sizeofofext3superblock=%d
",sizeof(structext3_super_block));
return0;
}

******************【运行结果】******************
sizeofofext2superblock=1024
sizeofofext3superblock=1024

盘的第一个字节是从0开始编号,所以第一个字节是byte0,以此类推。/dev/hdd1分区头部的1024个字节(从byte0~byte1023)都用0填充,因为/dev/hdd1不是主引导盘。superblock是从byte1024开始,占1024B存储空间。我们用dd命令把superblock的信息提取出来

dd if=/dev/hdd1 of=./hdd1sb bs=1024 skip=1 count=1

上述命令将从/dev/hdd1分区的byte1024处开始,提取1024个字节的数据存储到当前目录下的hdd1sb文件里,该文件里就存储了我们superblock的所有信息,上面的程序稍加改造,我们就可以以更直观的方式看到superblock的输出了如下:

#include
#include
#include
#include
#include
#include
#include
#include

intmain(intargc,char**argv){
printf("sizeofofext2superblock=%d
",sizeof(structext2_super_block));
printf("sizeofofext3superblock=%d
",sizeof(structext3_super_block));
charbuf[1024]={0};
intfd=-1;
structext2_super_blockhdd1sb;
memset(&hdd1sb,0,1024);

if(-1==(fd=open("./hdd1sb",O_RDONLY,0777))){
printf("openfileerror!
");
return1;
}

if(-1==read(fd,buf,1024)){
printf("readerror!
");
close(fd);
return1;
}

memcpy((char*)&hdd1sb,buf,1024);
printf("inodecount:%ld
",hdd1sb.s_inodes_count);
printf("blockcount:%ld
",hdd1sb.s_blocks_count);
printf("Reservedblockscount:%ld
",hdd1sb.s_r_blocks_count);
printf("Freeblockscount:%ld
",hdd1sb.s_free_blocks_count);
printf("Freeinodescount:%ld
",hdd1sb.s_free_inodes_count);
printf("FirstDataBlock:%ld
",hdd1sb.s_first_data_block);
printf("Blocksize:%ld
",1<<(hdd1sb.s_log_block_size+10));
printf("Fragmentsize:%ld
",1<<(hdd1sb.s_log_frag_size+10));
printf("Blockspergroup:%ld
",hdd1sb.s_blocks_per_group);
printf("Fragmentspergroup:%ld
",hdd1sb.s_frags_per_group);
printf("Inodespergroup:%ld
",hdd1sb.s_inodes_per_group);
printf("Magicsignature:0x%x
",hdd1sb.s_magic);
printf("sizeofinodestructure:%d
",hdd1sb.s_inode_size);
close(fd);
return0;
}

******************【运行结果】******************
inodecount:1048576
blockcount:2097065
Reservedblockscount:104853
Freeblockscount:2059546
Freeinodescount:1048565
FirstDataBlock:0
Blocksize:4096
Fragmentsize:4096
Blockspergroup:32768
Fragmentspergroup:32768
Inodespergroup:16384
Magicsignature:0xef53
sizeofinodestructure:128

可以看出,superblock的作用就是记录文件系统的类型、block大小、block总数、inode大小、inode总数、group的总数等信息。

对于ext2/ext3文件系统来说数字签名Magic signature都是0xef53,如果不是那么它一定不是ext2/ext3文件系统。这里我们可以看到,我们的/dev/hdd1确实是ext2文件系统类型。hdd1中一共包含1048576个inode节点(inode编号从1开始),每个inode节点大小为128字节,所有inode消耗的存储空间是1048576×128=128MB;总共包含2097065个block,每个block大小为4096字节,每32768个block组成一个group,所以一共有2097065/32768=63.99,即64个group(group编号从0开始,即Group0~Group63)。所以整个/dev/hdd1被划分成了64个group,详情如下:

f8606124-08a7-11ed-ba43-dac502259ad0.jpg

用命令tune2fs可以验证我们之前的分析:

f875fab6-08a7-11ed-ba43-dac502259ad0.jpg

再通过命令dumpe2fs /dev/hdd1的输出,可以得到我们关注如下部分:

f89d967a-08a7-11ed-ba43-dac502259ad0.jpg

接下来以Group0为例,主superblock在Group0的block0里,根据前面的分析,我们可以画出主superblock在block0中的位置如下:

f8afce6c-08a7-11ed-ba43-dac502259ad0.jpg

因为superblock是如此之重要,一旦它出错你的整个系统就玩儿完了,所以文件系统中会存在磁盘的多个不同位置会存在主superblock的备份副本,一旦系统出问题后还可以通过备份的superblock对文件系统进行修复。

第一版ext2文件系统的实现里,每个Group里都存在一份superblock的副本,然而这样做的负面效果也是相当明显,那就是严重降低了磁盘的空间利用率。所以在后续ext2的实现代码中,选择用于备份superblock的Group组号的原则是3的N次方、5的N次方、7的N次方其中N=0,1,2,3…。根据这个公式我们来计算一下/dev/hdd1中备份有supeblock的Group号:

f8c8d2a4-08a7-11ed-ba43-dac502259ad0.png

也就是说Group1、3、5、7、9、25、27、49里都保存有superblock的拷贝,如下:

f8db454c-08a7-11ed-ba43-dac502259ad0.jpg

用block号分别除以32768就得到了备份superblock的Group号,和我们在上面看到的结果一致。我们来看一下/dev/hdd1中Group和block的关系:

f8f2ecec-08a7-11ed-ba43-dac502259ad0.jpg

从上图中我们可以清晰地看出在使用了ext2文件系统的分区上,包含有主superblock的Group、备份superblock的Group以及没有备份superblock的Group的布局情况。存储了superblock的Group中有一个组描述符(Group descriptors)紧跟在superblock所在的block后面,占一个block大小;同时还有个Reserved GDT跟在组描述符的后面。

Reserved GDT的存在主要是支持ext2文件系统的resize功能,它有自己的inode和data block,这样一来如果文件系统动态增大,Reserved GDT就正好可以腾出一部分空间让Group descriptor向下扩展。

【底层原理】彻底理解Linux文件系统(二)

superblock,inode,block,group,group descriptor,block bitmap,inode table

下面我们来认识一下superblock,inode,block,group,group descriptor,block bitmap,inode table这些家伙。

superblock

这个东西确实很重要,前面我们已经见识过。为此,文件系统还特意精挑细选的找了N多后备Group,在这些Group中都存有superblock的副本,你就知道它有多重要了。

说白了,superblock 的作用就是记录文件系统的类型、block大小、block总数、inode大小、inode总数、group的总数等等。

group descriptors

千万不要以为这就是一个组描述符,看到descriptor后面加了个s就知道这是N多描述符的集合。确实,这是文件系统中所有group的描述符所构成的一个数组,它的结构定义在include/linux/ext2_fs.h中:

//Structureofablocksgroupdescriptor
structext2_group_desc
{
__le32bg_block_bitmap;/*group中blockbitmap所在的第一个block号*/
__le32bg_inode_bitmap;/*group中inodebitmap所在的第一个block号*/
__le32bg_inode_table;/*group中inodestable所在的第一个block号*/
__le16bg_free_blocks_count;/*group中空闲的block总数*/
__le16bg_free_inodes_count;/*group中空闲的inode总数*/
__le16bg_used_dirs_count;/*目录数*/
__le16bg_pad;
__le32bg_reserved[3];
};

下面的程序可以帮助了解一下/dev/hdd1中所有group的descriptor的详情:

#defineB_LEN32//一个struct ext2_group_desc{}占固定32字节
intmain(intargc,char**argv){
charbuf[B_LEN]={0};
inti=0,fd=-1;
structext2_group_descgd;
memset(&gd,0,B_LEN);

if(-1==(fd=open(argv[1],O_RDONLY,0777))){
printf("openfileerror!
");
return1;
}

while(i<64){//因为我已经知道了/dev/hdd1中只有64个group
if(-1==read(fd,buf,B_LEN)){
printf("readerror!
");
close(fd);
return1;
}

memcpy((char*)&gd,buf,B_LEN);
printf("==========Group%d:==========
",i);
printf("Blocksbitmapblock%ld
",gd.bg_block_bitmap);
printf("Inodesbitmapblock%ld
",gd.bg_inode_bitmap);
printf("Inodestableblock%ld
",gd.bg_inode_table);
printf("Freeblockscount%d
",gd.bg_free_blocks_count);
printf("Freeinodescount%d
",gd.bg_free_inodes_count);
printf("Directoriescount%d
",gd.bg_used_dirs_count);

memset(buf,0,B_LEN);
i++;
}

close(fd);
return0;
}

运行结果和dumpe2fs /dev/hdd1的输出对比如下:
f8ffc0ac-08a7-11ed-ba43-dac502259ad0.jpg其中,文件gp0decp是由命令“dd if=/dev/hdd1 of=./gp0decp bs=4096 skip=1 count=1”生成。每个group descriptor里记录了该group中的inode table的起始block号,因为inode table有可能会占用连续的多个block;空闲的block、inode数等等。

block bitmap:

在文件系统中每个对象都有一个对应的inode节点(这句话有些不太准确,因为符号链接和它的目标文件共用一个inode),里存储了一个对象(文件或目录)的信息有权限、所占字节数、创建时间、修改时间、链接数、属主ID、组ID,如果是文件的话还会包含文件内容占用的block总数以及block号。inode是从1编号,这一点不同于block。

需要格外注意。另外,/dev/hdd1是新挂载的硬盘,格式化成ext2后并没有任何数据,只有一个lost+found目录。接下来我们用命令“dd if=/dev/hdd1 of=./gp0 bs=4096 count=32768”将Group0里的所有数据提取出来。

前面已经了解了Group0的一些基本信息如下:

Group0:(Blocks0-32767)
Primarysuperblockat0,Groupdescriptorsat1-1
ReservedGDTblocksat2-512
Blockbitmapat513(+513),Inodebitmapat514(+514)
Inodetableat515-1026(+515)
31739freeblocks,16374freeinodes,1directories#包含一个目录
Freeblocks:1028-1031,1033-32767#一共有31739个空闲block
Freeinodes:11-16384#一共有16374个空闲inode

一个block bitmap占用一个block大小,而block bitmap中每个bit表示一个对应block的占用情况,0表示对应的block为空,为1表示相应的block中存有数据。在/dev/hdd1中,一个group里最多只能包含8×4096=32768个block,这一点我们已经清楚了。接下来我们来看一下Group0的block bitmap,如下:
f90dae4c-08a7-11ed-ba43-dac502259ad0.jpg发现block bitmap的前128字节和第129字节的低4位都为1,说明发现Group0中前128×8+4=1028个block,即block0block1027都已被使用了。第129字节的高4位为0,表示block1028block1031四个block是空闲的;第130字节的最低位是1,说明block1032被占用了;从block1033~block32767的block bitmap都是0,所以这些block都是空闲的,和上表输出的结果一致。

inode bitmap

和block bitmap类似,innode bitmap的每个比特表示相应的inode是否被使用。Group0的inode bitmap如下:
f91e1b7e-08a7-11ed-ba43-dac502259ad0.jpg/dev/hdd1里inode总数为1048576,要被均分到64个Group里,所以每个Group中都包含了16384个inode。要表示每个Group中16384个inode,inode bitmap总共需要使用2048(16384/8)字节。inode bitmap本身就占据了一个block,所以它只用到了该block中的前2048个字节,剩下的2048字节都被填充成1,如上图所示。

我们可以看到Group0中的inode bitmap前两个字节分别是ff和03,说明Group0里的前11个inode已经被使用了。其中前10个inode被ext2预留起来,第11个inode就是lost+found目录,如下:
f92870b0-08a7-11ed-ba43-dac502259ad0.jpg

inode table

那么每个Group中的所有inode到底存放在哪里呢?答案就是inode table。它是每个Group中所有inode的聚合地。

因为一个inode占128字节,所以每个Group里的所有inode共占16384×128=2097152字节,总共消耗了512个block。Group的group descriptor里记录了inode table的所占block的起始号,所以就可以唯一确定每个Group里inode table所在的block的起始号和结束号了。inode的结构如下:
f939e1d8-08a7-11ed-ba43-dac502259ad0.jpg这里我们主要关注的其中的数据block指针部分。前12个block指针直接指向了存有数据的block号;第13个block指针所指向的block中存储的并不是数据而是由其他block号,这些block号所对应的block里存储的才是真正的数据,即所谓的两级block指针;第14个block为三级block指针;第15个block为四级block指针。最后效果图如下:
f941a95e-08a7-11ed-ba43-dac502259ad0.jpg一个block为4096字节,每个块指针4字节,所以一个block里最多可以容纳4096/4=1024个block指针,我们可以计算出一个inode最大能表示的单个文件的最大容量如下:

直接block指针(字节) 两级block指针(字节) 三 级block指针(字节) 四 级block指针(字节) 单个文件的最大容量(字节)
12×409 4096/4×4096 40962/4×4096 40963/4×4096 4TB

所以,我们可以得出不同block大小,对单个文件最大容量的影响。假设block大小为X字节,则:

f961f434-08a7-11ed-ba43-dac502259ad0.jpg

如下表所示:

block大小(字节) 单个文件容量(字节)
1024 17247240192字节(16GB)
2048 275415826432字节(256GB)
4096 4402345672704字节(4TB)

最后来一张全家福:

f96dfd42-08a7-11ed-ba43-dac502259ad0.jpg

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206733
  • 文件系统
    +关注

    关注

    0

    文章

    273

    浏览量

    19672

原文标题:【底层原理】彻底理解Linux文件系统(二)

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux系统如何扩展文件系统

    当数据盘没有创建分区,只在设备上创建了文件系统。或者格式化了硬盘,就直接mount上系统使用。
    的头像 发表于 02-21 09:53 449次阅读

    如何配置只读属性的文件系统(Colibri iMX7为例)

    由于存储介质不同,Nand Flash 上通常采用如 jffs2、UBI 等格式文件系统。Toradex 的 Linux 系统使用 UBI 文件系统
    的头像 发表于 12-07 09:31 581次阅读
    如何配置只读属性的<b class='flag-5'>文件系统</b>(Colibri iMX7为例)

    Linux文件系统层的主要结构

    Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件
    的头像 发表于 11-10 10:37 265次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>层的主要结构

    Linux文件系统特点

    Linux文件系统特点 文件系统要有严格的组织形式,使得文件能够以块为单位进行存储。 文件系统中也要有索引区,用来方便查找一个
    的头像 发表于 11-09 14:48 482次阅读
    <b class='flag-5'>Linux</b>的<b class='flag-5'>文件系统</b>特点

    移植Linux内核ramfs和ramdisk文件系统

    在移植Linux内核早期时,如果flash等存储设备的驱动还没写好,可以将文件系统放到内存中运行。 此时可以使用 ramfs 和 ramdisk ,即将内存的一部分用作文件系统。 ramfs
    的头像 发表于 10-04 14:41 583次阅读
    移植<b class='flag-5'>Linux</b>内核ramfs和ramdisk<b class='flag-5'>文件系统</b>

    谈谈什么是文件系统 文件系统的功能与特点

    文件系统的应用非常广泛,同时种类也是特别的多,并且不同平台也会使用不同性能和特点的文件系统,比如查找效率、数据安全等级等等,如下面windows使用的NTFS:
    发表于 08-30 09:50 1445次阅读
    谈谈什么是<b class='flag-5'>文件系统</b> <b class='flag-5'>文件系统</b>的功能与特点

    Linux虚拟文件系统的基础知识

    虚拟文件系统是一个很庞大的架构,如果要分析的面面俱到,会显得特别复杂而笨拙,让人看着看着,就不知所云了(当然主要还是笔者太菜),所以这篇博客,以 open() 函数为切入点,来试着分析分析VFS文件系统的运转机理,本文的代码来源于 li
    发表于 08-25 12:17 168次阅读
    <b class='flag-5'>Linux</b>虚拟<b class='flag-5'>文件系统</b>的基础知识

    适用于Linux的最佳通用文件系统 Linux文件系统的安装

    为您的计算机选择正确的文件系统可能是一个困难的过程。您可能会想知道:为什么文件系统很重要?有没有适用于安装 Linux 的特定文件系统? 事实证明,有两种
    发表于 08-03 10:22 191次阅读
    适用于<b class='flag-5'>Linux</b>的最佳通用<b class='flag-5'>文件系统</b> <b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>的安装

    学习Linux,得从Linux系统结构开始吧!

    Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户
    的头像 发表于 07-09 16:18 288次阅读
    要<b class='flag-5'>学习</b><b class='flag-5'>Linux</b>,得从<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>结构开始吧!

    FATFS文件系统原版文件下载

    FATFS文件系统原版文件下载
    发表于 06-25 09:02 0次下载

    Linux 文件系统层的主要结构

    Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件
    的头像 发表于 06-22 11:48 696次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>文件系统</b>层的主要结构

    嵌入式Linux入门(二、Linux文件系统文件类型及权限管理)

    嵌入式 Linux入 门第二课, linux 文件系统文件类型及权限管理。 ...... 矜辰所致
    的头像 发表于 06-20 11:44 1596次阅读
    嵌入式<b class='flag-5'>Linux</b>入门(二、<b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>、<b class='flag-5'>文件</b>类型及权限管理)

    Linux proc文件系统详解

    上一篇:《文件系统有很多,但这几个最为重要》介绍了procfs(进程文件系统的缩写),包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个
    发表于 06-15 11:42 778次阅读

    Linux平台/proc虚拟文件系统详解

    Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统(即虚拟文件
    发表于 06-08 10:49 1080次阅读
    <b class='flag-5'>Linux</b>平台/proc虚拟<b class='flag-5'>文件系统</b>详解

    Linux系统中根文件系统构建基本方式

    嵌入式 Linux文件系统布局,建议还是按照FHS标准来安排,事实上大多数嵌入式Linux都是这样做的。但是,嵌入式系统可能并不需要桌面/服务器那样庞大
    发表于 05-09 09:30 568次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>系统</b>中根<b class='flag-5'>文件系统</b>构建基本方式