<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Usama Tanoli</title>
    <description>The latest articles on DEV Community by Usama Tanoli (@usama_tanoli_09c087b33ee9).</description>
    <link>https://dev.to/usama_tanoli_09c087b33ee9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3696854%2F5594a704-fc0c-444a-8704-338addc60d06.jpg</url>
      <title>DEV Community: Usama Tanoli</title>
      <link>https://dev.to/usama_tanoli_09c087b33ee9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/usama_tanoli_09c087b33ee9"/>
    <language>en</language>
    <item>
      <title>🪣 Thin Provisioning in LVM – Complete Step by Step Tutorial</title>
      <dc:creator>Usama Tanoli</dc:creator>
      <pubDate>Tue, 06 Jan 2026 17:55:38 +0000</pubDate>
      <link>https://dev.to/usama_tanoli_09c087b33ee9/thin-provisioning-in-lvm-complete-step-by-step-tutorial-583c</link>
      <guid>https://dev.to/usama_tanoli_09c087b33ee9/thin-provisioning-in-lvm-complete-step-by-step-tutorial-583c</guid>
      <description>&lt;p&gt;🪣 Buckets of Water Example&lt;br&gt;
Imagine you have 3 friends. Each one asks you for a 1-liter bucket of water.&lt;br&gt;
But you only have 2 liters of water.&lt;/p&gt;

&lt;p&gt;Instead of saying “no,” you give each friend an empty bucket and say:&lt;br&gt;
👉 “Don’t worry, I’ll fill it only when you actually need it.”&lt;/p&gt;

&lt;p&gt;This is thin provisioning.&lt;br&gt;
You promise more than you physically have, but only allocate space when needed.&lt;/p&gt;

&lt;p&gt;💾 In Storage Terms&lt;br&gt;
Normal provisioning (thick):&lt;br&gt;
If you create a 1 GB volume, the system immediately reserves 1 GB — even if you only store 10 MB. Wasteful.&lt;/p&gt;

&lt;p&gt;Thin provisioning:&lt;br&gt;
If you create a 1 GB thin volume, the system only uses space when you actually write data. If you write 10 MB, it consumes just 10 MB from the pool. Efficient.⚖️ Thin Provisioning vs. Thick Provisioning&lt;/p&gt;

&lt;p&gt;Thick provisioning (traditional): Space is fully reserved upfront, whether you use it or not.&lt;/p&gt;

&lt;p&gt;Thin provisioning: Space is allocated on demand, saving storage until it’s actually required.&lt;/p&gt;

&lt;p&gt;🚀 Step by Step Implementation&lt;br&gt;
We’ll start with a 10 GB disk (/dev/sda), create a 5 GB partition (/dev/sda1), build a thin pool (3 GB), then test how space is consumed.&lt;/p&gt;

