当我使用“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 设备驱动程序时收到错误消息?

常用的echo和cat,这次让我折在了特殊字符丢失问题上

当使用 cat 找不到参数时,Bash 打印帮助消息

R:使用 cat() 获取类似 Unix 的换行符 LF 写入文件

cat写入数据

当我将富文本格式的字符串从 Python 写入文件时,我可以重新格式化它们吗?