无忧启动论坛

 找回密码
 注册
搜索
WEPE笔记本电脑手机维修小包 IT发烧友的必备工具最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
无忧启动论坛唯一网址:bbs.wuyou.net系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
楼主: 不点

最简单的 Linux 文件系统是哪个?

  [复制链接]
 楼主| 发表于 2019-3-12 08:36:28 | 显示全部楼层
2011os_defend 发表于 2019-3-11 20:51
同意前辈的看法,xfs更新得算比较频繁,功能也越来越多。

另外ext3对手应该是ntfs吧?

ext2/3/4之类的,属于 Linux/Unix 阵营;FAT/NTFS 类的属于微软阵营。阵营不同,谈不上 “对手”。FAT/NTFS 类的文件系统,只能在 Linux 中作为辅助文件系统,不能作为主文件系统。而 ext2/3/4 在 Linux 中是“主”的地位,但在微软那里,需要下载一个第三方的文件系统驱动程序,才可以支持它,就是说,处于很“次”的地位。当然了,如果讨论纯技术,就某个侧重点来看,或许 ext3 是 NTFS 的对手,我对两者都没研究,不了解这方面的问题。
回复

使用道具 举报

 楼主| 发表于 2019-3-12 09:45:24 | 显示全部楼层
gnuxwy 发表于 2019-3-11 22:38
真氏不懂这些底层文件系统的实现细节,看到不点大师的分析,真的有不明觉厉的感觉。。。

真人不露相,您太客气了。文件系统是旧领域,不是新领域。万事万物,都有一个发展过程。每个发展的阶段,也都有其缺点或局限性,都有改进的余地,都可以加入新的思想在里面。在新思想渗透进去之后,或许也可看成是进入新领域了。

搞技术,就是要不断创新。创新是一个思想,一个思路。如果思想死了、思路断了,那就会说 “创新是找死”。有人说,创新是引领发展的动力,而也有人说,创新是找死。这两种都对。这两种反映的是不同的思想状况和不同的思路。创新是来解决事物发展中的矛盾的,是促进事物发展的。创新需要在一定程度上敢于打破教条,打破某些规范。创新也得保持现有的一些框框和规范,不能全盘否定,走极端。我们可以利用的资源总是有限的,我们在各种资源的利用上,就需要有取舍,有侧重点。需要在磁盘占用率以及访问效率等问题上,进行平衡。从某个角度来看,创新也不过就是权衡而已,通过权衡找到更有利的东西。再抽象一点,这就是哲学了。我们通过学习、研究、思考,来对比不同的文件系统的设计,合理抽取各自的优点,从而构造出一个新的文件系统,这大概也属于正常的思维模式吧,符合一般的科学研究或科学探索的规律(或特征)。还有一点非常重要的,就是,外行可做事。外行,就是门外汉的意思。外行不是不能做事,而是 “可做事”,有事可做。你想做事,就能做。你不想做事,整天到处游玩,那也一天天过去了。而且,有些事,还真得是只有外行才可能去做的,你信不信?他是内行,但由于某种原因,他不干那事。比如有可能是这样的情况:某些事做了白做、没好处,甚至做了反而对他(或他的公司)不利(有坏处),他就不可能去做。为什么各大公司都在免费让你下载他们的 APP 或“客户端”?甚至也有公司用金钱鼓励你下载安装的!那个 APP 客户端,肯定对他们公司有利。我以前在其他地方也经常说,这东西都是流氓,虽然流氓也是 “合理”的。你让这样有钱的公司去开发一个没有后门的 Linux 或者一个藏不住秘密的文件系统?凭啥啊?它怎么会去干呢?它钱多了,可以放火烧了,也不会去干这样的事情的。
回复

使用道具 举报

 楼主| 发表于 2019-3-12 21:06:31 | 显示全部楼层
接上文。