&lt;p&gt;1️⃣ Add New Disk&lt;br&gt;
We attach a 10 GB disk (/dev/sda).&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
lsblk&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
`&lt;br&gt;
Output:&lt;/p&gt;

&lt;p&gt;NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS&lt;br&gt;
sda    8:0    0  10G  0 disk&lt;/p&gt;

&lt;p&gt;2️⃣ Create a Partition&lt;br&gt;
Make a 5 GB partition and set type to Linux LVM (8e).&lt;/p&gt;

&lt;p&gt;fdisk /dev/sda&lt;/p&gt;

&lt;p&gt;Inside fdisk:&lt;/p&gt;

&lt;p&gt;n → new&lt;br&gt;
p → primary&lt;br&gt;
+5G → size&lt;br&gt;
t → change type → 8e&lt;br&gt;
w → write&lt;/p&gt;

&lt;p&gt;Sync partition table:&lt;/p&gt;

&lt;p&gt;partprobe /dev/sda&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;lsblk&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;sda   10G&lt;br&gt;
└─sda1 5G&lt;/p&gt;

&lt;p&gt;3️⃣ Create PV and VG&lt;br&gt;
Turn partition into a physical volume (PV):&lt;/p&gt;

&lt;p&gt;pvcreate /dev/sda1&lt;/p&gt;

&lt;p&gt;Create a volume group (VG):&lt;/p&gt;

&lt;p&gt;vgcreate thin_vg /dev/sda1&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;vgs&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;VG       #PV #LV #SN Attr   VSize VFree&lt;br&gt;
thin_vg   1   0   0 wz--n- 5.00g 5.00g&lt;/p&gt;

&lt;p&gt;4️⃣ Create Thin Pool&lt;br&gt;
We’ll make a 3 GB thin pool.&lt;/p&gt;

&lt;p&gt;lvcreate -L 3G --thinpool tp_usama_pool thin_vg&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;lvs&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;LV            VG      Attr       LSize Pool Origin Data%  Meta%&lt;br&gt;
tp_usama_pool thin_vg twi-a-tz-- 3.00g             0.00   11.13&lt;/p&gt;

&lt;p&gt;5️⃣ Create Thin LVs&lt;br&gt;
Let’s create 3 LVs of 1 GB each.&lt;/p&gt;

&lt;p&gt;lvcreate -V 1G --thin -n thin_vol1 thin_vg/tp_usama_pool&lt;br&gt;
lvcreate -V 1G --thin -n thin_vol2 thin_vg/tp_usama_pool&lt;br&gt;
lvcreate -V 1G --thin -n thin_vol3 thin_vg/tp_usama_pool&lt;/p&gt;

&lt;p&gt;6️⃣ Format and Mount&lt;br&gt;
Format:&lt;/p&gt;

&lt;p&gt;mkfs.ext4 /dev/thin_vg/thin_vol1&lt;br&gt;
mkfs.ext4 /dev/thin_vg/thin_vol2&lt;br&gt;
mkfs.ext4 /dev/thin_vg/thin_vol3&lt;/p&gt;

&lt;p&gt;Create mount points:&lt;/p&gt;

&lt;p&gt;mkdir -p /mnt/vol1 /mnt/vol2 /mnt/vol3&lt;/p&gt;

&lt;p&gt;Mount:&lt;/p&gt;

&lt;p&gt;for i in 1 2 3; do&lt;br&gt;
  mount /dev/thin_vg/thin_vol$i /mnt/vol$i&lt;br&gt;
done&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;df -hT&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;/dev/mapper/thin_vg-thin_vol1 ext4 974M 24K 907M 1% /mnt/vol1&lt;br&gt;
/dev/mapper/thin_vg-thin_vol2 ext4 974M 24K 907M 1% /mnt/vol2&lt;br&gt;
/dev/mapper/thin_vg-thin_vol3 ext4 974M 24K 907M 1% /mnt/vol3&lt;/p&gt;

&lt;p&gt;7️⃣ Test by Writing Data&lt;br&gt;
Let’s write 500 MB to each LV.&lt;/p&gt;

&lt;p&gt;for d in /mnt/vol1 /mnt/vol2 /mnt/vol3; do&lt;br&gt;
  dd if=/dev/zero of=$d/testfile.txt bs=1M count=500 status=progress&lt;br&gt;
done&lt;/p&gt;

&lt;p&gt;Now check usage:&lt;/p&gt;

&lt;p&gt;lvs&lt;/p&gt;

&lt;p&gt;Output (Data% increased):&lt;/p&gt;

&lt;p&gt;thin_vol1 thin_vg Vwi-aotz-- 1.00g tp_usama_pool 53.61&lt;br&gt;
thin_vol2 thin_vg Vwi-aotz-- 1.00g tp_usama_pool 53.61&lt;br&gt;
thin_vol3 thin_vg Vwi-aotz-- 1.00g tp_usama_pool 53.61&lt;br&gt;
tp_usama_pool thin_vg twi-aotz-- 3.00g 53.61 23.44&lt;/p&gt;

&lt;p&gt;8️⃣ Create Another LV – Warning&lt;br&gt;
Now try adding another 1 GB LV:&lt;/p&gt;

&lt;p&gt;lvcreate -V 1G --thin -n thin_vol4 thin_vg/tp_usama_pool&lt;/p&gt;

&lt;p&gt;Warning:&lt;/p&gt;

&lt;p&gt;Sum of all thin volume sizes (4.00 GiB) exceeds the size of thin pool (3.00 GiB)&lt;/p&gt;

&lt;p&gt;This is expected – thin provisioning allows it, but be careful.&lt;/p&gt;

&lt;p&gt;9️⃣ Try to Extend Thin Pool (Fails)&lt;br&gt;
Check free VG space:&lt;/p&gt;

&lt;p&gt;vgs&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;thin_vg   1 5 0 wz--n- 5.00g 1.98g&lt;/p&gt;

&lt;p&gt;Now try extending by 2G:&lt;/p&gt;

&lt;p&gt;lvextend -L +2G /dev/thin_vg/tp_usama_pool&lt;/p&gt;

&lt;p&gt;Error:&lt;/p&gt;

&lt;p&gt;Insufficient free space&lt;/p&gt;

&lt;p&gt;🔟 Add Another Partition and Extend&lt;br&gt;
Let’s add another 5 GB partition (/dev/sda2).&lt;/p&gt;

&lt;p&gt;fdisk /dev/sda&lt;/p&gt;

&lt;h1&gt;
  
  
  n → new → p → 2 → +5G → w
&lt;/h1&gt;

&lt;p&gt;partprobe /dev/sda&lt;/p&gt;

&lt;p&gt;Create PV:&lt;/p&gt;

&lt;p&gt;pvcreate /dev/sda2&lt;/p&gt;

&lt;p&gt;Extend VG:&lt;/p&gt;

&lt;p&gt;vgextend thin_vg /dev/sda2&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;vgs&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;thin_vg  2 5 0 wz--n- 9.99g 6.98g&lt;/p&gt;

&lt;p&gt;Now extend thin pool:&lt;/p&gt;

&lt;p&gt;lvextend -L +2G /dev/thin_vg/tp_usama_pool&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;Size changed from 3.00 GiB → 5.00 GiB&lt;/p&gt;

&lt;p&gt;🔍 Monitoring&lt;br&gt;
Check thin pool and LV usage:&lt;/p&gt;

&lt;p&gt;lvs&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;lvs&lt;br&gt;
  LV            VG      Attr       LSize   Pool          Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br&gt;&lt;br&gt;
  thin_vol1     thin_vg Vwi-aotz--   1.00g tp_usama_pool        53.61&lt;br&gt;&lt;br&gt;
  thin_vol2     thin_vg Vwi-aotz--   1.00g tp_usama_pool        53.61&lt;br&gt;&lt;br&gt;
  thin_vol3     thin_vg Vwi-aotz--   1.00g tp_usama_pool        53.61&lt;br&gt;&lt;br&gt;
  thin_vol4     thin_vg Vwi-a-tz--   1.00g tp_usama_pool        0.00&lt;br&gt;&lt;br&gt;
  tp_usama_pool thin_vg twi-aotz--   5.00g                      32.17  16.85&lt;/p&gt;

&lt;p&gt;Detailed:&lt;/p&gt;

&lt;p&gt;lvdisplay thin_vg/tp_usama_pool&lt;/p&gt;

&lt;p&gt;lvdisplay thin_vg/tp_usama_pool&lt;br&gt;
  --- Logical volume ---&lt;br&gt;
  LV Name                tp_usama_pool&lt;br&gt;
  VG Name                thin_vg&lt;br&gt;
  LV UUID                nURAHU-0hld-xjOF-97cR-1srt-JdRH-YRcCsE&lt;br&gt;
  LV Write Access        read/write (activated read only)&lt;br&gt;
  LV Creation host, time localhost.localdomain, 2025-09-22 22:07:39 +0500&lt;br&gt;
  LV Pool metadata       tp_usama_pool_tmeta&lt;br&gt;
  LV Pool data           tp_usama_pool_tdata&lt;br&gt;
  LV Status              available&lt;br&gt;
  # open                 0&lt;br&gt;
  LV Size                5.00 GiB&lt;br&gt;
  Allocated pool data    32.17%&lt;br&gt;
  Allocated metadata     16.85%&lt;br&gt;
  Current LE             1280&lt;br&gt;
  Segments               1&lt;br&gt;
  Allocation             inherit&lt;br&gt;
  Read ahead sectors     auto&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;currently set to     256
Block device           253:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎯 Conclusion&lt;br&gt;
Thin provisioning lets you over-commit space safely.&lt;/p&gt;

&lt;p&gt;Only used data consumes real storage.&lt;/p&gt;

&lt;p&gt;If the pool gets full, writes fail → monitor regularly.&lt;/p&gt;

&lt;p&gt;You can always add new disks / partitions and extend the pool.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
