Linux cfdisk命令详解

cfdisk 是一个基于ncurses的磁盘分区管理工具,提供直观的文本用户界面,用于创建、删除、修改磁盘分区。它是fdisk的Curses版本,比传统的fdisk命令更加用户友好。

cfdisk 支持多种分区表类型,包括MBR(DOS)和GPT,并能够处理多种文件系统类型。

重要警告

分区操作会永久改变磁盘结构! 在进行任何分区操作前,请确保已备份重要数据。错误的操作可能导致数据丢失。

语法格式

cfdisk [选项] [设备]
cfdisk -z [设备]  # 创建新的空分区表

设备可以是磁盘设备(如 /dev/sda)或分区(如 /dev/sda1),如果不指定设备,cfdisk会尝试列出可用设备供选择。

功能说明

  • 分区管理:创建、删除、修改磁盘分区
  • 分区表操作:创建新的分区表(MBR/GPT)
  • 文件系统支持:支持多种文件系统类型标记
  • 图形界面:基于ncurses的直观文本用户界面
  • 单位选择:支持扇区、柱面、MB、GB等多种单位显示
  • 引导标志:设置/取消分区的可引导标志

常用选项

选项 说明
-h, --help 显示帮助信息
-V, --version 显示版本信息
-a, --arrow-cursor 使用箭头光标(默认使用高亮)
-z, --zero 创建新的空分区表(清除现有分区表)
-c, --color[=when] 使用颜色输出(auto, always, never)
-g, --gpt 使用GPT分区表(默认自动检测)
-L, --Linux 不显示Linux以外的分区类型
-r, --read-only 只读模式,不保存任何更改
-t, --list-types 列出支持的分区类型
-u, --units[=unit] 显示单位:s(扇区)、c(柱面)、b(字节)

cfdisk界面说明

                                    cfdisk (util-linux 2.37.2)

                           Disk: /dev/sda
                    Size: 238.5 GiB, 256060514304 bytes, 500118192 sectors
                    Label: gpt, identifier: 1A2B3C4D-5E6F-7890-ABCD-EF1234567890

                ┌─────────────────────────────────────────────────────────────┐
                │ Partition                                                  │
                ├─────────────────────────────────────────────────────────────┤
                │▶ /dev/sda1      1 GiB   Linux filesystem  Boot            │
                │  /dev/sda2     50 GiB   Linux filesystem                   │
                │  /dev/sda3    100 GiB   Linux filesystem                   │
                │  Free space    87.5 GiB                                     │
                └─────────────────────────────────────────────────────────────┘
      [  New  ]  [  Delete  ]  [  Resize  ]  [  Quit  ]  [  Type  ]  [  Help  ]
      [ Write ]  [  Dump   ]  [  Units   ]  [  Sort  ]  [  Fix   ]  [  Boot  ]
界面元素 说明
顶部信息 显示磁盘设备、大小、分区表类型和标识符
分区列表 显示所有分区和空闲空间,▶ 表示当前选中的分区
按钮栏 底部按钮对应不同操作,使用键盘方向键和回车键操作
状态栏 显示当前操作的提示信息和帮助文本

使用示例

示例1:启动cfdisk并查看磁盘

# 启动cfdisk查看磁盘
sudo cfdisk

# 查看指定磁盘
sudo cfdisk /dev/sda

# 以只读模式查看(不保存更改)
sudo cfdisk -r /dev/sda
基本导航操作

- 上下移动选择分区

- 左右移动选择按钮

Enter - 确认选择/执行操作

Tab - 在分区列表和按钮间切换

q - 退出(不保存)

w - 写入更改并退出

示例2:创建新的分区表

# 创建新的GPT分区表(会清除所有数据!)
sudo cfdisk -z /dev/sdb

# 创建新的MBR(DOS)分区表
sudo cfdisk -z --dos /dev/sdb

# 交互式创建新分区表
sudo cfdisk /dev/sdb
# 然后在界面中选择"New"创建分区

