Fdisk is a partition table manipulator for Linux. Linux partitioning with fdisk is quick and simple. We can view, create, modify and delete partitions using fdisk from the Linux command line. In this post i will explain how to manage Linux partitioning with fdisk. I will view existing partitions on system, add a new hard disk, create new partitions, modify partitions system ID and delete partitions.
Let’s start our Linux partitioning with fdisk guide!
1. Viewing existing partitions with fdisk
To list the existing partitions on your hard disk we use “fdisk -l” command. “Fdisk -l” lists the partition tables for the specified devices and then exit. If no devices are given, those mentioned in /proc/partitions (if that exists) are used.
Let’s see an example:
[root@foo ~]# fdisk -l
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000add51
Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 1959 15215616 8e Linux LVM
Disk /dev/mapper/vg_foo-LogVol01: 14.0 GB, 14004781056 bytes 255 heads, 63 sectors/track, 1702 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
Disk /dev/mapper/vg_foo-LogVol00: 1572 MB, 1572864000 bytes 255 heads, 63 sectors/track, 191 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
We can see, that this system has one disk /dev/sda the size of 16.1 GB. There are two partitions created on this disk:
- /dev/sda1
This is the first partition which is a bootable partition (this is the * at “Boot” column). This partition starts at cylinder 1 and ends at cylinder 64. It takes 512000 Blocks on disk and has the ID 83 which means it is a Linux partition (seen in the “System” column).
- /dev/sda2
This is the second partition and it starts at 64 cylinder and ends at 1959. It takes 15215616 Blocks on disk and has the ID 8e which means it is a Linux LVM partition.
We see the error “Partition 1 does not end on cylinder boundary.” This is not a big deal. Drives have not used cylinder boundaries since hard drives exceeded 8GB and BIOS uses LBA or large block allocation. But all the partition tools thru Linux & Win installs still followed cylinders so partition tools never changed the error messages.
We also see two more disks called /dev/mapper/vg_foo-LogVol01 and /dev/mapper/vg_foo-LogVol00 but these disks are actually mapped and located on /dev/sda disk (mind the “mapper” in the name). This is an additional layer on top of our /dev/sda disk. We can create this kind of mapped disk using LVM (Logical Volume Management). Since this is not the topic of this post we won’t lose time on this… I am preparing a separate post on Logical Volume Management on CentOS.
We will now add another hard disk to our system. Let’s check “fdisk -l” output again:
[root@foo ~]# fdisk -l
Disk /dev/sda: 16.1 GB, 16106127360 bytes 255 heads, 63 sectors/track, 1958 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000add51
Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 1959 15215616 8e Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x08040000
Disk /dev/mapper/vg_foo-LogVol01: 14.0 GB, 14004781056 bytes 255 heads, 63 sectors/track, 1702 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
Disk /dev/mapper/vg_foo-LogVol00: 1572 MB, 1572864000 bytes 255 heads, 63 sectors/track, 191 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
We can see that there is a new /dev/sdb hard disk the size of 1073MB without any partitions on it. In order to use the disk and create a filesystem we need to create a partition on it.
2. Creating a new partition with fdisk
To start linux partitioning for a desired hard drive we must enter a command “fdisk /dev/harddrive“.
Here is an example:
[root@foo ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x7973a9ad. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').
Command (m for help):
Since this is a completely fresh hard drive it does not even have a partition table present. This is what the error is about - ignore it. We can hit "m" for a quick list of fdisk help:
Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)
I think help is self explanatory. Since we want to create a new partition, we need to enter “n”.
Command (m for help): n Command action e extended p primary partition (1-4) p
We will be creating a primary partition this is why we entered “p”. One hard drive can only hold 4 primary partitions – to increase the number of partitions over 4, the 4th partition should be made an extended partition. If we continue…
Partition number (1-4): 1 First cylinder (1-130, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +500M
Partition number is the /dev/sdbX number. Since this is the first partition on this hard drive, the partition number is 1 (/dev/sdb1). The first partition will start at the first cylinder (just press “Enter” and first cylinder is the default value) and the last cylinder may be entered as the number of cylinder or the size of partition. We have entered “+500M” so our partition will be 500MB large (mind the “+” in front of the partition size!!). You can also enter the size in Kilobytes (K) and Gigabytes (G).
No changes have yet been done to the disk and partitions until we write changes out. We can see what we did with the “p” key:
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux
We can see a new partition on /dev/sdb hard drive. Now i want to create another partition on the same disk but with different partition system ID. Let’s try and do that:
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (66-130, default 66): Using default value 66 Last cylinder, +cylinders or +size{K,M,G} (66-130, default 130): Using default value 130
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 130 522112+ 83 Linux
OK. So we can now see two new partitions on /dev/sdb. We can see the start and end cylinder and the partition system ID. For cylinders (size) we used the default values by entering “Enter“. Both partitions ID is 83 which means it is a Linux partition. Let’s change the partitions system ID:
Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)
Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx 5 Extended 42 SFS 86 NTFS volume set da Non-FS data 6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt 9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT f W95 Ext'd (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT 1e Hidden W95 FAT1
Hex code (type L to list codes): 82 Changed system type of partition 2 to 82 (Linux swap / Solaris)
As we can see, we must enter “t” for partitionss system ID change. Next we must enter the number of the partition which ID we want to change – in our case this is partition number 2 (/dev/sdb2). Next we list the codes of partition’s system ID with “L” and choose the one we like. We have changed our /dev/sdb2 system ID to “Linux swap“. Let’s check if we successfully changed the ID:
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 130 522112+ 82 Linux swap / Solaris
We are now satisfied with the partitioning of the /dev/sdb hard drive and can write changes out by entering “w”. DO NOT FORGET to write changes out. If you hit “q” to quit, all changes are lost!
Command (m for help): w The partition table has been altered!
Calling ioctl() to re-read partition table. Syncing disks.
If we check for partitions, we see that our changes have been written out and our partitions exist. To start using them you still need to create a filesystem. This is not the topic of this post – i will try to cover it in a post about filesystem creationg on Linux.
[root@foo ~]# fdisk -l
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000add51
Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 1959 15215616 8e Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 130 522112+ 82 Linux swap / Solaris
Disk /dev/mapper/vg_foo-LogVol01: 14.0 GB, 14004781056 bytes 255 heads, 63 sectors/track, 1702 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
Disk /dev/mapper/vg_foo-LogVol00: 1572 MB, 1572864000 bytes 255 heads, 63 sectors/track, 191 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
3. Delete partition with fdisk
To start linux partitioning for a desired hard drive we must enter a command “fdisk /dev/harddrive“.
[root@foo ~]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 130 522112+ 82 Linux swap / Solaris
We enter “p” to print out the existing partitions on /dev/sdb hard drive. We can hit “m” for a quick list of fdisk help:
Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)
Again, help is self explanatory. To delete a partition we need to enter “d”.
Command (m for help): d Partition number (1-4): 2
After entering “d” we need to choose the partition number we want to delete. We need to delete partitions in the order they were created! We chose to delete partition number 2 (/dev/sdb2). We can now check partitions again:
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux
We can see, that partition 2 (/dev/sdb2) no longer exists – it was deleted. Now we can delete the first partition too, if we choose to..
Command (m for help): d Selected partition 1
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System
After making changes to with fdisk linux partitioning we MUST ALWAYS CONFIRM changes with “w” – write out. DO NOT FORGET TO WRITE OUT!
Command (m for help): w The partition table has been altered!
Calling ioctl() to re-read partition table. Syncing disks.
Last check to see, if changes were successfully applied with “fdisk -l“:
[root@foo ~]# fdisk -l
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000add51
Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 1959 15215616 8e Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x7973a9ad
Device Boot Start End Blocks Id System
Disk /dev/mapper/vg_foo-LogVol01: 14.0 GB, 14004781056 bytes 255 heads, 63 sectors/track, 1702 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
Disk /dev/mapper/vg_foo-LogVol00: 1572 MB, 1572864000 bytes 255 heads, 63 sectors/track, 191 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
This was a quick guide on how to use fdisk for linux partitioning on CentOS 6. You can do alot more with fdisk regarding the partitions. Fdisk help can be very useful so do not hesitate to read it!
..and do not forget to always write your changes to partition changes with “w”!