bdev文件系统

注册bdev文件系统

//fs/block_dev.c
static struct file_system_type bd_type = {
        .name           = "bdev",
        .mount          = bd_mount,
        .kill_sb        = kill_anon_super,
};

//init/main.c
start_kernel
    vfs_caches_init
        bdev_cache_init
            register_filesystem(&bd_type);

bdev文件系统只能被内核使用,,用于构造内部数据结构之间的关联。


inode与block_device关系

//fs/block-dev.c
blkdev_open
    //struct block_device *bdev,从inode中取出block_device
    bdev = bd_acquire(inode);
        bdev = bdget(inode->i_rdev);

通过bd_acquire从inode中取出block_device,一个block_device对应/dev/目录下一个设备节点,为什么能从inode中取出block_device,看下面这段代码:

struct bdev_inode {
        struct block_device bdev;
        struct inode vfs_inode;
};

static struct inode *bdev_alloc_inode(struct super_block *sb)
{
        struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL);
        if (!ei)
                return NULL;
        return &ei->vfs_inode;
}

const struct super_operations bdev_sops = {                                              
    .statfs = simple_statfs,
    .alloc_inode = bdev_alloc_inode,
    .destroy_inode = bdev_destroy_inode,
    .drop_inode = generic_delete_inode,
    .evict_inode = bdev_evict_inode,
};

static struct dentry *bd_mount(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data)
{
        return mount_pseudo(fs_type, "bdev:", &bdev_sops, NULL, BDEVFS_MAGIC);
}

static struct file_system_type bd_type = {
        .name           = "bdev",
        .mount          = bd_mount,
        .kill_sb        = kill_anon_super,
};

在super_block的ops->alloc_inode实现函数bdev_alloc_inode中分配的是struct bdev_inode,里面的struct block_device和struct inode是一一对应的。


block_device和gendisk关系

//fs/block_dev.c
blkdev_open
    struct block_device *bdev = bd_acquire(inode);//inode与block_device之间的关系
    blkdev_get(bdev, filp->f_mode, filp);//block_device与gendisk之间的关系
        __blkdev_get(bdev, mode, 0);
            struct gendisk *disk = get_gendisk(bdev->bd_dev, &partno);

对于字符设备,一个物理字符设备由一个cdev表示,所以一个cdev里面内嵌了一个device,
对于块设备,一个物理块设备由一个gendisk表示,所以一个gendisk里面内嵌了一个device,
block_device对应/dev/目录下的一个块设备节点,比如/dev/sda1和/dev/sda2分别对应一个block_device。通过对block_device的访问最终都转换为对对应gendisk的访问。block_device可以有多个,而gendisk只有一个,他包含了对设备的操作的方法。并且hd_struct是gendisk下面用于表示分区的结构体。

### Linux 文件系统类型及其主要区别 #### 1. **Ext 系列文件系统** - **Ext2**: 这是一个早期的 Linux 文件系统,提供了良好的性能,在速度和 CPU 使用率方面表现优异。然而,它缺乏日志功能,因此在意外断电或崩溃后可能需要较长时间进行修复操作[^1]。 - **Ext3**: 它是 Ext2 的升级版本,增加了日志功能,从而提高了数据的安全性和可靠性。即使发生系统崩溃或掉电情况,也能快速恢复文件系统状态[^2]。 - **Ext4**: 目前广泛应用于现代 Linux 发行版中,支持更大的文件大小和分区容量,并引入了一些新特性如延迟分配(delayed allocation)、更快的日志处理机制等,进一步提升了效率与稳定性[^2]。 #### 2. **内存文件系统 (Ramfs 和 Tmpfs)** - **Ramfs**: 属于一种简单的基于 RAM 的文件系统,所有的数据都保存在内存中,这意味着它可以提供极高的读写速度,但由于其不具有任何限制措施,可能会耗尽可用内存资源[^4]。 - **Tmpfs**: 类似 ramfs ,但它允许设定最大尺寸并能将部分内容交换至 swap 分区,这使得 tmpfs 更加灵活且安全可靠。 #### 3. **网络文件系统 (NFS)** 由 SUN 公司开发,旨在通过局域网实现多个客户端之间共享远程服务器上的文件夹内容。对于分布式计算环境非常有用。 #### 4. **Windows 兼容性文件系统** - **VFAT/FAT/NTFS**: 主要是为了兼容微软操作系统而存在的一些选项。虽然它们可以在某些情况下被挂载使用,但对于长期运行或者高负载应用来说并不是最佳选择,因为这些格式通常不具备完整的权限管理模型以及高级错误检测能力[^2]。 #### 5. **特殊用途文件系统** - **Procfs (/proc)**: 提供了一个接口让应用程序能够获取有关进程和其他内核内部结构的信息。这是一个虚拟文件系统,实际上并不占用实际硬盘空间[^4]。 - **Sysfs**: 同样也是虚拟性质的 fs ,专注于暴露关于设备驱动程序配置方面的细节给用户层程序访问。 #### 6. **高性能企业级解决方案** - **XFS**: 初始是由 Silicon Graphics 开发出来的,特别适合处理大规模存储需求的应用场景比如媒体流服务等领域;具备优秀的元数据性能及在线调整卷大小的能力。 - **JFS**: IBM 推出的一个高效日志型 FS ,以其紧凑的设计著称,适用于各种规模的企业部署方案之中[^2]。 - **ReiserFS**: 基于平衡树算法构建而成的新颖设计思路下的产物之一,理论上讲应该能够在小文件密集型工作负荷下表现出色[^2]。 --- ```bash # 示例:查看当前系统支持的所有文件系统类型 cat /proc/filesystems # 输出类似于下面这样: nodev sysfs nodev rootfs nodev bdev nodev proc ... ext3 ext2 tmpfs ramfs ``` --- ### 总结对比表 | 特性 | Ext2 | Ext3 | Ext4 | Ramfs/Tmpfs | NFS | |--------------|-------------|---------------|-----------------|-----------------|---------------| | 日志功能 | ❌ | ✔️ | ✔️ | ❌ | ❌ | | 数据安全性 | 较低 | 高 | 很高 | 极高(仅限内存) | 中等 | | 支持的最大文件大小 | 小 | 大 | 超大 | 不受限 | 取决于远端主机 | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckywang1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值