示例3:创建新分区

# 启动cfdisk
sudo cfdisk /dev/sda

# 在界面中的操作步骤:
# 1. 使用方向键选择"Free space"
# 2. 按左右键选择"New"按钮,按Enter
# 3. 输入分区大小(如:10G、10000M或直接回车使用全部空间)
# 4. 选择分区类型(Primary/Extended/Logical)
# 5. 选择"Write"保存更改
# 6. 输入"yes"确认写入
# 7. 选择"Quit"退出

示例4:删除分区

# 启动cfdisk
sudo cfdisk /dev/sda

# 在界面中的操作步骤:
# 1. 使用方向键选择要删除的分区
# 2. 按左右键选择"Delete"按钮,按Enter
# 3. 确认删除操作
# 4. 选择"Write"保存更改
# 5. 输入"yes"确认写入
# 6. 选择"Quit"退出

示例5:调整分区大小

# 启动cfdisk
sudo cfdisk /dev/sda

# 在界面中的操作步骤:
# 1. 使用方向键选择要调整的分区
# 2. 按左右键选择"Resize"按钮,按Enter
# 3. 输入新的分区大小
# 4. 选择"Write"保存更改
# 5. 输入"yes"确认写入
# 6. 选择"Quit"退出
注意:调整分区大小通常需要文件系统支持,并且可能需要额外的文件系统调整工具(如resize2fs)。

示例6:设置分区类型和引导标志

# 启动cfdisk
sudo cfdisk /dev/sda

# 设置分区类型:
# 1. 选择分区
# 2. 选择"Type"按钮
# 3. 从列表中选择分区类型(如Linux filesystem, Linux swap等)
# 4. 按Enter确认

# 设置引导标志:
# 1. 选择要设置为可引导的分区
# 2. 选择"Boot"按钮
# 3. 标志"Boot"会出现在分区旁

示例7:完整的磁盘分区脚本

#!/bin/bash
# 自动分区脚本示例(需要交互确认)

DISK="/dev/sdb"
echo "=== 磁盘分区设置向导 ==="
echo "目标磁盘: $DISK"
echo ""

# 显示当前分区
echo "当前分区表:"
sudo fdisk -l "$DISK" | grep -E "^/dev/"

echo ""
read -p "是否继续?这将清除磁盘上的所有数据!(y/N): " confirm

if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
    echo "操作已取消"
    exit 1
fi

# 启动cfdisk进行交互式分区
echo "启动cfdisk..."
echo "在cfdisk界面中,请执行以下操作:"
echo "1. 选择'New'创建分区"
echo "2. 设置分区大小和类型"
echo "3. 选择'Write'保存更改"
echo "4. 输入'yes'确认"
echo "5. 选择'Quit'退出"
echo ""
read -p "按Enter键开始..."

sudo cfdisk "$DISK"

# 格式化分区(示例)
echo ""
echo "格式化新分区..."
# 假设创建了/dev/sdb1和/dev/sdb2
if [ -b "/dev/sdb1" ]; then
    echo "格式化 /dev/sdb1 为ext4..."
    sudo mkfs.ext4 -q /dev/sdb1
fi

if [ -b "/dev/sdb2" ]; then
    echo "格式化 /dev/sdb2 为交换分区..."
    sudo mkswap /dev/sdb2
    sudo swapon /dev/sdb2
fi

echo "分区完成!"

示例8:GPT分区管理

#!/bin/bash
# GPT分区管理示例

DISK="/dev/sdc"

# 检查磁盘是否使用GPT分区表
echo "检查分区表类型..."
if sudo parted "$DISK" print | grep -q "Partition Table: gpt"; then
    echo "磁盘使用GPT分区表"
else
    echo "磁盘未使用GPT分区表"
    read -p "是否转换为GPT?(y/N): " convert
    if [[ "$convert" == "y" || "$convert" == "Y" ]]; then
        echo "注意:转换会清除所有数据!"
        sudo parted "$DISK" mklabel gpt
    fi