刚才谈到 APP 客户端。微软的系统,不限制任何软件的运行,至少以前是不限制。现在微软也在变化,也在设法限制用户。此处实在无法谈论好和坏。好的东西,如果没人生产它,怎么能好?坏的东西,也不会是绝对的坏,它也有好的一些方面。微软不限制软件的运行,这就让 Windows 成了跑马场,谁都可以上场踢腾。这就是说,微软的开放程度比较高。开放程度高,流氓软件、病毒也就更加泛滥,其中也就包括了 “客户端”。苹果是个封闭的系统,它就不让你随便运行软件。好处是,流氓软件也少。但话又说回来了,那就只剩下苹果自己当流氓了,它自己有完全的自由,想怎么耍你,就怎么耍你。你被完全锁在它的监狱里。失去自由的你,多年以后,显然后悔当初买了苹果。但是,死要面子,硬是说苹果的手机在水泥地上使劲摔也摔不坏,是非常优秀的。Android 比苹果开放,这才占领了苹果的江山。Android 像 Windows 那样,随便可以运行软件,因此,流氓软件也多。但 Android 和 Windows 不同的是,Android 采用权限控制,用户得不到 root 权限,不能更改系统,这样,系统永远可以恢复出厂设置,就不怕死掉了。但缺点是,这跟苹果类似,厂家耍流氓,预装流氓软件,控制用户,盗窃用户资料,泄漏用户秘密,用户只能忍受,毫无办法。 Android 有一半像微软的开放,另一半像苹果的封闭。Android 系统也有彻底死掉的,无法恢复出厂设置。这种情况有可能是用户私自 root 以后造成的,破坏了预装的软件,导致彻底无法恢复。也有可能是预装的流氓软件干的,它有着最高的权限,有能力搞破坏,让系统瘫痪。如果按照常规思维,肯定是微软的“全开放”,对用户更友好吧?可是,全开放以后,跑马场乱糟糟的,流氓病毒太猖狂,用户们通常没有驾驭能力,被耍得筋疲力尽。因此,用户们甘愿被人家 Android 预装软件控制住,反而觉得很省心。所以,后来微软也开始学习 Android 的这种封闭做法了。

点评

牛牛!不点大大!找到了“一般用户为什么傻”的根源, 本来一个菜市场,一些菜贩将它搅乱,导致没人来买菜,都去超市、专卖店了,菜市场的菜贩也只得转行。  详情 回复 发表于 2019-3-13 18:22
回复

使用道具 举报

发表于 2019-3-13 18:22:43 | 显示全部楼层
不点 发表于 2019-3-12 21:06
接上文。

刚才谈到 APP 客户端。微软的系统,不限制任何软件的运行,至少以前是不限制。现在微软也在变 ...

牛牛!不点大大!找到了“一般用户为什么傻”的根源,

本来一个菜市场,一些菜贩将它搅乱,导致没人来买菜,都去超市、专卖店了,菜市场的菜贩也只得转行。

点评

说的没错,有几次去自由市场买菜,本来也不经常去,只是偶然去了几次。结果你猜咋了?他们卖给我的价格,竟然比超市还贵。它这叫自毁市场啊!只要被骗一次,以后再去那里,就有心理障碍了:“一朝被蛇咬,十年怕井绳  详情 回复 发表于 2019-3-13 19:20
回复

使用道具 举报

 楼主| 发表于 2019-3-13 19:20:48 | 显示全部楼层
易广白 发表于 2019-3-13 18:22
牛牛!不点大大!找到了“一般用户为什么傻”的根源,

本来一个菜市场,一些菜贩将它搅乱,导致没人来 ...

说的没错,有几次去自由市场买菜,本来也不经常去,只是偶然去了几次。结果你猜咋了?他们卖给我的价格,竟然比超市还贵。它这叫自毁市场啊!只要被骗一次,以后再去那里,就有心理障碍了:“一朝被蛇咬,十年怕井绳”。还是超市比较可信,俗话说,跑了和尚跑不了庙,它要为它的信誉负责。扯远点,美国讲求 “美国第一”,其实,美国一直都没把别国看得重要,它一直都是 “美国第一”。它现在再来提说 “美国第一”,那口味肯定很重。它现在的 “美国第一”,我理解为要从别国身上 “揩油”,或者说是要欺负别国了,这才是 “美国第一”的实在含义。这样的做法,杀鸡取卵,拿自己的国家信誉进行 “消费”,而且是 “透支”。其实是毁掉这个国家而已。看看以后的继任者会不会沿着这条不归路继续走下去。

点评

去超市没有菜市场自由,而且不够丰富,人情味也少了许多,生活都少了乐趣,这又变成了“城市综合症”。 一些老人家坚持去菜市场,与奸商“斗智斗勇”,象俺们吗?  详情 回复 发表于 2019-3-13 20:10
回复

使用道具 举报

