Partitioning และ Formatting Disks บน Linux — fdisk, gdisk, parted และ mkfs

เมื่อเพิ่ม Disk ใหม่เข้าสู่ Server หรือต้องการจัดระเบียบพื้นที่จัดเก็บข้อมูลใหม่ ขั้นตอนแรกคือการแบ่ง Partition และ Format ให้เหมาะสมกับการใช้งาน Linux รองรับทั้ง Partition Table แบบ MBR (Master Boot Record) และ GPT (GUID Partition Table) โดย GPT เป็นมาตรฐานใหม่ที่รองรับ Disk ขนาดใหญ่กว่า 2TB และรองรับ Partition ได้มากกว่า

บทความนี้อธิบายการใช้งาน fdisk และ gdisk สำหรับแบ่ง Partition, การ Format ด้วย mkfs สำหรับ Filesystem ประเภทต่าง ๆ เช่น ext4, xfs, btrfs รวมถึงเทคนิคการตรวจสอบ Disk ก่อนและหลังการแบ่ง Partition บน Production Server

ตรวจสอบ Disk ที่มีในระบบ

ก่อนแบ่ง Partition ต้องตรวจสอบให้แน่ใจว่า Disk ที่ต้องการแบ่งคือ Disk ใด เพื่อป้องกันการลบข้อมูลผิด Disk

# แสดงรายการ Disk และ Partition ทั้งหมด
lsblk

# ตัวอย่าง Output
# NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
# sda      8:0    0   50G  0 disk
# ├─sda1   8:1    0    1G  0 part /boot
# ├─sda2   8:2    0   20G  0 part /
# └─sda3   8:3    0   29G  0 part /home
# sdb      8:16   0  100G  0 disk          ← Disk ใหม่ (ยังไม่มี Partition)
# sdc      8:32   0  500G  0 disk
# └─sdc1   8:33   0  500G  0 part /data

# แสดง Disk ทั้งหมดพร้อมขนาดและ Model
lsblk -d -o NAME,SIZE,MODEL,TYPE

# แสดงข้อมูล Partition Table แบบละเอียด
sudo fdisk -l
sudo fdisk -l /dev/sdb    # เฉพาะ Disk sdb

# ตรวจสอบด้วย parted
sudo parted -l

# ดูข้อมูล SMART (สุขภาพ Disk)
sudo smartctl -H /dev/sdb        # ต้องติดตั้ง smartmontools ก่อน
sudo smartctl -a /dev/sdb | head -30

MBR กับ GPT — เลือกแบบไหน

# MBR (Master Boot Record)
# - รองรับ Disk ได้สูงสุด 2TB
# - สร้าง Primary Partition ได้สูงสุด 4 Partition
#   (หรือ 3 Primary + 1 Extended ที่แบ่ง Logical Partition ได้อีก)
# - ใช้งานได้กับ BIOS รุ่นเก่า
# - คำสั่ง: fdisk

# GPT (GUID Partition Table)
# - รองรับ Disk ใหญ่กว่า 2TB (ไม่มีขีดจำกัดจริง)
# - สร้าง Partition ได้สูงสุด 128 Partition โดยไม่ต้องมี Extended
# - ต้องใช้ UEFI หรือ BIOS ที่รองรับ GPT (ถ้าใช้เป็น Boot Disk)
# - สำหรับ Data Disk เท่านั้น (ไม่ Boot): ใช้กับ BIOS แบบเก่าได้
# - คำสั่ง: gdisk หรือ parted

# ข้อแนะนำ:
# Disk ใหม่ที่ใช้เก็บข้อมูล (Data Disk) → ใช้ GPT เสมอ
# Disk ขนาดใหญ่กว่า 2TB → ต้องใช้ GPT เท่านั้น
# Boot Disk บน UEFI System → ใช้ GPT
# Boot Disk บน BIOS รุ่นเก่า → ใช้ MBR

fdisk — แบ่ง Partition แบบ MBR

# เปิด fdisk สำหรับ /dev/sdb (ระวัง: ต้องแน่ใจว่าเป็น Disk ที่ต้องการ)
sudo fdisk /dev/sdb

# คำสั่งภายใน fdisk
# m  — แสดงเมนูช่วยเหลือ
# p  — แสดง Partition Table ปัจจุบัน
# n  — สร้าง Partition ใหม่
# d  — ลบ Partition
# t  — เปลี่ยน Partition Type
# l  — แสดงรายการ Partition Types
# w  — บันทึกและออก (Write)
# q  — ออกโดยไม่บันทึก

# ตัวอย่างขั้นตอนสร้าง Partition เดียวขนาดเต็ม Disk:
# 1. กด n  (New partition)
# 2. กด p  (Primary)
# 3. กด 1  (Partition number 1)
# 4. กด Enter  (First sector — ค่าเริ่มต้น)
# 5. กด Enter  (Last sector — ค่าเริ่มต้น = ใช้พื้นที่ทั้งหมด)
# 6. กด w  (Write and exit)

# ตัวอย่างสร้าง Partition ขนาด 20GB:
# Last sector: +20G

fdisk แบบไม่ Interactive (ใช้ใน Script)

# สร้าง Partition เดียวครอบคลุมพื้นที่ทั้งหมดบน /dev/sdb โดยไม่ต้องพิมพ์ตอบ
echo -e "n\np\n1\n\n\nw" | sudo fdisk /dev/sdb

# ใช้ sfdisk สำหรับ Script ที่ซับซ้อนขึ้น
# สร้าง Partition เดียวขนาดทั้ง Disk
echo ",,L" | sudo sfdisk /dev/sdb
# หรือระบุขนาด:
echo ",20G,L" | sudo sfdisk /dev/sdb   # 20GB Linux partition

# ตรวจสอบหลังสร้าง
lsblk /dev/sdb
sudo fdisk -l /dev/sdb

gdisk — แบ่ง Partition แบบ GPT

# ติดตั้ง gdisk (ถ้ายังไม่มี)
sudo apt install gdisk      # Ubuntu/Debian
sudo dnf install gdisk      # RHEL/Rocky

# เปิด gdisk สำหรับ /dev/sdb
sudo gdisk /dev/sdb

# คำสั่งภายใน gdisk (คล้าย fdisk)
# ?  — แสดงเมนูช่วยเหลือ
# p  — แสดง Partition Table ปัจจุบัน
# n  — สร้าง Partition ใหม่
# d  — ลบ Partition
# t  — เปลี่ยน Partition Type (8300 = Linux filesystem, 8e00 = Linux LVM)
# i  — แสดงรายละเอียด Partition
# w  — บันทึกและออก
# q  — ออกโดยไม่บันทึก

# ตัวอย่างขั้นตอนสร้าง GPT Partition เดียวขนาดทั้ง Disk:
# 1. กด n      (New)
# 2. กด Enter  (Partition number — ค่าเริ่มต้น = 1)
# 3. กด Enter  (First sector)
# 4. กด Enter  (Last sector — ทั้ง Disk)
# 5. กด Enter  (Partition type — 8300 = Linux filesystem)
# 6. กด w      (Write)

# สร้าง GPT แบบไม่ Interactive ด้วย sgdisk
sudo sgdisk -Z /dev/sdb                     # ล้าง Partition Table เดิม
sudo sgdisk -n 1:0:0 -t 1:8300 /dev/sdb    # สร้าง Partition เดียวครอบคลุมทั้ง Disk
sudo sgdisk -n 1:0:+20G -t 1:8300 /dev/sdb # สร้าง Partition ขนาด 20GB

parted — เครื่องมือแบ่ง Partition แบบ Interactive และ Script

# parted รองรับทั้ง MBR และ GPT
# ใช้งานได้ทั้งแบบ Interactive และ Non-interactive

# สร้าง GPT Partition Table ใหม่
sudo parted /dev/sdb mklabel gpt

# สร้าง Partition เดียวขนาดทั้ง Disk
sudo parted /dev/sdb mkpart primary ext4 0% 100%

# สร้าง Partition แบบระบุขนาด
sudo parted /dev/sdb mkpart primary ext4 0% 20GB     # 20GB
sudo parted /dev/sdb mkpart primary ext4 20GB 100%   # ส่วนที่เหลือ

# แสดง Partition Table
sudo parted /dev/sdb print