fi

# 使用cfdisk管理GPT分区
echo "启动cfdisk进行GPT分区管理..."
sudo cfdisk -g "$DISK"

# 显示GPT分区信息
echo "GPT分区信息:"
sudo gdisk -l "$DISK" | grep -A20 "Number"

cfdisk常见操作总结

操作 按键/按钮 说明
选择分区 上下移动选择分区
选择按钮 左右移动选择底部按钮
执行操作 Enter 确认选择或执行按钮操作
新建分区 New 按钮 在空闲空间上创建新分区
删除分区 Delete 按钮 删除选中的分区
调整大小 Resize 按钮 调整选中分区的大小
修改类型 Type 按钮 修改分区类型(文件系统类型)
引导标志 Boot 按钮 设置/取消分区的可引导标志
写入更改 Write 按钮 将更改写入磁盘(需要确认)
退出不保存 q 或 Quit 按钮 退出程序不保存更改

与其他分区工具的比较

工具 特点 适用场景
cfdisk 基于curses的图形界面,操作直观 交互式分区操作,适合初学者
fdisk 命令行界面,功能强大 脚本自动化,高级用户
parted 支持更多文件系统,GPT/MBR都支持 需要调整文件系统大小
gdisk 专门用于GPT分区表 GPT分区表管理
gparted 图形界面工具,功能全面 桌面环境下的分区管理

注意事项

  • 数据备份:分区操作前务必备份所有重要数据
  • 分区表类型:确认磁盘使用MBR还是GPT分区表,不同系统有不同限制
  • 写入确认:只有选择"Write"并确认后,更改才会生效
  • 系统挂载:不要对已挂载的系统分区进行操作
  • 引导问题:修改系统盘分区可能影响系统引导,需要更新引导配置
  • 4K对齐:现代磁盘建议使用4K对齐以获得最佳性能
  • MBR限制:MBR分区表最多支持4个主分区,或3个主分区+1个扩展分区
  • GPT优势:GPT支持更多分区(最多128个),支持大于2TB的磁盘
  • 操作验证:修改后使用 lsblkfdisk -l 验证结果

常见问题和解决方案

可能原因:终端不支持curses或TERM环境变量设置不正确。

解决方案:

  1. 检查终端类型:
    echo $TERM
  2. 尝试设置正确的TERM变量:
    export TERM=xterm
    sudo cfdisk
  3. 使用箭头光标模式:
    sudo cfdisk -a
  4. 使用其他终端或SSH客户端

原因:磁盘使用MBR分区表,MBR最大只支持2TB。

解决方案:转换为GPT分区表:

# 警告:这会清除所有数据!
# 使用gdisk转换
sudo gdisk /dev/sda
# 在gdisk中输入: w (保存)

# 或使用parted
sudo parted /dev/sda mklabel gpt

转换后,使用cfdisk创建GPT分区:

sudo cfdisk -g /dev/sda

可能原因:引导分区被修改或删除。

解决方案:

  1. 使用Live CD/USB启动
  2. 检查分区情况:
    sudo fdisk -l
    sudo blkid
  3. 重新安装引导程序(以GRUB为例):
    # 挂载根分区
    sudo mount /dev/sda1 /mnt
    sudo mount /dev/sda2 /mnt/boot  # 如果有单独的boot分区
    
    # 重新安装GRUB
    sudo grub-install --root-directory=/mnt /dev/sda
    sudo update-grub
  4. 修复引导配置后重启

相关命令

  • fdisk - 传统的磁盘分区工具
  • parted - 更强大的分区工具,支持更多文件系统
  • gdisk - GPT分区表管理工具
  • mkfs - 创建文件系统
  • mkswap - 创建交换分区
  • mount - 挂载文件系统
  • lsblk - 列出块设备信息
  • blkid - 显示块设备属性