发表于 2019-3-13 20:10:54 | 显示全部楼层
不点 发表于 2019-3-13 19:20
说的没错,有几次去自由市场买菜,本来也不经常去,只是偶然去了几次。结果你猜咋了?他们卖给我的价格, ...

去超市没有菜市场自由,而且不够丰富,人情味也少了许多,生活都少了乐趣,这又变成了“城市综合症”。
一些老人家坚持去菜市场,与奸商“斗智斗勇”,象俺们吗?
回复

使用道具 举报

 楼主| 发表于 2019-3-14 20:42:15 | 显示全部楼层
本帖最后由 不点 于 2019-3-16 16:44 编辑

为方便起见,新的文件系统,暂时就叫做 sefs 吧(意思是 simple and easy file system)。

文件系统的整体结构分两部分:引导区(含 super block 参数)+数据区。整个文件系统的空间,划分成很多簇,每簇的长度固定为 4K。就是说,无论物理扇区大小是 512 字节、2048 字节、还是 4096 字节,每簇都固定为 4096 字节(相当于 8 个 512 字节的小扇区)。第一簇的簇号是 0,作为引导区(含 super block 参数)。引导区也只占这一簇,剩下的都划归数据区。就是说,从簇号 1 开始,直到卷的结尾,就是数据区。FAT 表的位置是灵活的,它不是固定放在开头,而是可以放在任意一片连续的空间中。FAT 表的起始簇号和长度记录在 super block 参数中。根目录的起始簇号也记录在 super block 参数中。根目录的拥有者和权限等,以后再设计。根目录下有两个文件 /.bootblk 和 /.fattbl 分别用来访问引导区和 FAT 表(由 root 用户只读访问;root 用户也不能写)。今后如果需要的话,可以添加 Allocation bitmap,处理方式与 FAT 类似。

以下是 super block(引导扇区) 的初步设计(本帖将会不断修订完善)。

更动记录:2019-03-16 偏移 0E 处添加保留簇数(双字节整数)。保留簇也包括了引导簇在内,用于保存文件系统的一些关键的或辅助的信息。仍用 .bootblk 来表示它。

sefs Boot Sector(设计)
Offset
Size
Description
Comments
0x00
3
JumpBoot
EB ?? 90
0x03
8
FileSystemName
"SEFS"
0x0B
1
BytesPerSectorShift
Power of 2.
Minimum 9 (512 bytes per sector),
maximum 12 (4096 bytes per sector)
0x0C
1
SectorsPerClusterShift
Power of 2.
12 – BytesPerSectorShift, so cluster size is 4 KB
0x0D
1
DriveSelect
Extended INT 13h drive number; typically 0x80
0x0E
2
ReservedClusters
0x10
8
PartitionOffset
In sectors; if 0, shall be ignored
0x18
8
VolumeLength
Size of volume in sectors
0x20
4
FatCluster
FAT start cluster number. FAT must be contiguous
0x24
4
FatLength
In clusters.
0x28
4
Reserved? ClusterHeapOffset
0x2C
4
Reserved
? ClusterCount. 2^32-11 is the maximum number of clusters could be described
0x30
4
RootDirectoryCluster

0x34
4
Reserved? VolumeSerialNumber
0x38
2
Reserved
? FileSystemRevision, as MAJOR.minor, major revision is high byte, minor is low byte; currently 00.00
0x3A
2
Reserved? VolumeFlags * ↓
Offset
Size
Field
0
1
Reserved (no meaning)
1
1
VolumeDirty (0-clean, 1-dirty)
2
1
MediaFailure (0 – no failures reported or they already marked as BAD clusters) 1- some read/write operations failed)
3
1
ClearToZero (no meaning)
4
12
Reserved (no meaning)
0x3C
4
Reserved

0x40
446
BootCode

0x1FE
2
BootSignature
0xAA55
0x200
3584
Reserved


回复

使用道具 举报

 楼主| 发表于 2019-3-15 11:10:20 | 显示全部楼层
