[{"data":1,"prerenderedAt":2256},["ShallowReactive",2],{"page-\u002Flinux\u002F09-storage-and-filesystems":3},{"id":4,"title":5,"body":6,"description":2249,"extension":2250,"meta":2251,"navigation":517,"path":2252,"seo":2253,"stem":2254,"__hash__":2255},"content\u002Flinux\u002F09-storage-and-filesystems.md","09 — Storage & Filesystems",{"type":7,"value":8,"toc":2214},"minimark",[9,13,22,27,175,179,267,324,328,376,450,458,545,550,613,622,629,675,683,727,731,841,845,848,935,1176,1180,1207,1211,1314,1482,1486,1508,1514,1578,1584,1636,1640,1721,1728,1807,1814,1841,1845,1926,1930,2049,2053,2060,2210],[10,11,5],"h1",{"id":12},"_09-storage-filesystems",[14,15,16,17,21],"p",{},"Storage is where data lives persistently. This chapter covers disks, partitions, filesystems, mounting, LVM, RAID, ",[18,19,20],"code",{},"fsck",", and SMART — core sysadmin skills where mistakes cause the most damage (data loss).",[23,24,26],"h2",{"id":25},"the-storage-stack","The Storage Stack",[28,29,31],"code-wrapper",{"language":30},"bash",[32,33,37],"pre",{"className":34,"code":35,"language":30,"meta":36,"style":36},"language-bash shiki shiki-themes github-light github-dark","┌─────────────────────────────────────┐\n│  Filesystem (ext4, xfs, btrfs...)   │  ← what you mount\n├─────────────────────────────────────┤\n│  LVM Logical Volume (optional)      │  ← flexible virtual disk\n├─────────────────────────────────────┤\n│  Partition (sda1, sda2)             │  ← slice of a disk\n├─────────────────────────────────────┤\n│  Block Device (sda, nvme0n1)        │  ← the physical disk\n├─────────────────────────────────────┤\n│  Hardware (SATA, NVMe, USB, RAID)   │\n└─────────────────────────────────────┘\n","",[18,38,39,48,71,77,94,99,116,121,141,146,169],{"__ignoreMap":36},[40,41,44],"span",{"class":42,"line":43},"line",1,[40,45,47],{"class":46},"sIsaT","┌─────────────────────────────────────┐\n",[40,49,51,54,58,62,65,68],{"class":42,"line":50},2,[40,52,53],{"class":46},"│",[40,55,57],{"class":56},"sJ6F3","  Filesystem",[40,59,61],{"class":60},"ssxIu"," (ext4, ",[40,63,64],{"class":56},"xfs,",[40,66,67],{"class":56}," btrfs...",[40,69,70],{"class":60},")   │  ← what you mount\n",[40,72,74],{"class":42,"line":73},3,[40,75,76],{"class":46},"├─────────────────────────────────────┤\n",[40,78,80,82,85,88,91],{"class":42,"line":79},4,[40,81,53],{"class":46},[40,83,84],{"class":56},"  LVM",[40,86,87],{"class":56}," Logical",[40,89,90],{"class":56}," Volume",[40,92,93],{"class":60}," (optional)      │  ← flexible virtual disk\n",[40,95,97],{"class":42,"line":96},5,[40,98,76],{"class":46},[40,100,102,104,107,110,113],{"class":42,"line":101},6,[40,103,53],{"class":46},[40,105,106],{"class":56},"  Partition",[40,108,109],{"class":60}," (sda1, ",[40,111,112],{"class":56},"sda2",[40,114,115],{"class":60},")             │  ← slice of a disk\n",[40,117,119],{"class":42,"line":118},7,[40,120,76],{"class":46},[40,122,124,126,129,132,135,138],{"class":42,"line":123},8,[40,125,53],{"class":46},[40,127,128],{"class":56},"  Block",[40,130,131],{"class":56}," Device",[40,133,134],{"class":60}," (sda, ",[40,136,137],{"class":56},"nvme0n1",[40,139,140],{"class":60},")        │  ← the physical disk\n",[40,142,144],{"class":42,"line":143},9,[40,145,76],{"class":46},[40,147,149,151,154,157,160,163,166],{"class":42,"line":148},10,[40,150,53],{"class":46},[40,152,153],{"class":56},"  Hardware",[40,155,156],{"class":60}," (SATA, ",[40,158,159],{"class":56},"NVMe,",[40,161,162],{"class":56}," USB,",[40,164,165],{"class":56}," RAID",[40,167,168],{"class":60},")   │\n",[40,170,172],{"class":42,"line":171},11,[40,173,174],{"class":46},"└─────────────────────────────────────┘\n",[23,176,178],{"id":177},"block-devices","Block Devices",[180,181,182,198],"table",{},[183,184,185],"thead",{},[186,187,188,192,195],"tr",{},[189,190,191],"th",{},"Device",[189,193,194],{},"Interface",[189,196,197],{},"Name Pattern",[199,200,201,222,238,254],"tbody",{},[186,202,203,207,210],{},[204,205,206],"td",{},"SATA, SCSI, USB",[204,208,209],{},"SATA\u002FSCSI",[204,211,212,215,216,215,219],{},[18,213,214],{},"\u002Fdev\u002Fsda",", ",[18,217,218],{},"\u002Fdev\u002Fsdb",[18,220,221],{},"\u002Fdev\u002Fsda1",[186,223,224,227,230],{},[204,225,226],{},"NVMe",[204,228,229],{},"PCIe",[204,231,232,215,235],{},[18,233,234],{},"\u002Fdev\u002Fnvme0n1",[18,236,237],{},"\u002Fdev\u002Fnvme0n1p1",[186,239,240,243,246],{},[204,241,242],{},"MMC\u002FSD",[204,244,245],{},"SD card",[204,247,248,215,251],{},[18,249,250],{},"\u002Fdev\u002Fmmcblk0",[18,252,253],{},"\u002Fdev\u002Fmmcblk0p1",[186,255,256,259,262],{},[204,257,258],{},"Loop",[204,260,261],{},"Image file",[204,263,264],{},[18,265,266],{},"\u002Fdev\u002Floop0",[28,268,269],{"language":30},[32,270,272],{"className":34,"code":271,"language":30,"meta":36,"style":36},"lsblk -f               # tree view: devices + partitions + FS type + UUID + mount\nsudo fdisk -l          # list all disks + partition tables\nsudo parted -l         # same, different format\ncat \u002Fproc\u002Fpartitions   # kernel's view of partitions\n",[18,273,274,287,301,313],{"__ignoreMap":36},[40,275,276,279,283],{"class":42,"line":43},[40,277,278],{"class":46},"lsblk",[40,280,282],{"class":281},"snvgF"," -f",[40,284,286],{"class":285},"sdCPZ","               # tree view: devices + partitions + FS type + UUID + mount\n",[40,288,289,292,295,298],{"class":42,"line":50},[40,290,291],{"class":46},"sudo",[40,293,294],{"class":56}," fdisk",[40,296,297],{"class":281}," -l",[40,299,300],{"class":285},"          # list all disks + partition tables\n",[40,302,303,305,308,310],{"class":42,"line":73},[40,304,291],{"class":46},[40,306,307],{"class":56}," parted",[40,309,297],{"class":281},[40,311,312],{"class":285},"         # same, different format\n",[40,314,315,318,321],{"class":42,"line":79},[40,316,317],{"class":46},"cat",[40,319,320],{"class":56}," \u002Fproc\u002Fpartitions",[40,322,323],{"class":285},"   # kernel's view of partitions\n",[23,325,327],{"id":326},"partitioning","Partitioning",[180,329,330,346],{},[183,331,332],{},[186,333,334,337,340,343],{},[189,335,336],{},"Table",[189,338,339],{},"Max Disks",[189,341,342],{},"Max Partitions",[189,344,345],{},"Notes",[199,347,348,362],{},[186,349,350,353,356,359],{},[204,351,352],{},"MBR (DOS)",[204,354,355],{},"2 TB",[204,357,358],{},"4 primary (or 3 + 1 extended with logicals)",[204,360,361],{},"Legacy",[186,363,364,367,370,373],{},[204,365,366],{},"GPT",[204,368,369],{},"8 ZB",[204,371,372],{},"128 (typical)",[204,374,375],{},"Modern, required for UEFI boot",[28,377,378],{"language":30},[32,379,381],{"className":34,"code":380,"language":30,"meta":36,"style":36},"# Complex Implementation: scriptable GPT partitioning with sgdisk\nsudo sgdisk -Z \u002Fdev\u002Fsdb                    # zap all partitions\nsudo sgdisk -n 1:0:0 \u002Fdev\u002Fsdb             # partition 1, whole disk\nsudo sgdisk -t 1:8e00 \u002Fdev\u002Fsdb            # type = Linux LVM\nsudo partprobe \u002Fdev\u002Fsdb                    # tell kernel about new partitions\n",[18,382,383,388,404,421,438],{"__ignoreMap":36},[40,384,385],{"class":42,"line":43},[40,386,387],{"class":285},"# Complex Implementation: scriptable GPT partitioning with sgdisk\n",[40,389,390,392,395,398,401],{"class":42,"line":50},[40,391,291],{"class":46},[40,393,394],{"class":56}," sgdisk",[40,396,397],{"class":281}," -Z",[40,399,400],{"class":56}," \u002Fdev\u002Fsdb",[40,402,403],{"class":285},"                    # zap all partitions\n",[40,405,406,408,410,413,416,418],{"class":42,"line":73},[40,407,291],{"class":46},[40,409,394],{"class":56},[40,411,412],{"class":281}," -n",[40,414,415],{"class":56}," 1:0:0",[40,417,400],{"class":56},[40,419,420],{"class":285},"             # partition 1, whole disk\n",[40,422,423,425,427,430,433,435],{"class":42,"line":79},[40,424,291],{"class":46},[40,426,394],{"class":56},[40,428,429],{"class":281}," -t",[40,431,432],{"class":56}," 1:8e00",[40,434,400],{"class":56},[40,436,437],{"class":285},"            # type = Linux LVM\n",[40,439,440,442,445,447],{"class":42,"line":96},[40,441,291],{"class":46},[40,443,444],{"class":56}," partprobe",[40,446,400],{"class":56},[40,448,449],{"class":285},"                    # tell kernel about new partitions\n",[23,451,453,454,457],{"id":452},"creating-filesystems-mkfs","Creating Filesystems (",[18,455,456],{},"mkfs",")",[28,459,460],{"language":30},[32,461,463],{"className":34,"code":462,"language":30,"meta":36,"style":36},"# Complex Implementation: data disk with tuned inode count + no reserved space\nsudo mkfs.ext4 -L data -m 0 -i 4096 \u002Fdev\u002Fsdb1\n# -L data: filesystem label\n# -m 0: no reserved blocks (default 5% reserved for root — wastes 200GB on a 4TB disk)\n# -i 4096: one inode per 4 KB (for many small files; default 16384)\n\nsudo mkfs.xfs \u002Fdev\u002Fsdb2                  # XFS (RHEL default)\nsudo mkswap \u002Fdev\u002Fsdb7                    # swap\n",[18,464,465,470,498,503,508,513,519,532],{"__ignoreMap":36},[40,466,467],{"class":42,"line":43},[40,468,469],{"class":285},"# Complex Implementation: data disk with tuned inode count + no reserved space\n",[40,471,472,474,477,480,483,486,489,492,495],{"class":42,"line":50},[40,473,291],{"class":46},[40,475,476],{"class":56}," mkfs.ext4",[40,478,479],{"class":281}," -L",[40,481,482],{"class":56}," data",[40,484,485],{"class":281}," -m",[40,487,488],{"class":281}," 0",[40,490,491],{"class":281}," -i",[40,493,494],{"class":281}," 4096",[40,496,497],{"class":56}," \u002Fdev\u002Fsdb1\n",[40,499,500],{"class":42,"line":73},[40,501,502],{"class":285},"# -L data: filesystem label\n",[40,504,505],{"class":42,"line":79},[40,506,507],{"class":285},"# -m 0: no reserved blocks (default 5% reserved for root — wastes 200GB on a 4TB disk)\n",[40,509,510],{"class":42,"line":96},[40,511,512],{"class":285},"# -i 4096: one inode per 4 KB (for many small files; default 16384)\n",[40,514,515],{"class":42,"line":101},[40,516,518],{"emptyLinePlaceholder":517},true,"\n",[40,520,521,523,526,529],{"class":42,"line":118},[40,522,291],{"class":46},[40,524,525],{"class":56}," mkfs.xfs",[40,527,528],{"class":56}," \u002Fdev\u002Fsdb2",[40,530,531],{"class":285},"                  # XFS (RHEL default)\n",[40,533,534,536,539,542],{"class":42,"line":123},[40,535,291],{"class":46},[40,537,538],{"class":56}," mkswap",[40,540,541],{"class":56}," \u002Fdev\u002Fsdb7",[40,543,544],{"class":285},"                    # swap\n",[546,547,549],"h3",{"id":548},"xfs-vs-ext4","XFS vs ext4",[180,551,552,565],{},[183,553,554],{},[186,555,556,559,562],{},[189,557,558],{},"Feature",[189,560,561],{},"ext4",[189,563,564],{},"XFS",[199,566,567,578,592,602],{},[186,568,569,572,575],{},[204,570,571],{},"Default on",[204,573,574],{},"Debian\u002FUbuntu",[204,576,577],{},"RHEL\u002FRocky",[186,579,580,583,586],{},[204,581,582],{},"Shrink",[204,584,585],{},"Yes (offline)",[204,587,588],{},[589,590,591],"strong",{},"No",[186,593,594,597,600],{},[204,595,596],{},"Grow",[204,598,599],{},"Yes (online)",[204,601,599],{},[186,603,604,607,610],{},[204,605,606],{},"Large files",[204,608,609],{},"Good",[204,611,612],{},"Excellent",[14,614,615,618,619,621],{},[589,616,617],{},"XFS can't shrink."," If you need a smaller XFS, you must back up, ",[18,620,456],{}," anew, and restore. Choose filesystem based on whether you might need to shrink.",[23,623,625,626],{"id":624},"mounting-and-etcfstab","Mounting and ",[18,627,628],{},"\u002Fetc\u002Ffstab",[28,630,631],{"language":30},[32,632,634],{"className":34,"code":633,"language":30,"meta":36,"style":36},"# Complex Implementation: production fstab with UUID, noatime, and nofail\n# UUID=abcd-1234  \u002Fdata    ext4   defaults,noatime,nofail  0  2\n\n# Validate BEFORE rebooting (prevents emergency mode):\nsudo findmnt --verify\nsudo mount -a\n",[18,635,636,641,646,650,655,665],{"__ignoreMap":36},[40,637,638],{"class":42,"line":43},[40,639,640],{"class":285},"# Complex Implementation: production fstab with UUID, noatime, and nofail\n",[40,642,643],{"class":42,"line":50},[40,644,645],{"class":285},"# UUID=abcd-1234  \u002Fdata    ext4   defaults,noatime,nofail  0  2\n",[40,647,648],{"class":42,"line":73},[40,649,518],{"emptyLinePlaceholder":517},[40,651,652],{"class":42,"line":79},[40,653,654],{"class":285},"# Validate BEFORE rebooting (prevents emergency mode):\n",[40,656,657,659,662],{"class":42,"line":96},[40,658,291],{"class":46},[40,660,661],{"class":56}," findmnt",[40,663,664],{"class":281}," --verify\n",[40,666,667,669,672],{"class":42,"line":101},[40,668,291],{"class":46},[40,670,671],{"class":56}," mount",[40,673,674],{"class":281}," -a\n",[546,676,678,679,682],{"id":677},"edge-case-nofail-for-non-critical-mounts","Edge Case: ",[18,680,681],{},"nofail"," for Non-Critical Mounts",[28,684,685],{"language":30},[32,686,688],{"className":34,"code":687,"language":30,"meta":36,"style":36},"# Without nofail, if \u002Fdev\u002Fsdb1 is absent at boot, the system drops to emergency mode\n# With nofail, boot continues and the mount is simply skipped\nUUID=abcd-1234  \u002Fmnt\u002Fusb  ext4  defaults,noatime,nofail  0  2\n",[18,689,690,695,700],{"__ignoreMap":36},[40,691,692],{"class":42,"line":43},[40,693,694],{"class":285},"# Without nofail, if \u002Fdev\u002Fsdb1 is absent at boot, the system drops to emergency mode\n",[40,696,697],{"class":42,"line":50},[40,698,699],{"class":285},"# With nofail, boot continues and the mount is simply skipped\n",[40,701,702,705,709,712,715,718,721,724],{"class":42,"line":73},[40,703,704],{"class":60},"UUID",[40,706,708],{"class":707},"svdQ7","=",[40,710,711],{"class":56},"abcd-1234",[40,713,714],{"class":46},"  \u002Fmnt\u002Fusb",[40,716,717],{"class":56},"  ext4",[40,719,720],{"class":56},"  defaults,noatime,nofail",[40,722,723],{"class":281},"  0",[40,725,726],{"class":281},"  2\n",[23,728,730],{"id":729},"swap","Swap",[28,732,733],{"language":30},[32,734,736],{"className":34,"code":735,"language":30,"meta":36,"style":36},"# Complex Implementation: swap file (no partition needed)\nsudo fallocate -l 4G \u002Fswapfile      # create a 4 GB file\nsudo chmod 600 \u002Fswapfile\nsudo mkswap \u002Fswapfile\nsudo swapon \u002Fswapfile\n# Add to \u002Fetc\u002Ffstab: \u002Fswapfile none swap defaults 0 0\n\n# Tune swappiness (0=never swap, 100=swap aggressively, default 60)\nsudo sysctl vm.swappiness=10         # servers: 10, databases: 1\necho \"vm.swappiness = 10\" | sudo tee \u002Fetc\u002Fsysctl.d\u002F99-swappiness.conf\n",[18,737,738,743,761,774,782,791,796,800,805,821],{"__ignoreMap":36},[40,739,740],{"class":42,"line":43},[40,741,742],{"class":285},"# Complex Implementation: swap file (no partition needed)\n",[40,744,745,747,750,752,755,758],{"class":42,"line":50},[40,746,291],{"class":46},[40,748,749],{"class":56}," fallocate",[40,751,297],{"class":281},[40,753,754],{"class":56}," 4G",[40,756,757],{"class":56}," \u002Fswapfile",[40,759,760],{"class":285},"      # create a 4 GB file\n",[40,762,763,765,768,771],{"class":42,"line":73},[40,764,291],{"class":46},[40,766,767],{"class":56}," chmod",[40,769,770],{"class":281}," 600",[40,772,773],{"class":56}," \u002Fswapfile\n",[40,775,776,778,780],{"class":42,"line":79},[40,777,291],{"class":46},[40,779,538],{"class":56},[40,781,773],{"class":56},[40,783,784,786,789],{"class":42,"line":96},[40,785,291],{"class":46},[40,787,788],{"class":56}," swapon",[40,790,773],{"class":56},[40,792,793],{"class":42,"line":101},[40,794,795],{"class":285},"# Add to \u002Fetc\u002Ffstab: \u002Fswapfile none swap defaults 0 0\n",[40,797,798],{"class":42,"line":118},[40,799,518],{"emptyLinePlaceholder":517},[40,801,802],{"class":42,"line":123},[40,803,804],{"class":285},"# Tune swappiness (0=never swap, 100=swap aggressively, default 60)\n",[40,806,807,809,812,815,818],{"class":42,"line":143},[40,808,291],{"class":46},[40,810,811],{"class":56}," sysctl",[40,813,814],{"class":56}," vm.swappiness=",[40,816,817],{"class":281},"10",[40,819,820],{"class":285},"         # servers: 10, databases: 1\n",[40,822,823,826,829,832,835,838],{"class":42,"line":148},[40,824,825],{"class":281},"echo",[40,827,828],{"class":56}," \"vm.swappiness = 10\"",[40,830,831],{"class":707}," |",[40,833,834],{"class":46}," sudo",[40,836,837],{"class":56}," tee",[40,839,840],{"class":56}," \u002Fetc\u002Fsysctl.d\u002F99-swappiness.conf\n",[23,842,844],{"id":843},"lvm-logical-volume-manager","LVM — Logical Volume Manager",[14,846,847],{},"LVM abstracts physical disks into flexible logical volumes. You can resize, snapshot, and span multiple disks — impossible with plain partitions.",[28,849,850],{"language":30},[32,851,853],{"className":34,"code":852,"language":30,"meta":36,"style":36},"Physical Volume (PV)      ← a disk or partition (e.g., \u002Fdev\u002Fsdb1)\n    ↓\nVolume Group (VG)         ← pool of PVs (e.g., vg_data)\n    ↓\nLogical Volume (LV)       ← a slice of the VG, used like a partition\n    ↓\nFilesystem                ← ext4\u002Fxfs on the LV\n",[18,854,855,874,879,897,901,911,915],{"__ignoreMap":36},[40,856,857,860,862,865,868,871],{"class":42,"line":43},[40,858,859],{"class":46},"Physical",[40,861,90],{"class":56},[40,863,864],{"class":60}," (PV)      ← a disk or partition (",[40,866,867],{"class":46},"e.g.,",[40,869,870],{"class":56}," \u002Fdev\u002Fsdb1",[40,872,873],{"class":60},")\n",[40,875,876],{"class":42,"line":50},[40,877,878],{"class":46},"    ↓\n",[40,880,881,884,887,890,892,895],{"class":42,"line":73},[40,882,883],{"class":46},"Volume",[40,885,886],{"class":56}," Group",[40,888,889],{"class":60}," (VG)         ← pool of PVs (",[40,891,867],{"class":46},[40,893,894],{"class":56}," vg_data",[40,896,873],{"class":60},[40,898,899],{"class":42,"line":79},[40,900,878],{"class":46},[40,902,903,906,908],{"class":42,"line":96},[40,904,905],{"class":46},"Logical",[40,907,90],{"class":56},[40,909,910],{"class":60}," (LV)       ← a slice of the VG, used like a partition\n",[40,912,913],{"class":42,"line":101},[40,914,878],{"class":46},[40,916,917,920,923,926,929,932],{"class":42,"line":118},[40,918,919],{"class":46},"Filesystem",[40,921,922],{"class":56},"                ←",[40,924,925],{"class":56}," ext4\u002Fxfs",[40,927,928],{"class":56}," on",[40,930,931],{"class":56}," the",[40,933,934],{"class":56}," LV\n",[28,936,937],{"language":30},[32,938,940],{"className":34,"code":939,"language":30,"meta":36,"style":36},"# Complex Implementation: full LVM setup + online resize + snapshot backup\n# 1. Create PV on two partitions\nsudo pvcreate \u002Fdev\u002Fsdb1 \u002Fdev\u002Fsdc1\n# 2. Create VG spanning both\nsudo vgcreate vg_data \u002Fdev\u002Fsdb1 \u002Fdev\u002Fsdc1\n# 3. Create LV (10 GB)\nsudo lvcreate -L 10G -n lv_data vg_data\n# 4. Create filesystem + mount\nsudo mkfs.ext4 \u002Fdev\u002Fvg_data\u002Flv_data\nsudo mount \u002Fdev\u002Fvg_data\u002Flv_data \u002Fmnt\u002Fdata\n\n# ONLINE RESIZE (while mounted — the big advantage):\nsudo lvextend -l +100%FREE \u002Fdev\u002Fvg_data\u002Flv_data    # use all remaining VG space\nsudo resize2fs \u002Fdev\u002Fvg_data\u002Flv_data               # ext4 (online)\n# sudo xfs_growfs \u002Fmnt\u002Fdata                        # XFS (online)\n\n# SNAPSHOT BACKUP (copy-on-write, point-in-time):\nsudo lvcreate -L 5G -s -n lv_data_snap \u002Fdev\u002Fvg_data\u002Flv_data\nsudo mount -o ro \u002Fdev\u002Fvg_data\u002Flv_data_snap \u002Fmnt\u002Fsnap\ntar -czf \u002Ftmp\u002Fbackup.tar.gz -C \u002Fmnt\u002Fsnap .\nsudo umount \u002Fmnt\u002Fsnap\nsudo lvremove -f \u002Fdev\u002Fvg_data\u002Flv_data_snap\n",[18,941,942,947,952,964,969,982,987,1007,1012,1021,1033,1037,1043,1061,1074,1080,1085,1091,1113,1132,1153,1163],{"__ignoreMap":36},[40,943,944],{"class":42,"line":43},[40,945,946],{"class":285},"# Complex Implementation: full LVM setup + online resize + snapshot backup\n",[40,948,949],{"class":42,"line":50},[40,950,951],{"class":285},"# 1. Create PV on two partitions\n",[40,953,954,956,959,961],{"class":42,"line":73},[40,955,291],{"class":46},[40,957,958],{"class":56}," pvcreate",[40,960,870],{"class":56},[40,962,963],{"class":56}," \u002Fdev\u002Fsdc1\n",[40,965,966],{"class":42,"line":79},[40,967,968],{"class":285},"# 2. Create VG spanning both\n",[40,970,971,973,976,978,980],{"class":42,"line":96},[40,972,291],{"class":46},[40,974,975],{"class":56}," vgcreate",[40,977,894],{"class":56},[40,979,870],{"class":56},[40,981,963],{"class":56},[40,983,984],{"class":42,"line":101},[40,985,986],{"class":285},"# 3. Create LV (10 GB)\n",[40,988,989,991,994,996,999,1001,1004],{"class":42,"line":118},[40,990,291],{"class":46},[40,992,993],{"class":56}," lvcreate",[40,995,479],{"class":281},[40,997,998],{"class":56}," 10G",[40,1000,412],{"class":281},[40,1002,1003],{"class":56}," lv_data",[40,1005,1006],{"class":56}," vg_data\n",[40,1008,1009],{"class":42,"line":123},[40,1010,1011],{"class":285},"# 4. Create filesystem + mount\n",[40,1013,1014,1016,1018],{"class":42,"line":143},[40,1015,291],{"class":46},[40,1017,476],{"class":56},[40,1019,1020],{"class":56}," \u002Fdev\u002Fvg_data\u002Flv_data\n",[40,1022,1023,1025,1027,1030],{"class":42,"line":148},[40,1024,291],{"class":46},[40,1026,671],{"class":56},[40,1028,1029],{"class":56}," \u002Fdev\u002Fvg_data\u002Flv_data",[40,1031,1032],{"class":56}," \u002Fmnt\u002Fdata\n",[40,1034,1035],{"class":42,"line":171},[40,1036,518],{"emptyLinePlaceholder":517},[40,1038,1040],{"class":42,"line":1039},12,[40,1041,1042],{"class":285},"# ONLINE RESIZE (while mounted — the big advantage):\n",[40,1044,1046,1048,1051,1053,1056,1058],{"class":42,"line":1045},13,[40,1047,291],{"class":46},[40,1049,1050],{"class":56}," lvextend",[40,1052,297],{"class":281},[40,1054,1055],{"class":56}," +100%FREE",[40,1057,1029],{"class":56},[40,1059,1060],{"class":285},"    # use all remaining VG space\n",[40,1062,1064,1066,1069,1071],{"class":42,"line":1063},14,[40,1065,291],{"class":46},[40,1067,1068],{"class":56}," resize2fs",[40,1070,1029],{"class":56},[40,1072,1073],{"class":285},"               # ext4 (online)\n",[40,1075,1077],{"class":42,"line":1076},15,[40,1078,1079],{"class":285},"# sudo xfs_growfs \u002Fmnt\u002Fdata                        # XFS (online)\n",[40,1081,1083],{"class":42,"line":1082},16,[40,1084,518],{"emptyLinePlaceholder":517},[40,1086,1088],{"class":42,"line":1087},17,[40,1089,1090],{"class":285},"# SNAPSHOT BACKUP (copy-on-write, point-in-time):\n",[40,1092,1094,1096,1098,1100,1103,1106,1108,1111],{"class":42,"line":1093},18,[40,1095,291],{"class":46},[40,1097,993],{"class":56},[40,1099,479],{"class":281},[40,1101,1102],{"class":56}," 5G",[40,1104,1105],{"class":281}," -s",[40,1107,412],{"class":281},[40,1109,1110],{"class":56}," lv_data_snap",[40,1112,1020],{"class":56},[40,1114,1116,1118,1120,1123,1126,1129],{"class":42,"line":1115},19,[40,1117,291],{"class":46},[40,1119,671],{"class":56},[40,1121,1122],{"class":281}," -o",[40,1124,1125],{"class":56}," ro",[40,1127,1128],{"class":56}," \u002Fdev\u002Fvg_data\u002Flv_data_snap",[40,1130,1131],{"class":56}," \u002Fmnt\u002Fsnap\n",[40,1133,1135,1138,1141,1144,1147,1150],{"class":42,"line":1134},20,[40,1136,1137],{"class":46},"tar",[40,1139,1140],{"class":281}," -czf",[40,1142,1143],{"class":56}," \u002Ftmp\u002Fbackup.tar.gz",[40,1145,1146],{"class":281}," -C",[40,1148,1149],{"class":56}," \u002Fmnt\u002Fsnap",[40,1151,1152],{"class":56}," .\n",[40,1154,1156,1158,1161],{"class":42,"line":1155},21,[40,1157,291],{"class":46},[40,1159,1160],{"class":56}," umount",[40,1162,1131],{"class":56},[40,1164,1166,1168,1171,1173],{"class":42,"line":1165},22,[40,1167,291],{"class":46},[40,1169,1170],{"class":56}," lvremove",[40,1172,282],{"class":281},[40,1174,1175],{"class":56}," \u002Fdev\u002Fvg_data\u002Flv_data_snap\n",[546,1177,1179],{"id":1178},"edge-case-lvm-snapshot-size-matters","Edge Case: LVM Snapshot Size Matters",[28,1181,1182],{"language":30},[32,1183,1185],{"className":34,"code":1184,"language":30,"meta":36,"style":36},"# If a snapshot fills up (more changes than its allocated size), it's INVALIDATED\n# — you can't use it for backup. Size it based on the rate of change during backup.\nsudo lvs    # watch Snap% column — if it hits 100%, snapshot is dead\n",[18,1186,1187,1192,1197],{"__ignoreMap":36},[40,1188,1189],{"class":42,"line":43},[40,1190,1191],{"class":285},"# If a snapshot fills up (more changes than its allocated size), it's INVALIDATED\n",[40,1193,1194],{"class":42,"line":50},[40,1195,1196],{"class":285},"# — you can't use it for backup. Size it based on the rate of change during backup.\n",[40,1198,1199,1201,1204],{"class":42,"line":73},[40,1200,291],{"class":46},[40,1202,1203],{"class":56}," lvs",[40,1205,1206],{"class":285},"    # watch Snap% column — if it hits 100%, snapshot is dead\n",[23,1208,1210],{"id":1209},"raid-mdadm","RAID (mdadm)",[180,1212,1213,1232],{},[183,1214,1215],{},[186,1216,1217,1220,1223,1226,1229],{},[189,1218,1219],{},"Level",[189,1221,1222],{},"Min Disks",[189,1224,1225],{},"Redundancy",[189,1227,1228],{},"Space Efficiency",[189,1230,1231],{},"Use",[199,1233,1234,1251,1267,1283,1300],{},[186,1235,1236,1239,1242,1245,1248],{},[204,1237,1238],{},"0",[204,1240,1241],{},"2",[204,1243,1244],{},"None (data loss if any disk fails)",[204,1246,1247],{},"100%",[204,1249,1250],{},"Speed (not for data you need)",[186,1252,1253,1256,1258,1261,1264],{},[204,1254,1255],{},"1",[204,1257,1241],{},[204,1259,1260],{},"1 disk",[204,1262,1263],{},"50%",[204,1265,1266],{},"OS mirror",[186,1268,1269,1272,1275,1277,1280],{},[204,1270,1271],{},"5",[204,1273,1274],{},"3",[204,1276,1260],{},[204,1278,1279],{},"(n-1)\u002Fn",[204,1281,1282],{},"General purpose",[186,1284,1285,1288,1291,1294,1297],{},[204,1286,1287],{},"6",[204,1289,1290],{},"4",[204,1292,1293],{},"2 disks",[204,1295,1296],{},"(n-2)\u002Fn",[204,1298,1299],{},"Important data",[186,1301,1302,1304,1306,1309,1311],{},[204,1303,817],{},[204,1305,1290],{},[204,1307,1308],{},"1 per mirror pair",[204,1310,1263],{},[204,1312,1313],{},"Speed + redundancy",[28,1315,1316],{"language":30},[32,1317,1319],{"className":34,"code":1318,"language":30,"meta":36,"style":36},"# Complex Implementation: RAID 1 + disk failure simulation + rebuild\nsudo mdadm --create \u002Fdev\u002Fmd0 --level=1 --raid-devices=2 \u002Fdev\u002Fsdb \u002Fdev\u002Fsdc\ncat \u002Fproc\u002Fmdstat                    # watch it build (can take hours)\n\n# Simulate a disk failure:\nsudo mdadm --fail \u002Fdev\u002Fmd0 \u002Fdev\u002Fsdb\nsudo mdadm --remove \u002Fdev\u002Fmd0 \u002Fdev\u002Fsdb\ncat \u002Fproc\u002Fmdstat                    # shows \"degraded\"\n# Replace the disk:\nsudo mdadm --add \u002Fdev\u002Fmd0 \u002Fdev\u002Fsde  # rebuild starts\ncat \u002Fproc\u002Fmdstat                    # shows \"recovering\"\n\n# Save config (so RAID assembles at boot):\nsudo mdadm --detail --scan | sudo tee -a \u002Fetc\u002Fmdadm\u002Fmdadm.conf\nsudo update-initramfs -u            # Debian (so RAID is available at boot)\n",[18,1320,1321,1326,1350,1360,1364,1369,1383,1396,1405,1410,1427,1436,1440,1445,1469],{"__ignoreMap":36},[40,1322,1323],{"class":42,"line":43},[40,1324,1325],{"class":285},"# Complex Implementation: RAID 1 + disk failure simulation + rebuild\n",[40,1327,1328,1330,1333,1336,1339,1342,1345,1347],{"class":42,"line":50},[40,1329,291],{"class":46},[40,1331,1332],{"class":56}," mdadm",[40,1334,1335],{"class":281}," --create",[40,1337,1338],{"class":56}," \u002Fdev\u002Fmd0",[40,1340,1341],{"class":281}," --level=1",[40,1343,1344],{"class":281}," --raid-devices=2",[40,1346,400],{"class":56},[40,1348,1349],{"class":56}," \u002Fdev\u002Fsdc\n",[40,1351,1352,1354,1357],{"class":42,"line":73},[40,1353,317],{"class":46},[40,1355,1356],{"class":56}," \u002Fproc\u002Fmdstat",[40,1358,1359],{"class":285},"                    # watch it build (can take hours)\n",[40,1361,1362],{"class":42,"line":79},[40,1363,518],{"emptyLinePlaceholder":517},[40,1365,1366],{"class":42,"line":96},[40,1367,1368],{"class":285},"# Simulate a disk failure:\n",[40,1370,1371,1373,1375,1378,1380],{"class":42,"line":101},[40,1372,291],{"class":46},[40,1374,1332],{"class":56},[40,1376,1377],{"class":281}," --fail",[40,1379,1338],{"class":56},[40,1381,1382],{"class":56}," \u002Fdev\u002Fsdb\n",[40,1384,1385,1387,1389,1392,1394],{"class":42,"line":118},[40,1386,291],{"class":46},[40,1388,1332],{"class":56},[40,1390,1391],{"class":281}," --remove",[40,1393,1338],{"class":56},[40,1395,1382],{"class":56},[40,1397,1398,1400,1402],{"class":42,"line":123},[40,1399,317],{"class":46},[40,1401,1356],{"class":56},[40,1403,1404],{"class":285},"                    # shows \"degraded\"\n",[40,1406,1407],{"class":42,"line":143},[40,1408,1409],{"class":285},"# Replace the disk:\n",[40,1411,1412,1414,1416,1419,1421,1424],{"class":42,"line":148},[40,1413,291],{"class":46},[40,1415,1332],{"class":56},[40,1417,1418],{"class":281}," --add",[40,1420,1338],{"class":56},[40,1422,1423],{"class":56}," \u002Fdev\u002Fsde",[40,1425,1426],{"class":285},"  # rebuild starts\n",[40,1428,1429,1431,1433],{"class":42,"line":171},[40,1430,317],{"class":46},[40,1432,1356],{"class":56},[40,1434,1435],{"class":285},"                    # shows \"recovering\"\n",[40,1437,1438],{"class":42,"line":1039},[40,1439,518],{"emptyLinePlaceholder":517},[40,1441,1442],{"class":42,"line":1045},[40,1443,1444],{"class":285},"# Save config (so RAID assembles at boot):\n",[40,1446,1447,1449,1451,1454,1457,1459,1461,1463,1466],{"class":42,"line":1063},[40,1448,291],{"class":46},[40,1450,1332],{"class":56},[40,1452,1453],{"class":281}," --detail",[40,1455,1456],{"class":281}," --scan",[40,1458,831],{"class":707},[40,1460,834],{"class":46},[40,1462,837],{"class":56},[40,1464,1465],{"class":281}," -a",[40,1467,1468],{"class":56}," \u002Fetc\u002Fmdadm\u002Fmdadm.conf\n",[40,1470,1471,1473,1476,1479],{"class":42,"line":1076},[40,1472,291],{"class":46},[40,1474,1475],{"class":56}," update-initramfs",[40,1477,1478],{"class":281}," -u",[40,1480,1481],{"class":285},"            # Debian (so RAID is available at boot)\n",[546,1483,1485],{"id":1484},"edge-case-raid-is-not-a-backup","Edge Case: RAID Is Not a Backup",[28,1487,1488],{"language":30},[32,1489,1491],{"className":34,"code":1490,"language":30,"meta":36,"style":36},"# RAID protects against disk failure, NOT deletion, corruption, or ransomware.\n# A RAID 1 mirror replicates `rm -rf \u002F` to both disks instantly.\n# Always have off-site backups.\n",[18,1492,1493,1498,1503],{"__ignoreMap":36},[40,1494,1495],{"class":42,"line":43},[40,1496,1497],{"class":285},"# RAID protects against disk failure, NOT deletion, corruption, or ransomware.\n",[40,1499,1500],{"class":42,"line":50},[40,1501,1502],{"class":285},"# A RAID 1 mirror replicates `rm -rf \u002F` to both disks instantly.\n",[40,1504,1505],{"class":42,"line":73},[40,1506,1507],{"class":285},"# Always have off-site backups.\n",[23,1509,1511,1513],{"id":1510},"fsck-filesystem-check",[18,1512,20],{}," — Filesystem Check",[28,1515,1516],{"language":30},[32,1517,1519],{"className":34,"code":1518,"language":30,"meta":36,"style":36},"# Complex Implementation: repair a corrupted filesystem\n# — MUST be unmounted (running fsck on a mounted FS can corrupt it)\nsudo umount \u002Fdev\u002Fsdb1\nsudo fsck -y \u002Fdev\u002Fsdb1           # answer yes to all prompts\nsudo mount \u002Fdev\u002Fsdb1 \u002Fmnt\u002Fdata\n\n# For root filesystem: runs at boot from initramfs (before mount)\n# Force check at next boot: sudo touch \u002Fforcefsck\n",[18,1520,1521,1526,1531,1539,1554,1564,1568,1573],{"__ignoreMap":36},[40,1522,1523],{"class":42,"line":43},[40,1524,1525],{"class":285},"# Complex Implementation: repair a corrupted filesystem\n",[40,1527,1528],{"class":42,"line":50},[40,1529,1530],{"class":285},"# — MUST be unmounted (running fsck on a mounted FS can corrupt it)\n",[40,1532,1533,1535,1537],{"class":42,"line":73},[40,1534,291],{"class":46},[40,1536,1160],{"class":56},[40,1538,497],{"class":56},[40,1540,1541,1543,1546,1549,1551],{"class":42,"line":79},[40,1542,291],{"class":46},[40,1544,1545],{"class":56}," fsck",[40,1547,1548],{"class":281}," -y",[40,1550,870],{"class":56},[40,1552,1553],{"class":285},"           # answer yes to all prompts\n",[40,1555,1556,1558,1560,1562],{"class":42,"line":96},[40,1557,291],{"class":46},[40,1559,671],{"class":56},[40,1561,870],{"class":56},[40,1563,1032],{"class":56},[40,1565,1566],{"class":42,"line":101},[40,1567,518],{"emptyLinePlaceholder":517},[40,1569,1570],{"class":42,"line":118},[40,1571,1572],{"class":285},"# For root filesystem: runs at boot from initramfs (before mount)\n",[40,1574,1575],{"class":42,"line":123},[40,1576,1577],{"class":285},"# Force check at next boot: sudo touch \u002Fforcefsck\n",[546,1579,678,1581,1583],{"id":1580},"edge-case-fsck-on-a-mounted-filesystem-can-corrupt-it",[18,1582,20],{}," on a Mounted Filesystem Can Corrupt It",[28,1585,1586],{"language":30},[32,1587,1589],{"className":34,"code":1588,"language":30,"meta":36,"style":36},"# NAIVE: fsck on a mounted ext4\u002Fxfs\nsudo fsck \u002Fdev\u002Fsdb1               # while \u002Fdev\u002Fsdb1 is mounted → CORRUPTION\n# PRODUCTION: unmount first\nsudo umount \u002Fdev\u002Fsdb1 && sudo fsck -y \u002Fdev\u002Fsdb1\n# For root: boot from live USB \u002F rescue mode\n",[18,1590,1591,1596,1607,1612,1631],{"__ignoreMap":36},[40,1592,1593],{"class":42,"line":43},[40,1594,1595],{"class":285},"# NAIVE: fsck on a mounted ext4\u002Fxfs\n",[40,1597,1598,1600,1602,1604],{"class":42,"line":50},[40,1599,291],{"class":46},[40,1601,1545],{"class":56},[40,1603,870],{"class":56},[40,1605,1606],{"class":285},"               # while \u002Fdev\u002Fsdb1 is mounted → CORRUPTION\n",[40,1608,1609],{"class":42,"line":73},[40,1610,1611],{"class":285},"# PRODUCTION: unmount first\n",[40,1613,1614,1616,1618,1620,1623,1625,1627,1629],{"class":42,"line":79},[40,1615,291],{"class":46},[40,1617,1160],{"class":56},[40,1619,870],{"class":56},[40,1621,1622],{"class":60}," && ",[40,1624,291],{"class":46},[40,1626,1545],{"class":56},[40,1628,1548],{"class":281},[40,1630,497],{"class":56},[40,1632,1633],{"class":42,"line":96},[40,1634,1635],{"class":285},"# For root: boot from live USB \u002F rescue mode\n",[23,1637,1639],{"id":1638},"smart-disk-health","SMART — Disk Health",[28,1641,1642],{"language":30},[32,1643,1645],{"className":34,"code":1644,"language":30,"meta":36,"style":36},"# Complex Implementation: automated disk failure detection\nsudo smartctl -H \u002Fdev\u002Fsda             # health status (PASSED\u002FFAILED)\nsudo smartctl -a \u002Fdev\u002Fsda             # all SMART attributes\nsudo smartctl -t long \u002Fdev\u002Fsda         # long self-test (hours)\n\n# Watch these attributes (non-zero + growing = failing disk):\n# Reallocated_Sector_Ct (5)\n# Current_Pending_Sector (197)\n# Offline_Uncorrectable (198)\n",[18,1646,1647,1652,1668,1681,1697,1701,1706,1711,1716],{"__ignoreMap":36},[40,1648,1649],{"class":42,"line":43},[40,1650,1651],{"class":285},"# Complex Implementation: automated disk failure detection\n",[40,1653,1654,1656,1659,1662,1665],{"class":42,"line":50},[40,1655,291],{"class":46},[40,1657,1658],{"class":56}," smartctl",[40,1660,1661],{"class":281}," -H",[40,1663,1664],{"class":56}," \u002Fdev\u002Fsda",[40,1666,1667],{"class":285},"             # health status (PASSED\u002FFAILED)\n",[40,1669,1670,1672,1674,1676,1678],{"class":42,"line":73},[40,1671,291],{"class":46},[40,1673,1658],{"class":56},[40,1675,1465],{"class":281},[40,1677,1664],{"class":56},[40,1679,1680],{"class":285},"             # all SMART attributes\n",[40,1682,1683,1685,1687,1689,1692,1694],{"class":42,"line":79},[40,1684,291],{"class":46},[40,1686,1658],{"class":56},[40,1688,429],{"class":281},[40,1690,1691],{"class":56}," long",[40,1693,1664],{"class":56},[40,1695,1696],{"class":285},"         # long self-test (hours)\n",[40,1698,1699],{"class":42,"line":96},[40,1700,518],{"emptyLinePlaceholder":517},[40,1702,1703],{"class":42,"line":101},[40,1704,1705],{"class":285},"# Watch these attributes (non-zero + growing = failing disk):\n",[40,1707,1708],{"class":42,"line":118},[40,1709,1710],{"class":285},"# Reallocated_Sector_Ct (5)\n",[40,1712,1713],{"class":42,"line":123},[40,1714,1715],{"class":285},"# Current_Pending_Sector (197)\n",[40,1717,1718],{"class":42,"line":143},[40,1719,1720],{"class":285},"# Offline_Uncorrectable (198)\n",[23,1722,1724,1727],{"id":1723},"dd-low-level-copy",[18,1725,1726],{},"dd"," — Low-Level Copy",[28,1729,1730],{"language":30},[32,1731,1733],{"className":34,"code":1732,"language":30,"meta":36,"style":36},"# Complex Implementation: clone a disk (sector-by-sector)\nsudo dd if=\u002Fdev\u002Fsda of=\u002Fdev\u002Fsdb bs=4M status=progress\n# — target must be same size or larger\n# — dd respects EXACTLY what you type; if= and of= are one char apart\n# — DOUBLE-CHECK of= before pressing Enter\n\n# Write an ISO to a USB:\nsudo dd if=ubuntu.iso of=\u002Fdev\u002Fsdb bs=4M status=progress conv=fsync\n# (use \u002Fdev\u002Fsdb, the whole disk, NOT \u002Fdev\u002Fsdb1)\n",[18,1734,1735,1740,1759,1764,1769,1774,1778,1783,1802],{"__ignoreMap":36},[40,1736,1737],{"class":42,"line":43},[40,1738,1739],{"class":285},"# Complex Implementation: clone a disk (sector-by-sector)\n",[40,1741,1742,1744,1747,1750,1753,1756],{"class":42,"line":50},[40,1743,291],{"class":46},[40,1745,1746],{"class":56}," dd",[40,1748,1749],{"class":56}," if=\u002Fdev\u002Fsda",[40,1751,1752],{"class":56}," of=\u002Fdev\u002Fsdb",[40,1754,1755],{"class":56}," bs=4M",[40,1757,1758],{"class":56}," status=progress\n",[40,1760,1761],{"class":42,"line":73},[40,1762,1763],{"class":285},"# — target must be same size or larger\n",[40,1765,1766],{"class":42,"line":79},[40,1767,1768],{"class":285},"# — dd respects EXACTLY what you type; if= and of= are one char apart\n",[40,1770,1771],{"class":42,"line":96},[40,1772,1773],{"class":285},"# — DOUBLE-CHECK of= before pressing Enter\n",[40,1775,1776],{"class":42,"line":101},[40,1777,518],{"emptyLinePlaceholder":517},[40,1779,1780],{"class":42,"line":118},[40,1781,1782],{"class":285},"# Write an ISO to a USB:\n",[40,1784,1785,1787,1789,1792,1794,1796,1799],{"class":42,"line":123},[40,1786,291],{"class":46},[40,1788,1746],{"class":56},[40,1790,1791],{"class":56}," if=ubuntu.iso",[40,1793,1752],{"class":56},[40,1795,1755],{"class":56},[40,1797,1798],{"class":56}," status=progress",[40,1800,1801],{"class":56}," conv=fsync\n",[40,1803,1804],{"class":42,"line":143},[40,1805,1806],{"class":285},"# (use \u002Fdev\u002Fsdb, the whole disk, NOT \u002Fdev\u002Fsdb1)\n",[546,1808,678,1810,1813],{"id":1809},"edge-case-dd-if-ofdevsda-destroys-the-target",[18,1811,1812],{},"dd if=... of=\u002Fdev\u002Fsda"," Destroys the Target",[28,1815,1816],{"language":30},[32,1817,1819],{"className":34,"code":1818,"language":30,"meta":36,"style":36},"# Anti-Pattern: a typo overwrites your boot disk\n# dd copies raw bytes with NO safety check\n# of=\u002Fdev\u002Fsda instead of of=disk.img → overwrites your whole disk\n# Always verify of= is the intended target. Use status=progress to see it's writing the right amount.\n",[18,1820,1821,1826,1831,1836],{"__ignoreMap":36},[40,1822,1823],{"class":42,"line":43},[40,1824,1825],{"class":285},"# Anti-Pattern: a typo overwrites your boot disk\n",[40,1827,1828],{"class":42,"line":50},[40,1829,1830],{"class":285},"# dd copies raw bytes with NO safety check\n",[40,1832,1833],{"class":42,"line":73},[40,1834,1835],{"class":285},"# of=\u002Fdev\u002Fsda instead of of=disk.img → overwrites your whole disk\n",[40,1837,1838],{"class":42,"line":79},[40,1839,1840],{"class":285},"# Always verify of= is the intended target. Use status=progress to see it's writing the right amount.\n",[23,1842,1844],{"id":1843},"tips-tricks","💡 Tips & Tricks",[1846,1847,1848,1859,1871,1884,1896,1909,1918],"ul",{},[1849,1850,1851,1854,1855,1858],"li",{},[589,1852,1853],{},"Idiom",": use ",[18,1856,1857],{},"lsblk -f"," as your first storage command — shows all block devices, partitions, filesystem types, UUIDs, and mount points in one tree.",[1849,1860,1861,1863,1864,1867,1868,1870],{},[589,1862,1853],{},": use UUIDs in ",[18,1865,1866],{},"fstab",", not ",[18,1869,221],{}," — device names can change across reboots. UUIDs are unique per filesystem and stable.",[1849,1872,1873,1854,1875,1877,1878,1880,1881,1883],{},[589,1874,1853],{},[18,1876,681],{}," in ",[18,1879,1866],{}," for non-critical mounts — if an external USB or secondary data disk is absent at boot, ",[18,1882,681],{}," lets the boot continue.",[1849,1885,1886,1854,1888,1891,1892,1895],{},[589,1887,1853],{},[18,1889,1890],{},"mkfs.ext4 -m 0"," for data-only filesystems — the default 5% reserved for root makes sense for ",[18,1893,1894],{},"\u002F"," (keeps root able to log in if disk is full), but on a 4 TB data disk it wastes 200 GB.",[1849,1897,1898,1900,1901,1904,1905,1908],{},[589,1899,1853],{},": use LVM for any non-root filesystem that might grow — resizing plain partitions is painful. LVM lets you ",[18,1902,1903],{},"lvextend"," + ",[18,1906,1907],{},"resize2fs"," online (while mounted).",[1849,1910,1911,1854,1914,1917],{},[589,1912,1913],{},"Debug",[18,1915,1916],{},"cat \u002Fproc\u002Fmdstat"," to watch RAID rebuild progress — shows array status, sync percentage, and which disks are involved.",[1849,1919,1920,1854,1922,1925],{},[589,1921,1913],{},[18,1923,1924],{},"smartctl -H \u002Fdev\u002Fsda"," and watch reallocated sector counts — early warning of disk failure.",[23,1927,1929],{"id":1928},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[1846,1931,1932,1951,1966,1982,1992,1998,2004,2024],{},[1849,1933,1934,1939,1940,1942,1943,1946,1947,1950],{},[589,1935,1936,1938],{},[18,1937,1812],{}," destroys the target",": ",[18,1941,1726],{}," copies raw bytes with no safety check. ",[18,1944,1945],{},"if="," and ",[18,1948,1949],{},"of="," are one character apart — a typo overwrites your boot disk.",[1849,1952,1953,1958,1959,1961,1962,1965],{},[589,1954,1955,1957],{},[18,1956,20],{}," on a mounted filesystem can corrupt it",": never ",[18,1960,20],{}," a mounted ext4\u002Fxfs. Unmount first, or boot from a live USB. ",[18,1963,1964],{},"xfs_repair"," explicitly refuses to run on a mounted filesystem.",[1849,1967,1968,1939,1971,1974,1975,1978,1979,1981],{},[589,1969,1970],{},"XFS can't shrink",[18,1972,1973],{},"xfs_growfs"," expands (online), but there's no ",[18,1976,1977],{},"xfs_shrink",". If you need a smaller XFS, you must back up, ",[18,1980,456],{}," anew, and restore.",[1849,1983,1984,1987,1988,1991],{},[589,1985,1986],{},"LVM snapshot size matters",": if a snapshot fills up (more changes than its allocated size), it's ",[589,1989,1990],{},"invalidated"," — you can't use it for backup.",[1849,1993,1994,1997],{},[589,1995,1996],{},"RAID is not a backup",": RAID protects against disk failure, not deletion, corruption, or ransomware. Always have off-site backups.",[1849,1999,2000,2003],{},[589,2001,2002],{},"RAID 5 has a rebuild risk",": with large modern disks, the rebuild time is long, and a read error during rebuild can fail the array. RAID 6 (two parity disks) is safer for large arrays.",[1849,2005,2006,2011,2012,215,2014,2016,2017,2019,2020,2023],{},[589,2007,2008,2010],{},[18,2009,214],{}," ordering can change",": USB devices, hotplug SATA, BIOS settings can reorder ",[18,2013,214],{},[18,2015,218],{},". Use UUIDs (in ",[18,2018,1866],{},"), LVM (VG names), or ",[18,2021,2022],{},"mdadm"," (array UUID).",[1849,2025,2026,2032,2033,2036,2037,2040,2041,2044,2045,2048],{},[589,2027,2028,2031],{},[18,2029,2030],{},"umount"," fails if filesystem is busy",": open files, processes in the directory, or a shell's ",[18,2034,2035],{},"cwd"," prevent unmount. Find them with ",[18,2038,2039],{},"lsof +D \u002Fmnt"," or ",[18,2042,2043],{},"fuser -vm \u002Fmnt",". ",[18,2046,2047],{},"umount -l"," (lazy) detaches now but cleans up later — use cautiously.",[23,2050,2052],{"id":2051},"quick-quiz","🧠 Quick Quiz",[14,2054,2055,2056,2059],{},"A server's ",[18,2057,2058],{},"\u002Fvar\u002Flog"," is on a separate ext4 partition. After a power outage, the system boots to emergency mode with \"UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\" How do you fix this?",[2061,2062,2063,2067,2076,2081,2193],"details",{},[2064,2065,2066],"summary",{},"Answer",[14,2068,2069,2070,2072,2073,2075],{},"The ext4 filesystem on ",[18,2071,2058],{}," wasn't cleanly unmounted (power loss) and the journal can't auto-repair it. ",[18,2074,20],{}," must run manually.",[14,2077,2078],{},[589,2079,2080],{},"Steps:",[2082,2083,2084,2105,2124,2149,2168],"ol",{},[1849,2085,2086,2087],{},"In emergency mode, remount root read-write:",[28,2088,2089,2095,2098],{"language":30},[32,2090,2091],{"className":34,"code":36,"language":30,"meta":36,"style":36},[18,2092,2093],{"__ignoreMap":36},[40,2094],{"class":42,"line":43},[14,2096,2097],{},"mount -o remount,rw \u002F",[32,2099,2103],{"className":2100,"code":36,"language":2102},[2101],"language-text","text",[18,2104,36],{"__ignoreMap":36},[1849,2106,2107,2108],{},"Identify the problematic filesystem:",[28,2109,2110,2116,2119],{"language":30},[32,2111,2112],{"className":34,"code":36,"language":30,"meta":36,"style":36},[18,2113,2114],{"__ignoreMap":36},[40,2115],{"class":42,"line":43},[14,2117,2118],{},"journalctl -b | grep -i \"fsck|ext4|inconsistency\"\ncat \u002Fetc\u002Ffstab | grep \u002Fvar\u002Flog",[32,2120,2122],{"className":2121,"code":36,"language":2102},[2101],[18,2123,36],{"__ignoreMap":36},[1849,2125,2126,2127,2129,2130,2132,2133],{},"If ",[18,2128,2058],{}," is a separate partition, ",[18,2131,20],{}," it (it should be unmounted in emergency mode):",[28,2134,2135,2141,2144],{"language":30},[32,2136,2137],{"className":34,"code":36,"language":30,"meta":36,"style":36},[18,2138,2139],{"__ignoreMap":36},[40,2140],{"class":42,"line":43},[14,2142,2143],{},"fsck -y \u002Fdev\u002FsdXX        # replace with the actual device from fstab",[32,2145,2147],{"className":2146,"code":36,"language":2102},[2101],[18,2148,36],{"__ignoreMap":36},[1849,2150,2151,2152],{},"Continue boot:",[28,2153,2154,2160,2163],{"language":30},[32,2155,2156],{"className":34,"code":36,"language":30,"meta":36,"style":36},[18,2157,2158],{"__ignoreMap":36},[40,2159],{"class":42,"line":43},[14,2161,2162],{},"systemctl default",[32,2164,2166],{"className":2165,"code":36,"language":2102},[2101],[18,2167,36],{"__ignoreMap":36},[1849,2169,2170,2173,2174,1877,2177,2179,2180,2182,2183,2185,2186,2040,2189,2192],{},[589,2171,2172],{},"Prevent future occurrences",": ensure ",[18,2175,2176],{},"pass",[18,2178,1866],{}," is non-zero for ",[18,2181,2058],{}," (so ",[18,2184,20],{}," runs automatically at boot). Use a journaling filesystem (ext4 with ",[18,2187,2188],{},"data=ordered",[18,2190,2191],{},"data=journal",").",[28,2194,2195],{"language":30},[32,2196,2198],{"className":34,"code":2197,"language":30,"meta":36,"style":36},"# \u002Fetc\u002Ffstab — pass field controls boot-time fsck order\n# UUID=...  \u002Fvar\u002Flog  ext4  defaults  0  2   ← \"2\" means fsck at boot\n",[18,2199,2200,2205],{"__ignoreMap":36},[40,2201,2202],{"class":42,"line":43},[40,2203,2204],{"class":285},"# \u002Fetc\u002Ffstab — pass field controls boot-time fsck order\n",[40,2206,2207],{"class":42,"line":50},[40,2208,2209],{"class":285},"# UUID=...  \u002Fvar\u002Flog  ext4  defaults  0  2   ← \"2\" means fsck at boot\n",[2211,2212,2213],"style",{},"html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}",{"title":36,"searchDepth":50,"depth":50,"links":2215},[2216,2217,2218,2219,2223,2228,2229,2232,2235,2240,2241,2246,2247,2248],{"id":25,"depth":50,"text":26},{"id":177,"depth":50,"text":178},{"id":326,"depth":50,"text":327},{"id":452,"depth":50,"text":2220,"children":2221},"Creating Filesystems (mkfs)",[2222],{"id":548,"depth":73,"text":549},{"id":624,"depth":50,"text":2224,"children":2225},"Mounting and \u002Fetc\u002Ffstab",[2226],{"id":677,"depth":73,"text":2227},"Edge Case: nofail for Non-Critical Mounts",{"id":729,"depth":50,"text":730},{"id":843,"depth":50,"text":844,"children":2230},[2231],{"id":1178,"depth":73,"text":1179},{"id":1209,"depth":50,"text":1210,"children":2233},[2234],{"id":1484,"depth":73,"text":1485},{"id":1510,"depth":50,"text":2236,"children":2237},"fsck — Filesystem Check",[2238],{"id":1580,"depth":73,"text":2239},"Edge Case: fsck on a Mounted Filesystem Can Corrupt It",{"id":1638,"depth":50,"text":1639},{"id":1723,"depth":50,"text":2242,"children":2243},"dd — Low-Level Copy",[2244],{"id":1809,"depth":73,"text":2245},"Edge Case: dd if=... of=\u002Fdev\u002Fsda Destroys the Target",{"id":1843,"depth":50,"text":1844},{"id":1928,"depth":50,"text":1929},{"id":2051,"depth":50,"text":2052},"Storage is where data lives persistently. This chapter covers disks, partitions, filesystems, mounting, LVM, RAID, fsck, and SMART — core sysadmin skills where mistakes cause the most damage (data loss).","md",{},"\u002Flinux\u002F09-storage-and-filesystems",{"title":5,"description":2249},"linux\u002F09-storage-and-filesystems","a9DV0kv2EumJUxkOKEZ-EV0RgL4uh3CQ8z5W8ujYbxw",1789924649994]