AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[block-device](unix)

Martin Hope
J-Cake
Asked: 2024-04-24 00:48:47 +0800 CST

在 FUSE 文件系统上格式化块设备时的 EPERM

  • 11

长话短说

尝试在我的 FUSE 文件系统上格式化块设备EPERM在open系统调用时失败。权限设置为777,必要的ioctls 被存根,但 FUSE 处理程序中不会打印任何日志。

背景

我正在编写一个程序来创建虚拟磁盘映像。我的标准之一是它必须能够以零超级用户访问权限运行,这意味着我无法安装环回设备、更改文件所有者甚至编辑/etc/fuse.conf。出于这个原因,我的方法最终变得相当冗长。具体来说,为了格式化磁盘上的各个分区,我希望能够使用系统工具,因为这为我提供了更大范围的可能文件系统。这涉及将VDisk上的各个分区作为块设备暴露给系统。然而,我发现的所有可能的方法都需要nbds 或环回设备。两者都需要超级用户访问权限。

自己实现FUSE

然而,在 FUSE 中实现块设备不仅是可能的,而且是受支持的。不幸的是,我无法找到关于此事的太多文档,而且由于我是在 Rust 中完成所有这些工作,因此相关文档更加稀缺。

我已经实现了以下 FUSE 方法:

  • init
  • lookup
  • getattr
  • open
  • read
  • write
  • readdir
  • ioctl
    • BLKGETSIZE
    • BLKFLSBUF
    • BLKSSZGET

我可以列出文件系统的内容并获取目录/文件信息。我故意忽略创建或修改资源的方法,因为这是通过构建过程完成的。

错误

如前所述,我收到权限被拒绝( EPERM) 错误。strace调用该mkfs调用表明对open块设备的调用在内核端失败。完整strace结果。

execve("/usr/sbin/mkfs.fat", ["mkfs.fat", "out/partitions/EFI"], 0x7ffd42f64ab8 /* 76 vars */) = 0

    --- snip ---

openat(AT_FDCWD, "out/partitions/EFI", O_RDWR|O_EXCL) = -1 EACCES (Permission denied)
write(2, "mkfs.fat: unable to open out/par"..., 63mkfs.fat: unable to open out/partitions/EFI: Permission denied
) = 63
exit_group(1)                           = ?

为了清楚起见,我的目录结构如下所示:

out
├── minimal.qcow2 [raw disk image] (shadows minimal.qcow2 [qcow2 file] with qemu-storage-daemon)
├── partitions
│   ├── EFI [Block device]
│   └── System [Block device]
└── qemu-monitor.sock [UNIX domain socket]

当然,有跟踪每个方法的日志记录功能。我在列出分区时确实看到了日志,但在格式化时却看不到日志。

正如我所提到的,我发现关于实际可能导致此错误的原因的文档很少。

进一步的见解

感谢@orenkishon 的见解,我发现了更多令我困惑的细节。

  1. fuser我发现了一些有趣的选项:

    • MountOption::Dev 启用特殊字符和块设备
    • MountOption::DefaultPermission 在内核中启用权限检查
    • MountOption::RW 读写文件系统(显然不是默认选项)

    不幸的是,这些组合都没有解决我的问题。

  2. 不会立即调用日志函数。它们似乎与某种冲洗操作有关。我可以运行该mkfs.fat命令,查看一两个日志,切换回 IDE,然后查看显示的一页日志。

    这可能是因为我生成文件的目录位于项目目录内,因此它对 IDE 是可见的,但它让我觉得非常不寻常。

  3. 函数中的日志access永远不可见,但在statfs函数中是可见的,但前提是从目录mkfs外部调用并且是所有调用中的第一个调用。outmkfs

    project > cd ./out
    project/out > mkfs.fat partitions/EFI
    mkfs.fat 4.2 (2021-01-31)
    mkfs.fat: unable to open partitions/EFI: Permission denied
    
    # No logs
    
    project > mkfs.fat out/partitions/EFI
    mkfs.fat 4.2 (2021-01-31)
    mkfs.fat: unable to open out/partitions/EFI: Permission denied
    
    # No logs
    project > cargo run ...
    project > mkfs.fat out/partitions
    mkfs.fat 4.2 (2021-01-31)
    mkfs.fat: unable to open out/partitions/EFI: Permission denied
    
    # Logs appear after switching to IDE
    
  1. 我今天第一次看到这条日志消息:
[2024-04-21T16:58:24Z DEBUG fuser::mnt::fuse_pure] fusermount: 
[2024-04-21T16:58:24Z DEBUG fuser::mnt::fuse_pure] fusermount: fusermount3: unsafe option dev ignored

有一个MountOption::Dev特定的,据说它增加了对块和字符设备的支持。但我似乎无法解释为什么它被拒绝。我希望我可以使用修补版本,libfuse3但似乎没有。

可能有用的额外信息

系统规格

