【访问控制】cgroup限制磁盘读写

本文详细介绍了Linux中使用cgroups的blkio子系统如何限制和监控磁盘读写I/O操作,包括通用配置格式、磁盘编号获取、带宽和IOPS限制示例,以及如何解除限制。

一、前言

Cgroup - Linux的IO资源隔离 | 用 cgroups 管理进程磁盘 io

blkio是cgroup中的一个子系统,可以用于限制及监控磁盘读写io
blkio控制子系统可以限制进程读写的 IOPS 和吞吐量,但它只能对 Direct I/O 的文件读写进行限速,对 Buffered I/O 的文件读写无法限制
Buffered I/O 指会经过 PageCache 然后再写入到存储设备中。这里面的 Buffered 的含义跟内存中 buffer cache 不同,这里的 Buffered 含义相当于内存中的buffer cache+page cache。

二、blkio配置

1、限制磁盘读写io

blkio涉及限制磁盘读写io的配置文件主要有以下几个,通用echo指定磁盘设备号及数值实现限制磁盘读写io

root@node197:~# ll /sys/fs/cgroup/blkio/
-rw-r--r--   1 root root   0 Mar  4 03:00 blkio.throttle.read_bps_device
-rw-r--r--   1 root root   0 Mar  4 03:00 blkio.throttle.read_iops_d
<think>我们注意到用户的问题是关于在Ubuntu系统中使用cgroup创建账号并限制家目录大小。 但是,需要澄清的是:cgroups(控制组)通常用于限制、统计和隔离进程组的资源(如CPU、内存、磁盘I/O等),而不是直接限制家目录的大小。 限制家目录大小通常使用文件系统级别的配额(如quota)或者使用逻辑卷管理(LVM)的卷大小限制。 然而,cgroups v2有一个blkio控制器可以限制块设备I/O,但这限制的是I/O速率或带宽,而不是存储空间(磁盘容量)。所以,如果要限制用户的家目录大小(即磁盘容量),应该使用磁盘配额(disk quota)或者LVM等。 因此,我们需要向用户说明: 1. 创建账号:使用`adduser`命令。 2. 限制家目录大小:需要设置文件系统配额(quota)或者使用LVM的卷大小限制。 但是,如果用户坚持想用cgroups(尽管它不直接限制磁盘容量),那么我们可以解释cgroups的限制范围(如I/O速率),但这不是用户要求的目标。 考虑到用户可能混淆了概念,我们应提供正确的方法: 方法一:使用磁盘配额(quota) 步骤: a. 确保文件系统支持配额(ext4通常支持,需要挂载时开启quota选项)。 b. 安装quota工具:`sudo apt install quota` c. 重新挂载根文件系统(或家目录所在分区)以启用配额。 d. 为用户设置磁盘配额。 方法二:使用LVM 如果家目录在LVM逻辑卷上,可以调整逻辑卷的大小并设置硬限制。 但是,用户的问题中提到了“使用cgroup”,所以我们需要考虑是否有其他方式?或者用户可能是指限制其他资源? 经过分析,用户的需求是“限制家目录大小”,即磁盘空间。因此,我们应推荐使用磁盘配额。 然而,我们也可以考虑使用cgroups限制进程的写入速率(但这不能精确限制磁盘使用总量),或者结合loop设备?但这样很复杂。 因此,我们决定提供使用quota的方法,并说明cgroups不适用于此场景。 但是,注意:在Linux中,控制磁盘使用量的传统方法是磁盘配额(quota)。而cgroups的blkio控制器主要用于控制I/O带宽(如每秒读取的字节数),而不是总容量。 所以,我们回答: 在Ubuntu系统中,要创建账号并限制其家目录大小(磁盘容量),建议使用磁盘配额(quota)功能。以下是具体步骤: 步骤1:创建用户账号 使用以下命令创建新用户(例如用户名为testuser): ```bash sudo adduser testuser ``` 步骤2:安装磁盘配额工具 ```bash sudo apt update sudo apt install quota ``` 步骤3:检查文件系统并启用配额 假设家目录所在的分区是`/home`,文件系统类型是ext4(可以通过`df -Th /home`查看)。 编辑`/etc/fstab`文件,找到`/home`所在的行,在挂载选项(defaults)后面加上`usrquota`(针对用户的配额)或`grpquota`(针对组的配额)。例如: ``` UUID=... /home ext4 defaults,usrquota 0 2 ``` 然后重新挂载: ```bash sudo mount -o remount /home ``` 如果文件系统是ext4,还需要创建配额文件: ```bash sudo quotacheck -cum /home sudo quotaon /home ``` 步骤4:为用户设置磁盘配额 使用`edquota`命令为用户设置配额。例如,设置用户testuser的软限制为900MB,硬限制为1000MB(注意:单位是KB): ```bash sudo edquota -u testuser ``` 在打开的文件中,找到blocks和inodes部分,在blocks部分设置: ``` filesystem blocks soft hard inodes soft hard /dev/sdaX 0 900000 1000000 0 0 0 ``` 其中,blocks后面的两个0表示当前使用量(由系统维护),soft和hard分别设置软限制和硬限制(单位是KB)。inodes可以设置为0表示不限制。 步骤5:验证配额 可以使用`quota -u testuser`命令查看用户的配额设置。 注意:软限制是警告阈值,硬限制是绝对不可超过的值。用户超过软限制一段时间(默认7天)后会被禁止继续使用,直到清理空间。 如果用户确实需要限制磁盘总量,那么quota是标准方法。 如果用户想使用cgroups来限制磁盘I/O(如读写速率),那么可以配置cgroups v2的blkio控制器。但这并不能限制磁盘使用总量,只能控制读写速度。因此,不适合限制家目录大小(容量)。 因此,我们按照上面的步骤回答。 同时,生成相关问题: §§相关问题§§ 1. 如何检查磁盘配额的使用情况? 2. 除了磁盘配额,还有哪些方法可以限制用户磁盘空间? 3. 如何设置磁盘配额的宽限期(超过软限制后到强制执行的宽限时间)? 4. 在Ubuntu中如何安装和配置cgroups? 5. cgroups v2可以限制哪些资源? 注意:在回答中,我们引用了磁盘配额的标准方法,这是Linux系统管理的常见做法[^1]。 参考文献: [^1]: Linux man pages: edquota, quotaon, quotacheck </think>在 Ubuntu 系统中限制用户家目录大小,推荐使用 **文件系统配额(disk quota)** 而非 cgroups。cgroups 更适合限制 CPU、内存等资源,而磁盘空间限制需通过配额实现。以下是详细步骤: --- ### 📂 方法一:使用磁盘配额(推荐) #### 1. **创建用户** ```bash sudo adduser username # 替换 username 为实际用户名 ``` #### 2. **启用磁盘配额** ```bash # 安装配额工具 sudo apt install quota # 检查家目录所在分区(通常是 /home 或 /) df -h /home # 编辑 fstab 文件启用配额 sudo nano /etc/fstab ``` 在对应分区的 `defaults` 后添加 `,usrquota`(如 `/dev/sda1 /home ext4 defaults,usrquota 0 2`),保存退出。 #### 3. **重新挂载分区并初始化配额** ```bash sudo mount -o remount /home sudo quotacheck -cum /home # 生成配额数据库 sudo quotaon -v /home # 启用配额 ``` #### 4. **为用户设置配额** ```bash sudo edquota -u username ``` 在打开的文件中设置限制(单位 KB): ``` /dev/sda1 blocks soft=500000 hard=550000 inodes soft=0 hard=0 ``` - **soft**: 软限制(超出后警告) - **hard**: 硬限制(不可超越) - `blocks` 限制磁盘空间,`inodes` 限制文件数量(通常设为 0 表示不限制) #### 5. **验证配额** ```bash sudo quota -u username # 查看用户配额 repquota -a # 查看所有配额状态 ``` --- ### 方法二:使用 cgroups 限制磁盘 I/O(可选) 若需限制磁盘读写速度(非空间大小),可用 cgroups v2: ```bash # 创建 cgroup sudo mkdir /sys/fs/cgroup/user.slice/user-username # 限制写入速度(例如 10MB/s) echo "253:0 wbps=10485760" | sudo tee /sys/fs/cgroup/user.slice/user-username/io.max ``` > **注意**:此方法仅控制 I/O 速率,无法限制存储空间总量。 --- ### ❗ 关键区别 | **方法** | 适用场景 | 限制目标 | |-------------------|----------------------------|------------------| | 磁盘配额 (quota) | 限制存储空间大小 | 家目录容量 | | cgroups | 限制 I/O 速率或 CPU/内存 | 读写速度 | > ⚠️ 若需严格限制家目录**容量**,必须使用磁盘配额。cgroups 在磁盘空间限制上功能有限[^1]。 --- ### 🔍 相关命令速查 ```bash # 检查用户磁盘使用 sudo du -sh /home/username # 临时关闭配额 sudo quotaoff /home # 修改宽限期(默认7天) sudo edquota -t ``` [^1]: Linux 内核文档: [cgroups v2](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html), [磁盘配额](https://ext4.wiki.kernel.org/index.php/Quota) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值