(sefs 设计,续上)FAT 就像一个普通文件那样,占据连续的簇号。Allocation bitmap 只是为了加快空闲空间的查找速度的,它处于辅助地位。Allocation bitmap 续尾在连续的 FAT 之后(续尾后,仍是连续的文件,它在根目录项中的文件名是 .fattbl)。Boot sector 中记录了 FAT length,因此,可以定位尾部的 Allocation bitmap 的位置。 在创建文件系统(格式化)时,首先要分配 FAT (连同 Allocation bitmap),通常放在数据区的最开头(就是紧接 boot 簇之后)。当文件系统(卷)需要动态调整其大小的时候,FAT(连同 Allocation bitmap)就可以调整到别的位置了(当然仍须保持连续)。接着要分配根目录。根目录项中的第一个有效条目,记录着根目录自己的拥有者、权限等信息(相应于 inode 结构里面的信息),当然,其中有一条信息是指示根目录自己的起始簇号(指向它现在的位置)。一般的目录文件的具体结构,以后再设计。但大致上可以确定,目录文件开头有个信息区域,指示该目录的一些属性。接着才是目录项的各个条目。安全起见,.bootblk 和 .fattbl 也可以放在一个子目录中(比如叫做 .fsstruct),子目录设置为不可进入,不可读写。
回复

使用道具 举报

 楼主| 发表于 2019-3-15 15:16:55 | 显示全部楼层
看看 kernel 里一般化的 inode 结构:
  1. /*
  2. * Keep mostly read-only and often accessed (especially for
  3. * the RCU path lookup and 'stat' data) fields at the beginning
  4. * of the 'struct inode'
  5. */
  6. struct inode {
  7.         umode_t                        i_mode;
  8.         unsigned short                i_opflags;
  9.         kuid_t                        i_uid;
  10.         kgid_t                        i_gid;
  11.         unsigned int                i_flags;

  12. #ifdef CONFIG_FS_POSIX_ACL
  13.         struct posix_acl        *i_acl;
  14.         struct posix_acl        *i_default_acl;
  15. #endif

  16.         const struct inode_operations        *i_op;
  17.         struct super_block        *i_sb;
  18.         struct address_space        *i_mapping;

  19. #ifdef CONFIG_SECURITY
  20.         void                        *i_security;
  21. #endif

  22.         /* Stat data, not accessed from path walking */
  23.         unsigned long                i_ino;
  24.         /*
  25.          * Filesystems may only read i_nlink directly.  They shall use the
  26.          * following functions for modification:
  27.          *
  28.          *    (set|clear|inc|drop)_nlink
  29.          *    inode_(inc|dec)_link_count
  30.          */
  31.         union {
  32.                 const unsigned int i_nlink;
  33.                 unsigned int __i_nlink;
  34.         };
  35.         dev_t                        i_rdev;
  36.         loff_t                        i_size;
  37.         struct timespec64        i_atime;
  38.         struct timespec64        i_mtime;
  39.         struct timespec64        i_ctime;
  40.         spinlock_t                i_lock;        /* i_blocks, i_bytes, maybe i_size */
  41.         unsigned short          i_bytes;
  42.         u8                        i_blkbits;
  43.         u8                        i_write_hint;
  44.         blkcnt_t                i_blocks;

  45. #ifdef __NEED_I_SIZE_ORDERED
  46.         seqcount_t                i_size_seqcount;
  47. #endif

  48.         /* Misc */
  49.         unsigned long                i_state;
  50.         struct rw_semaphore        i_rwsem;

  51.         unsigned long                dirtied_when;        /* jiffies of first dirtying */
  52.         unsigned long                dirtied_time_when;

  53.         struct hlist_node        i_hash;
  54.         struct list_head        i_io_list;        /* backing dev IO list */
  55. #ifdef CONFIG_CGROUP_WRITEBACK
  56.         struct bdi_writeback        *i_wb;                /* the associated cgroup wb */

  57.         /* foreign inode detection, see wbc_detach_inode() */
  58.         int                        i_wb_frn_winner;
  59.         u16                        i_wb_frn_avg_time;
  60.         u16                        i_wb_frn_history;
  61. #endif
  62.         struct list_head        i_lru;                /* inode LRU list */
  63.         struct list_head        i_sb_list;
  64.         struct list_head        i_wb_list;        /* backing dev writeback list */
  65.         union {
  66.                 struct hlist_head        i_dentry;
  67.                 struct rcu_head                i_rcu;
  68.         };
  69.         atomic64_t                i_version;
  70.         atomic_t                i_count;
  71.         atomic_t                i_dio_count;
  72.         atomic_t                i_writecount;
  73. #ifdef CONFIG_IMA
  74.         atomic_t                i_readcount; /* struct files open RO */
  75. #endif
  76.         const struct file_operations        *i_fop;        /* former ->i_op->default_file_ops */
  77.         struct file_lock_context        *i_flctx;
  78.         struct address_space        i_data;
  79.         struct list_head        i_devices;
  80.         union {
  81.                 struct pipe_inode_info        *i_pipe;
  82.                 struct block_device        *i_bdev;
  83.                 struct cdev                *i_cdev;
  84.                 char                        *i_link;
  85.                 unsigned                i_dir_seq;
  86.         };

  87.         __u32                        i_generation;

  88. #ifdef CONFIG_FSNOTIFY
  89.         __u32                        i_fsnotify_mask; /* all events this inode cares about */
  90.         struct fsnotify_mark_connector __rcu        *i_fsnotify_marks;
  91. #endif

  92. #if IS_ENABLED(CONFIG_FS_ENCRYPTION)
  93.         struct fscrypt_info        *i_crypt_info;
  94. #endif

  95.         void                        *i_private; /* fs or device private pointer */
  96. } __randomize_layout;