# ตัวอย่าง Output
# Model: ATA SAMSUNG MZNLN256 (scsi)
# Disk /dev/sdb: 107GB
# Sector size (logical/physical): 512B/512B
# Partition Table: gpt
# Disk Flags:
#
# Number  Start   End     Size    File system  Name     Flags
#  1      1049kB  107GB   107GB   ext4         primary

mkfs — Format Partition

หลังจากแบ่ง Partition แล้ว ต้อง Format ด้วย Filesystem ที่เหมาะสมก่อนจึงจะใช้งานได้

# ext4 — Filesystem มาตรฐาน ใช้งานทั่วไปบน Linux
sudo mkfs.ext4 /dev/sdb1

# ext4 พร้อม Label (ชื่อ Filesystem)
sudo mkfs.ext4 -L "data-disk" /dev/sdb1

# xfs — เหมาะกับ File ขนาดใหญ่และ High-performance I/O
sudo mkfs.xfs /dev/sdb1
sudo mkfs.xfs -L "data-xfs" /dev/sdb1

# btrfs — Filesystem รุ่นใหม่ รองรับ Snapshot และ Compression
sudo mkfs.btrfs /dev/sdb1
sudo mkfs.btrfs -L "data-btrfs" /dev/sdb1

# fat32 — สำหรับ USB Drive หรือ EFI Partition
sudo mkfs.vfat -F32 /dev/sdb1

# ตรวจสอบ Filesystem หลัง Format
sudo blkid /dev/sdb1
# Output: /dev/sdb1: LABEL="data-disk" UUID="a1b2c3d4-..." TYPE="ext4"

# แสดง UUID ของทุก Partition
sudo blkid

เปรียบเทียบ Filesystem

# ext4
# + มาตรฐาน — ทำงานได้กับทุก Linux Distribution
# + Journaling ป้องกันข้อมูลเสียเมื่อระบบ Crash
# + รองรับไฟล์สูงสุด 16TB, Filesystem สูงสุด 1EB
# - ไม่มี Native Snapshot (ต้องใช้ LVM Snapshot แทน)
# เหมาะกับ: ระบบทั่วไป, Web Server, Database

# xfs
# + ประสิทธิภาพสูงกับไฟล์ขนาดใหญ่และ Concurrent I/O
# + รองรับ Filesystem ขนาดใหญ่มาก (สูงสุด 8EB)
# + Quota แบบ Native (User/Group/Project)
# - ไม่สามารถ Shrink Filesystem ได้
# เหมาะกับ: Database, Media Storage, Big Data

# btrfs
# + Copy-on-Write — รองรับ Snapshot อัตโนมัติ
# + Compression แบบ Transparent (zlib, lzo, zstd)
# + Self-healing ด้วย Checksums
# - ประสิทธิภาพต่ำกว่า ext4/xfs ในบางสถานการณ์
# เหมาะกับ: Development, Backup Systems, ระบบที่ต้องการ Snapshot

Mount Partition ชั่วคราวเพื่อทดสอบ

# สร้าง Mount Point
sudo mkdir -p /mnt/newdisk

# Mount Partition
sudo mount /dev/sdb1 /mnt/newdisk

# ตรวจสอบ
df -h /mnt/newdisk
ls /mnt/newdisk

# Unmount
sudo umount /mnt/newdisk

# ดู UUID สำหรับใส่ใน /etc/fstab (Mount ถาวร)
sudo blkid /dev/sdb1
# ใช้ UUID แทน Device Name เพราะ Device Name อาจเปลี่ยนหลัง Reboot

แจ้ง Kernel ให้รับรู้ Partition Table ใหม่

# หลังแก้ไข Partition Table บน Disk ที่ใช้งานอยู่
# Kernel อาจยังไม่รับรู้ Partition ใหม่ ต้องแจ้งให้ Re-read

# วิธีที่ 1: partprobe (แนะนำ — ไม่ต้อง Reboot)
sudo partprobe /dev/sdb

# วิธีที่ 2: blockdev
sudo blockdev --rereadpt /dev/sdb

# ตรวจสอบว่า Kernel รับรู้แล้ว
cat /proc/partitions | grep sdb
lsblk /dev/sdb

ขั้นตอนสมบูรณ์: เพิ่ม Data Disk ใหม่บน Server

#!/bin/bash
# ตัวอย่างขั้นตอนสมบูรณ์สำหรับ /dev/sdb Disk ใหม่