直接从 KDE 的系统信息复制

  • 操作系统:Kubuntu 23.10
  • KDE 等离子版本:5.27.8
  • KDE 框架版本:5.110.0
  • Qt 版本:5.15.10
  • 内核版本:6.5.0-28-generic(64位)
  • 图形平台:Wayland
  • 处理器:32 个第 13 代智能英特尔® 酷睿™ i9-13900
  • 内存:31.1 GiB RAM
  • 图形处理器:AMD Radeon RX 7900 XT
  • 制造商: 华硕

通用写入操作也会失败

一个建议是检查是否在不支持块设备的mkfs情况下失败。fat32然而,情况似乎并非如此,因为使用任何其他文件系统进行格式化都会产生相同的结果。

我还使用它mkfs作为测试平台,因为我目前不知道有任何其他现成的系统实用程序可以直接写入块设备,并且mkfs无论如何我都打算使用它。

坏消息 :(

在阅读手册页时,我看到了这一段,这让我的心一沉:

支持 mount 中描述的大多数通用挂载选项(ro、rw、suid、nosuid、dev、nodev、exec、noexec、atime、noatime、sync、async、dirsync)。文件系统默认使用nodev,nosuid挂载,只能由特权用户覆盖。

所以看起来这是不可能的。尽管如此,这里的任何见解——任何一线希望——都将受到高度赞赏。

block-device
  • 2 个回答
  • 152 Views
Martin Hope
Jille Timmermans
Asked: 2023-06-21 02:42:15 +0800 CST

写入块设备时的部分 fsyncs

  • 6

我正在直接在块设备之上编写自己的数据存储。为了确保持久性,我想同步到磁盘。但事情是这样的:我只想同步其中的一部分。

我保留了一份用于崩溃恢复的日志,并将未来的更改写入日志,然后再将它们应用到磁盘上的实际位置。然后我想确保日志更改写入磁盘,然后才对磁盘的其余部分进行实际更改(我不关心 fsync,直到我检查日志)。

我可以简单地同步整个块设备,但这会迫使很多不紧急的事情被写出。

我想到了两种选择,但令我惊讶的是没有部分 fsync(2) 调用,而且从我发现的情况来看,没有人要求它。

  1. mmap(2) 完整的块设备并使用msync(2)同步它的一部分。
  2. open(2)块设备两次,一次用于O_SYNC延迟写入,一次用于我的日志写入。
block-device
  • 1 个回答
  • 36 Views
Martin Hope
Ana Khorguani
Asked: 2022-06-10 07:45:48 +0800 CST

在 RAM 上挂载启用 DAX 的文件系统

  • 0

我正在尝试在 RAM 上安装具有 DAX 功能的文件系统。

我使用这个答案来加载brd模块并获取/dev/ram0.然后我尝试了所有支持 DAX 的 3 个文件系统:ext2、ext4 和 xfs。

但是,当我将-o dax标志与 一起使用时mount,我收到此错误:wrong fs type, bad option, bad superblock on /dev/ram0, missing codepage or helper program, or other error

我dmesg | tail看到以下问题:(ram0): DAX unsupported by block device.

这是实现我最初目标的不正确方法,在 RAM 上安装带有 DAX 的文件系统,还是我做错了什么?

我看到了这个问题,但我不认为-t ramfs我想要什么,它不会出现在df -h列表中。

我使用5.10.0-14-amd64linux内核版本。

filesystems block-device
  • 1 个回答
  • 44 Views
Martin Hope
Colin Jack
Asked: 2022-01-04 12:57:48 +0800 CST

ls -ls 输出显示的块数大于文件大小

  • 3

据我所知,带有“-s”选项的 ls 命令以块为单位打印文件大小,ls 使用 1024 作为块大小,但我注意到一些奇怪的东西。

为了更好地理解,请考虑 ls -ls 命令的以下输出:

12 -rw-r--r--。1 根 10240 Jul 15 19:22 z

文件大小为 10240 字节,块大小为 1024,因此该文件的块数为 10240/1024 = 10 个块,但为什么ls显示 12 个块?

问候

ls block-device
  • 3 个回答
  • 437 Views
Martin Hope
Veverke
Asked: 2021-12-07 02:31:29 +0800 CST

为非虚拟驱动器列出 /dev/block 以确定系统上的硬盘有多安全?

  • 0

使用以下方法确定系统上的硬盘有多安全(我特别固执地避免使用非内核实用程序/程序):

ls -l /sys/block | grep -v "/virtual"

我可以期望 /sys 文件系统始终存在于高于 16 的 Ubuntu 版本以及 RHEL 7 中吗?

shell-script block-device
  • 1 个回答
  • 31 Views
Martin Hope
Whois_me
Asked: 2021-10-15 05:11:57 +0800 CST

Linux 会更新块设备的大小吗?

  • 3

鉴于 emmc 磨损监控,我想知道正在运行的 Linux 操作系统中显示的大小。emmc 芯片有一个内部管理器,它跟踪所有不同字节寄存器的使用强度。理论上,SSD、USB 记忆棒或 emmc 芯片等闪存设备的容量应该会在达到寿命极限时缩小。

 $ lsblk -b

.. 以字节为单位返回块大小,如下所示:

lsblk -b

如果整个 emmc 映像的容量和大小下降,这个数字会自动更新吗?

是否有任何其他工具可以实现实际可用块大小的实时表示?

编辑:在@Marcus 和@Artem 的评论之后

emmc 驱动程序具有此虚拟文件系统条目,其中已实现“生命终止”指示。如果我没记错的话,0x02 代表 80% 的容量损失,0x03 代表 90% 的容量损失。意识到你的 emmc 已经消失有点晚了,所以我正在寻找一种方法来在更早的阶段指示这些关键信息。

看着 :cat /sys/class/block/mmcblk1/device/pre_eol_info

size block-device
  • 2 个回答
  • 680 Views
Martin Hope
peterh
Asked: 2021-09-10 05:46:27 +0800 CST

如何判断 Linux 块设备是否可修剪?

  • 7

fstrim需要挂载Linux块设备,而且不是很冗长。blkdiscard可以告诉,但也需要写操作。

我可以以某种方式判断块设备是否支持修剪/丢弃,而无需实际尝试修剪/丢弃上面的东西吗?

linux block-device
  • 3 个回答
  • 1732 Views
Martin Hope
jmiry
Asked: 2019-05-08 06:07:09 +0800 CST

在 /dev/block 目录下,文件名 8:0 或 11:0 是什么意思?[复制]

  • 0
这个问题在这里已经有了答案:
设备型号是什么意思? (2 个回答)
3年前关闭。

/dev/block 目录中有一堆符号链接。
我发现他们指向 /dev 中的块设备文件。
我想知道他们名字的含义(8:0, 8:1, 11:0, 11:1, ...)

block-device
  • 1 个回答
  • 1913 Views
Martin Hope
David Tonhofer
Asked: 2019-04-22 03:24:08 +0800 CST

lsblk 列“RAND”又名“增加随机性”——这是什么意思?

  • 3

在 Fedora 29 上运行lsblk(从脚本和与操作系统无关的高级语言中获取有关磁盘配置信息的绝佳命令),如下所示:

$ lsblk --output NAME,FSTYPE,ROTA,PARTTYPE,TYPE,RAND,TRAN

NAME                   FSTYPE            ROTA PARTTYPE TYPE  RAND TRAN
sda                                         0          disk     0 sata
├─sda1                 ext4                 0 0x83     part     0 
└─sda2                 LVM2_member          0 0x8e     part     0 
  ├─fedora_root        ext4                 0          lvm      0 
  └─fedora_swap        swap                 0          lvm      0 
sdb                                         0          disk     0 sata
└─sdb1                 ext4                 0 0x83     part     0 
sdc                                         1          disk     1 sata
└─sdc1                 linux_raid_member    1 0xfd     part     1 
  └─md127              crypto_LUKS          1          raid1    0 
    └─luks_mdraid      ext4                 1          crypt    0 
sdd                                         1          disk     1 sata
└─sdd1                 linux_raid_member    1 0xfd     part     1 
  └─md127              crypto_LUKS          1          raid1    0 
    └─luks_mdraid      ext4                 1          crypt    0 

在这里,我们要求了以下内容(可用列的列表可以通过发出来获得lsblk --help):

  • NAME :设备名称(很好地排列在树中)
  • FSTYPE : 文件系统类型
  • ROTA:这是一个“旋转装置”吗(旋转锈,DVD等)
  • PARTTYPE : 分区类型 UUID (一组值fdisk)
  • 类型:设备类型
  • 兰德:“增加随机性”
  • TRAN : 设备传输类型

好的,所以设备按照RAND. 但在什么情况下?以及什么价值?这似乎与设备“旋转”有关。“增加随机性”是什么意思?

devices block-device
  • 2 个回答
  • 540 Views
Martin Hope
bejo
Asked: 2019-04-14 06:40:41 +0800 CST

/dev/disk/by-uuid下的短uuid和长uuid

  • 3

我的系统上有几个硬盘分区(Linux josDeb 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux)。它正在与:

bejo@josDeb:~$ ls -l /dev/disk/by-uuid

产量:

total 0
lrwxrwxrwx 1 root root 10 Apr 13 16:20 00FB-604A -> ../../sdb1
lrwxrwxrwx 1 root root 10 Apr 13 16:19 4425-7572 -> ../../sda1
lrwxrwxrwx 1 root root 10 Apr 13 16:19 8dc07aba-5729-4525-883f-09c32d1a9e98 -> ../../sda2
lrwxrwxrwx 1 root root 10 Apr 13 16:19 95a8efff-92d2-4e31-8632-bf7a640e100f -> ../../sda3
lrwxrwxrwx 1 root root 10 Apr 13 16:19 f5a05b5e-c3ed-4227-bb62-fe4576b72643 -> ../../sda4

有些分区 uuid 很长,有些很短。我想了解为什么。我想,uuid 总是有 16 个字节。为什么我有不同大小的 uuid?

disk block-device
  • 1 个回答
  • 2350 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve