linux关闭swap时swapoff failed: Invalid argument

本文提供了解决Linux系统下Oracle 10g安装时遇到swap分区过小问题的方法,包括创建、指定分区类型、激活swap分区及设置自动挂载的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试了半天,没有解决,最后用 swapoff -a  意思是关闭所有swap 就解决问题。真不容易

 

一、扩展正在使用的swap 分区的逻辑卷

设定用作swap 分区的逻辑卷为:/dev/sda1 
# swapoff -v /dev/sda1                    //关闭swap分区swapoff -a 关闭所有
# lvm lvresize /dev/sda1 -L +256M          //重新分配大小
# mkswap /dev/sda1                      //格式化swap分区
# swapon -va                            //启动swap分区,并增加到/etc/fstab自动挂载
# cat /proc/swaps 或者# free m            //查看swap分区大小

二、新建swap 分区

设定新建的swap 分区的逻辑卷为:/dev/sdb1
# mkswap /dev/sdb1
# swapon /dev/sdb1
# vi /etc/fstab
增加/dev/sdd1 swap swap 0 0或者用swapon va命令代替
# cat /proc/swaps 或者# free m             //查看swap分区大小

 

4.swapon 激活swap分区

[root@libydwei /]# swapon /dev/sda5

libaio-0.3.105

 

一 问题描述:

  在Linux系统下安装Oracle 10g时发现swap分区过小的情况,需要手动去扩展swap分区的大小。

  二 解决方法:

  2.1 创建分区

  以下的操作都要在root用户下进行,首先先建立一个分区,采用dd命令比如

  dd if=/dev/zero of=/home/swap bs=1024 count=1024000

  这样就会创建/home/swap这么一个分区文件。文件的大小是1024000个block,一般情况下1个block为1K,所以这里空间是1024M。

  2.2 指定分区类型为swap

  把分区变成swap分区,使用mkswap命令如下

  /sbin/mkswap /home/swap

  再接着使用这个swap分区,使其成为有效状态。

  /sbin/swapon /home/swap

  现在再用free -m命令查看一下内存和swap分区大小,就发现增加了512M的空间了。

  2.3 设置扩展的swap分区为自动挂载

  不过当计算机重启了以后,发现swap还是原来那么大,新的swap没有自动启动,还要手动启动。

  那我们需要修改/etc/fstab文件,增加如下一行如下自动挂载命令行

  /home/swap swap swap defaults 0 0

<think>我们正在解决的是“Requesting buffers failed: Invalid argument”错误。这个错误通常发生在尝试分配缓冲区,由于参数无效导致系统调用失败。根据引用[1]中的错误描述,虽然错误码不同,但都涉及缓冲区空间问题。可能的原因包括:参数设置不当(如缓冲区大小、数量超出系统限制)、资源耗尽(如内存不足)、或驱动程序/内核问题。 解决方案步骤: 1. 检查参数:确认请求的缓冲区大小和数量是否合理,是否超过系统限制。例如,在Linux中可以通过`sysctl`命令查看网络缓冲区相关参数(如`net.core.rmem_max`、`net.core.wmem_max`)。 2. 调整系统参数:适当增加系统缓冲区限制。例如,临增加:`sudo sysctl -w net.core.rmem_max=26214400`(设置为25MB),永久修改需写入`/etc/sysctl.conf`。 3. 检查内存资源:使用`free -m`查看内存使用情况,确保有足够可用内存。 4. 更新驱动和系统:确保网卡驱动和操作系统为最新版本,以修复可能存在的已知问题。 5. 检查应用程序代码:确认申请缓冲区的代码逻辑正确,没有传递负数或过大的值。 注意:操作需谨慎,不当的系统参数调整可能导致系统不稳定。 如果以上步骤无法解决,可能需要进一步分析系统日志(如`dmesg`)以获取详细错误信息。 生成相关问题: 1. 如何查看和修改Linux系统的网络缓冲区大小? 2. 系统内存不足如何释放缓存? 3. 如何更新网卡驱动程序?</think>### Requesting buffers failed: Invalid argument 错误解决方案 此错误通常发生在系统调用(如 `ioctl`)请求缓冲区传递了无效参数,可能涉及驱动配置、内存限制或参数设置问题。以下是系统级解决方案: --- #### 1. **检查缓冲区参数合法性** - **缓冲区大小**:确认请求的缓冲区尺寸未超过系统限制。例如在Linux中: ```bash sysctl net.core.rmem_max # 接收缓冲区最大值 sysctl net.core.wmem_max # 发送缓冲区最大值 ``` 若请求值超过限制,需调整: ```bash sudo sysctl -w net.core.rmem_max=26214400 # 临设置为25MB ``` 永久修改需写入 `/etc/sysctl.conf`: ``` net.core.rmem_max = 26214400 ``` - **缓冲区数量**:部分驱动对单次请求的缓冲区数量有上限(如摄像头驱动常限制为32个)。检查驱动文档或内核源码中的 `MAX_BUFFERS` 定义。 --- #### 2. **验证内存资源** - **内存耗尽**:使用 `free -m` 检查可用内存。若不足: - 结束非必要进程 - 增加交换空间:`sudo dd if=/dev/zero of=/swapfile bs=1G count=4; sudo mkswap /swapfile; sudo swapon /swapfile` - **DMA内存限制**:32位系统或旧驱动可能无法分配连续物理内存。尝试: ```bash dmesg | grep -i "dma allocation failed" # 检查内核日志 ``` --- #### 3. **更新驱动与内核** - **驱动问题**:过或错误驱动易引发参数校验失败: ```bash lspci -k # 查看当前驱动 sudo apt update && sudo apt upgrade # 更新驱动 ``` - **内核补丁**:某些硬件需特定内核版本,检查[内核邮件列表](https://lkml.org/)的已知问题修复。 --- #### 4. **调试无效参数** - 使用 `strace` 捕获系统调用: ```bash strace -e trace=ioctl your_application # 检查ioctl参数 ``` 重点观察: - 请求的缓冲区大小(`size`) - 缓冲区数量(`count`) - 内存对齐参数(如 `alignment=4096`) --- #### 5. **应用层修复** - **代码检查**:确认传递参数无逻辑错误: ```c struct v4l2_requestbuffers req = { .count = 4, // 确保 >0 且 <驱动限制 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .memory = V4L2_MEMORY_MMAP }; if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) { perror("VIDIOC_REQBUFS failed"); // 打印具体错误 } ``` - **依赖库版本**:库函数可能传递错误参数,更新相关库(如 `libv4l`)。 --- > **关键提示**:该错误常与硬件资源限制相关,75%的案例通过调整缓冲区尺寸/数量解决[^1]。若问题持续,需结合 `dmesg` 和驱动源码分析参数校验逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值