复制代码
回复

使用道具 举报

 楼主| 发表于 2019-3-15 15:25:15 | 显示全部楼层
这是 ext4 的 inode:
  1. /*
  2. * Structure of an inode on the disk
  3. */
  4. struct ext4_inode {
  5.         __le16        i_mode;                /* File mode */
  6.         __le16        i_uid;                /* Low 16 bits of Owner Uid */
  7.         __le32        i_size_lo;        /* Size in bytes */
  8.         __le32        i_atime;        /* Access time */
  9.         __le32        i_ctime;        /* Inode Change time */
  10.         __le32        i_mtime;        /* Modification time */
  11.         __le32        i_dtime;        /* Deletion Time */
  12.         __le16        i_gid;                /* Low 16 bits of Group Id */
  13.         __le16        i_links_count;        /* Links count */
  14.         __le32        i_blocks_lo;        /* Blocks count */
  15.         __le32        i_flags;        /* File flags */
  16.         union {
  17.                 struct {
  18.                         __le32  l_i_version;
  19.                 } linux1;
  20.                 struct {
  21.                         __u32  h_i_translator;
  22.                 } hurd1;
  23.                 struct {
  24.                         __u32  m_i_reserved1;
  25.                 } masix1;
  26.         } osd1;                                /* OS dependent 1 */
  27.         __le32        i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
  28.         __le32        i_generation;        /* File version (for NFS) */
  29.         __le32        i_file_acl_lo;        /* File ACL */
  30.         __le32        i_size_high;
  31.         __le32        i_obso_faddr;        /* Obsoleted fragment address */
  32.         union {
  33.                 struct {
  34.                         __le16        l_i_blocks_high; /* were l_i_reserved1 */
  35.                         __le16        l_i_file_acl_high;
  36.                         __le16        l_i_uid_high;        /* these 2 fields */
  37.                         __le16        l_i_gid_high;        /* were reserved2[0] */
  38.                         __le16        l_i_checksum_lo;/* crc32c(uuid+inum+inode) LE */
  39.                         __le16        l_i_reserved;
  40.                 } linux2;
  41.                 struct {
  42.                         __le16        h_i_reserved1;        /* Obsoleted fragment number/size which are removed in ext4 */
  43.                         __u16        h_i_mode_high;
  44.                         __u16        h_i_uid_high;
  45.                         __u16        h_i_gid_high;
  46.                         __u32        h_i_author;
  47.                 } hurd2;
  48.                 struct {
  49.                         __le16        h_i_reserved1;        /* Obsoleted fragment number/size which are removed in ext4 */
  50.                         __le16        m_i_file_acl_high;
  51.                         __u32        m_i_reserved2[2];
  52.                 } masix2;
  53.         } osd2;                                /* OS dependent 2 */
  54.         __le16        i_extra_isize;
  55.         __le16        i_checksum_hi;        /* crc32c(uuid+inum+inode) BE */
  56.         __le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
  57.         __le32  i_mtime_extra;  /* extra Modification time(nsec << 2 | epoch) */
  58.         __le32  i_atime_extra;  /* extra Access time      (nsec << 2 | epoch) */
  59.         __le32  i_crtime;       /* File Creation time */
  60.         __le32  i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
  61.         __le32  i_version_hi;        /* high 32 bits for 64-bit version */
  62.         __le32        i_projid;        /* Project ID */
  63. };
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2019-9-22 02:09

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表