当我使用“cat”写入字符设备时,“cat: write error: No space left on device”
Posted
技术标签:
【中文标题】当我使用“cat”写入字符设备时,“cat: write error: No space left on device”【英文标题】:"cat: write error: No space left on device" when I write to a character device using "cat" 【发布时间】:2020-04-02 09:50:02 【问题描述】:我正在尝试在 Linux 4.14 上使用音频解码器 VS1053 来播放音乐。该设备通过SPI总线通信,我已经开发了驱动程序并将VS1053注册为字符设备,感谢https://github.com/rvp-nl/vs10xx-linux。问题来了。
播放音乐的方式是:
cat musicfile.mp3 > /dev/VS1053_device
当我将 WAV 音乐文件扔到设备上时,一切正常,音乐播放良好。但是,当我将 mp3 音乐文件扔到设备上时,Linux 会抛出错误
cat:写入错误:设备上没有剩余空间
我在很多网站上都搜索过原因。许多人说,检查文件系统上的可用空间和可用 inode,但这是我的结果:
root@s32v234sbc:~# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/root 956592 10795 945797 2% /
devtmpfs 234285 308 233977 1% /dev
tmpfs 234333 205 234128 1% /run
tmpfs 234333 10 234323 1% /var/volatile
root@s32v234sbc:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 412M 14G 3% /
devtmpfs 916M 0 916M 0% /dev
tmpfs 916M 84K 916M 1% /run
tmpfs 916M 28K 916M 1% /var/volatile
root@s32v234sbc:~#
音乐文件被限制在 100MB 以内,空间是不会用完的。
我尝试编写一个打印文件程序来代替“cat”,但这也不起作用。我不知道为什么以及如何发生此错误。
如果有人能帮助我,我非常感激!!!
【问题讨论】:
命令ls -l /dev/VS1053_device
的输出是什么?查看代码,我认为设备路径名应该类似于“/dev/vs10xx-0”。
@Ian Abbott 您的命令输出是:crw------- 1 root root 245, 0。您的名字是对的,我的“VS1053_device”是“vs10xx-0” .我只修改了名字。
抱歉,但在 Stack Overflow 上,我们希望有问题的代码位于 问题帖子 本身,而不是链接。此外,我们希望您执行一些调试,因此生成的代码应采用minimal reproducible example 的形式。您可以在vs10xx_write
函数中插入一些printk
语句,以找出它返回ENOSPC
的原因。如果这是某个内核函数返回的值,请询问该函数。
【参考方案1】:
试试下面的命令:
tune2fs -l /dev/VS1053_device | grep -i reserved
而且 cat 不适合你正在执行的操作。MP3 格式有各种各样的垃圾,可以潜伏在文件的开头和结尾,这需要被剥离出来。试试 ffmpeg 或 mp3wrap 或播放
【讨论】:
其实我认为“/dev/VS1053_device”是字符特殊设备,不是extN文件系统。那就是路径名实际上是否正确,我对此表示怀疑。此外,根据其文档,除了 WAV、OGG、AAC 和 FLAC 之外,该设备似乎可以处理写入其中的 MP3 数据流。 @Gopika BG tune2fs 给了我“找不到有效的文件系统超级块”。我可以使用 ffmpeg 将 mp3 文件转换为 wav。正如我所说,wav 音乐文件播放良好。我的 Linux 上没有 mp3wrap 或 aplay。 @lan Abbott 该设备内部可以处理多种音乐数据格式。我只需要将数据流推送给它。我还在STM32上写了这个设备的驱动,没有任何操作系统,mp3文件已经被证明可以播放了。【参考方案2】:您使用的驱动程序似乎有问题。当您收到“设备上没有剩余空间”时,这并不意味着在这种情况下本地文件系统已满。可能这意味着 SPI 总线的本地或另一端存在问题。您正在使用的驱动程序可能从 linux 内核的 SPI 驱动程序接收到 -ENOSPC 状态,但您的驱动程序无法正确处理此错误。因此,需要深入了解您正在使用的驱动程序。
【讨论】:
您说的完全正确,这与我的驱动程序有关,但我不知道哪里会导致这个问题。在调试时,我注意到一个非常奇怪的情况。在vs10xx_queue.c中,我将变量queuelen从256修改为8192。当我增加queuelen时,我什至无法播放一些wav文件。我相信数据格式也是一个原因,但我没有办法调试这个问题。 我认为您可以检查您从哪里获得 -ENOSPC 状态。源码中有函数 vs10xx_write() ,你可以从分析它开始。从这个函数中调用另一个函数:vs10xx_device_write(),我认为你可以沿着这条路径走得更远,尝试找出 -ENOSPC 出现的位置。我怀疑这种状态可能发生在linux内核的SPI层的某个地方。 奇怪的是,写入路径中似乎没有任何地方返回-ENOSPC
。增加queuelen
变量只会影响驱动程序是否成功创建设备(由于内存不足)。
@Gerald:你使用哪个版本的 git 驱动程序?这正是来自 github 的这个还是另一个?我会尝试调试 vs10xx_write() 过程并记录“状态”和“复制”变量的值,同时尝试重新创建有问题的情况 - 在此过程中“返回”之前。
@user2699113 我发布的链接是我使用的版本。我认为您的想法可能是正确的,错误很可能发生在内核中。我要分析成 vs10xx_write()。谢谢你的建议。以上是关于当我使用“cat”写入字符设备时,“cat: write error: No space left on device”的主要内容,如果未能解决你的问题,请参考以下文章
为啥在尝试“cat”我的 char 设备驱动程序时收到错误消息?