DISK="/dev/sdb"
PARTITION="${DISK}1"
MOUNT="/data"
LABEL="data-disk"

# 1. ตรวจสอบ Disk ที่พบใหม่
echo "=== Disk Info ==="
lsblk "$DISK"
sudo fdisk -l "$DISK"

# 2. สร้าง GPT Partition Table
echo "=== Creating GPT Partition ==="
sudo parted "$DISK" mklabel gpt
sudo parted "$DISK" mkpart primary ext4 0% 100%
sudo partprobe "$DISK"
sleep 1

# 3. Format ด้วย ext4
echo "=== Formatting with ext4 ==="
sudo mkfs.ext4 -L "$LABEL" "$PARTITION"

# 4. สร้าง Mount Point
sudo mkdir -p "$MOUNT"

# 5. Mount ชั่วคราวทดสอบ
sudo mount "$PARTITION" "$MOUNT"
echo "=== Test write ==="
echo "disk test" | sudo tee "$MOUNT/test.txt"
cat "$MOUNT/test.txt"
sudo umount "$MOUNT"

# 6. ดึง UUID สำหรับ fstab
UUID=$(sudo blkid -s UUID -o value "$PARTITION")
echo "UUID: $UUID"

# 7. เพิ่มใน /etc/fstab (ใช้ UUID)
echo "UUID=$UUID  $MOUNT  ext4  defaults  0  2" | sudo tee -a /etc/fstab

# 8. Mount ถาวร
sudo mount -a
df -h "$MOUNT"

การตรวจสอบและซ่อมแซม Filesystem

# ตรวจสอบ Filesystem ext4 (ต้อง Unmount ก่อน)
sudo umount /dev/sdb1
sudo e2fsck -f /dev/sdb1

# ซ่อมแซมอัตโนมัติ (ตอบ yes ทุกคำถาม)
sudo e2fsck -fp /dev/sdb1

# ตรวจสอบ XFS (ต้อง Unmount ก่อน)
sudo xfs_check /dev/sdb1    # เก่า
sudo xfs_repair /dev/sdb1   # ซ่อมแซม

# ปรับ Filesystem ext4 (เช่น เปลี่ยน Label หรือ Reserved space)
sudo tune2fs -L "new-label" /dev/sdb1
sudo tune2fs -m 1 /dev/sdb1     # Reserved block = 1% (ค่าเริ่มต้น 5%)
sudo tune2fs -l /dev/sdb1       # แสดง Filesystem info

# ขยาย ext4 หลังขยาย Partition (ไม่ต้อง Unmount ถ้า Kernel รองรับ)
sudo resize2fs /dev/sdb1

# ขยาย XFS (ต้อง Mount อยู่)
sudo xfs_growfs /data

สรุป

การแบ่ง Partition เริ่มจากการตรวจสอบ Disk ด้วย lsblk และ fdisk -l ก่อนเสมอ สำหรับ Disk ใหม่แนะนำใช้ GPT ผ่าน gdisk, sgdisk หรือ parted เพราะรองรับ Disk ขนาดใหญ่กว่า 2TB และสร้าง Partition ได้มากกว่า หลังแบ่ง Partition ให้ Format ด้วย mkfs.ext4 หรือ mkfs.xfs ขึ้นอยู่กับ Workload — ext4 เหมาะกับระบบทั่วไป, xfs เหมาะกับ Large File และ High I/O การใช้ UUID ใน /etc/fstab แทน Device Name เป็น Best Practice เพราะ Device Name อาจเปลี่ยนแปลงได้หลัง Reboot

แนะนำบริการ DE

การแบ่ง Partition และ Format Disk บน Server ต้องการสิทธิ์ Root เพื่อใช้คำสั่ง fdisk, gdisk และ mkfs Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบพร้อมความสามารถในการเพิ่ม Volume Storage และ Attach Disk ใหม่ได้โดยไม่ต้อง Downtime เหมาะสำหรับ System Administrator ที่ต้องการควบคุม Storage Layout อย่างอิสระ

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Disk Partition เอง Cloud Hosting ของ DE มีระบบจัดการ Storage อัตโนมัติและสามารถ Upgrade พื้นที่ได้ผ่าน Control Panel