Skip to content

Docker oba Kubernetes Production Volume Esaziddwamu: Okununula docker system prune --volumes, . overlay2 Inodes, era etcd Ebifaananyi eby’amangu

Ennamba z’embeera ez’amangu zaawukana okusinziira ku nsi. Omuko guno gukozesa 911, ennamba ya Amerika ne Canada. Ensi endala nnyingi zikozesa 112, 999, oba ennamba endala. Funa ennamba y'ensi yo.

Okudduka docker compose down -v, . docker system prune -a --volumes, . docker volume rm, oba kubectl delete pvc ku tabu ya terminal enkyamu mu kukola y'emu ku ngeri ezisinga okwangu okusangula obuzito bwa database obulamu PostgreSQL, MySQL, MariaDB, Redis, MongoDB, oba SQLite. Okwawukanako n’ebifaananyi by’ekyuma ekirabika mu kire ebigenda mu kifo eky’okuterekamu ebintu eby’ennaku 7, Docker’s local volume driver (/var/lib/docker/volumes/<name>/_data) ne Kubernetes local-path / . hostPath abagaba ebintu bafulumya mangu POSIX eya mutindo unlink() era rmdir() okuyita butereevu ku nkola ya fayiro y'omukozi wa Linux eyali wansi (ext4, . XFS, oba Btrfs). Buli kuwandiika okubaawo ku host eyo eya Linux oluvannyuma lw'ekiragiro okuggwa kuyinza okuwandiika ku bulooka za database ezisumuluddwa ku disiki. Singa disiki yo eya seva ejjula okutuuka ku bitundu 100 ku buli 100 (0 bytes free) nga tewali muntu adduse docker system prune --volumes mu kutya, weebuuze disiki ya seva 100% ejjudde, database WAL log bloat, n'okuzzaawo ekifo kya zero; ku bare-metal Linux fayiro okusazaamu ebweru wa konteyina, laba rm -rf mu butanwa oba Shift-Delete ku ext4, XFS, APFS, ne NTFS: okuddamu okuteekebwa mu kusoma kwokka n'okubumba inode era ekyuma ekirabika VMDK, VHDX, ne qcow2 snapshot olujegere okwonooneka n'okununula hypervisor. Singa okuvaako kuno okw’okufulumya kukosa okulabirira abalwadde mu ddwaaliro, okusindika mu bwangu, oba enkola z’obukuumi bw’ebikozesebwa bya gavumenti, kuba ku nnamba y’amangu mu kitundu kyo (911 mu Amerika ne Canada, . 112 okwetoloola omukago gwa Bulaaya, . 999 mu Bungereza) oba kebera ku dayirekita yaffe eya ennamba z’amangu.

Kino kikole kati

  1. TODDUKA docker compose up -d, . systemctl restart docker, oba okuddamu okuteeka Kubernetes pod: Okuddamu okukola ekintu oba okuddamu okutandika Docker daemon kuwandiika megabytes empya overlay2 metadata, ebiwandiiko bya JSON ebya konteyina, ne fayiro za database ekyerere ezitandise (initdb) butereevu ku kituufu ext4 oba XFS blocks voliyumu yo eyasazibwamu we yali etudde sekondi ntono emabega.
  2. Kebera mu sikonda 5 singa enkola ya konteyina (postgres, . mysqld, . redis-server, . node, . python) ekyatambula mu jjukira (ps aux era sudo lsof +L1): Singa omuntu asazaamu fayiro munda mu voliyumu essiddwa oba n'aggyako voliyumu etamanyiddwa mannya nga ekintu ekikyakola, Linux kernel ekuuma 100 ku buli 100 ebya fayiro za database ezitaliiko kakwate nga nnamu ku disiki kasita omukozi wa konteyina Process ID (PID) ekwata ennyonyola ya fayiro enzigule (FD). Osobola okukoppa fayiro ezo butereevu okuva mu /proc/<PID>/fd/ oba /proc/<PID>/root/ nga zero data loss nga container tennayimirira.
  3. Singa ekintu ekitereka kyayimirizibwa dda era nga volume yasazibwamu (docker compose down -v oba docker system prune --volumes), freeze host disk ewandiika amangu ddala: Yimirira Docker daemon (sudo systemctl stop docker.socket docker.service containerd) kale ebitereke eby’emabega n’okukebera obulamu bikomye okuwandiika ebiwandiiko mu /var/lib/docker, olwo oba remount /var/lib/docker (oba ekikolo / okugabanya) okusoma kwokka (sudo mount -o remount,ro /) oba kwata ekifaananyi eky’amangu eky’obuzito bw’ekire ku ddaala lya bulooka (AWS EBS Snapshot, . GCP Persistent Disk Snapshot, . DigitalOcean Volume Snapshot) nga tonnakwata ku kintu kyonna.
  4. Bw'oba oli ku Kubernetes (kubectl delete pvc oba kubectl delete namespace), kebera ku PersistentVolume (PV) . ReclaimPolicy (kubectl get pv) amangu ddala:
  5. Singa aba... PV yalina persistentVolumeReclaimPolicy: Retain, data yo tesazibwamu: the PV simply yasenguka ku Released embeera ne disiki yo ey'ekire (EBS, . Azure Disk, . Ceph RBD, . NFS) kirimu ebitundu 100 ku 100 nga tekikyuse.
  6. Ne bwe kiba nti kubectl delete pvc asibidde mu ** .Terminating**, Kubernetes Abasembayo (kubernetes.io/pvc-protection) okuziyiza CSI driver okusazaamu storage eyali wansi kasita Pod yonna ekyajuliza PVC eyo. Tosazaamu Pod okutuusa nga okoppa data okuva mu Pod ekola.
  7. Ekifaananyi ky'ekitundu kya bulooka ekiri wansi (dd / . ddrescue ku SSH) ku disiki ey'ebweru oba voliyumu y'ekire ey'enjawulo nga tonnadduka ext4magic, . extundelete, oba PhotoRec: Toddukangako file carvers eziwandiika fayiro ezifuluma ku disk partition y'emu mw'odda /var/lib/docker/volumes.
  8. Ku mbeera y'ekibinja kya Kubernetes eyonoonese oba eyasazibwamu mu butanwa (kubectl delete crd / . namespace), lekera awo kube-apiserver era ozzeewo ebipya byo etcd ekifaananyi ekitono (etcdctl snapshot restore): Singa embeera y'ekibinja mu etcd yasangulwa nga obuzito bw'okutereka ebire obusirikitu bukyaliwo, nga buzzaawo etcd azzaawo byonna PV, . PVC, . Secret, era ConfigMap ebintu mu kiseera kye kimu.

Danger

Toggyawo... kubernetes.io/pvc-protection oba kubernetes.io/pv-protection finalizer nga alina kubectl patch ... -p '{"metadata":{"finalizers":null}}' nga PVC ekwatiddwa mu Terminating: Oyo finalizer kye kintu kyokka ekikuuma cloud CSI driver yo (aws-ebs-csi-driver, . pd.csi.storage.gke.io, . Longhorn, . Rook-Ceph) okuva mu kufulumya ekintu ekiyitibwa hardware DeleteVolume API okuyita okusaanyaawo disiki yo ey'okufulumya. Nga PVC ekwatiddwa mu Terminating, Pod ekyakola ate nga ne volume ekyassibwako: run kubectl exec oba kubectl cp (oba pg_dump / . mysqldump) amangu ddala okununula ebitundu 100 ku 100 ebya database yo nga Pod tennaggwaako.


Omuti gw'okusalawo: esaziddwamu Docker volume, . overlay2 layeri, oba okusunsulamu kwa Kubernetes PVC

Kozesa flowchart eno okulonda ekkubo erisinga amangu ery'okuzzaawo zero-loss okusinziira ku oba enkola ya konteyina ekyali nnamu, oba voliyumu yali ewagirwa disiki ey'omu kitundu oba okutereka kwa CSI okw'ekire, n'enkola ya fayiro ki gy'ekyaza /var/lib/docker:

flowchart TD
    Start["Data y'okufulumya ebula oluvannyuma lw'ekiragiro kya Docker oba Kubernetes Delete"] --> WhichEnv{"Platform & Command ki eyavaako okufiirwa?"}

    WhichEnv -->|"Docker: Container Ekyakola (Fayiro ezitaliiko kakwate Munda mu Volume/Container)"| ProcRescue["Okununula Ggulawo Ennyonnyola za Fayiro ezitaliiko kakwate ng’oyita mu sudo lsof +L1 ne /proc/PID/fd/N oba /proc/PID/root/ ."]

    WhichEnv -->|"Docker: Konteyina Eyimiridde & Volume Esaziddwamu (okuwandiika wansi -v / prune --volumes)"| StopDocker["Amangu ago Duka: sudo systemctl yimirira docker.socket docker containerd"]

    WhichEnv -->|"Kubernetes: kubectl okusazaamu pvc / pv / statefulset / ekifo ky'amannya"| K8sCheck{"Pod Ekyadduka OBA PVC Ekwatiddwa mu Terminating?"}

    K8sCheck -->|"Yee: Pod Ekyakola (Finalizer Okuziyiza CSI Okusazaamu)"| K8sExec["TOSAZA Pod -> Duka kubectl exec / pg_dump / tar ku stdout ku Local Disk Amangu ago"]
    K8sCheck -->|"Nedda: Pod Gone -> Kebera kubectl okufuna pv"| ReclaimCheck{"Enkola ya PV ReclaimPolicy Yali Ki?"}

    ReclaimCheck -->|"Sigaza (Embeera ya PV = Efulumiziddwa) ."| ClearClaimRef["100% Data Intact -> Edit PV okuggyawo spec.claimRef.uid -> Ddamu okusiba ku PVC Empya"]
    ReclaimCheck -->|"Okusazaamu (Ekire EBS / PD / Longhorn / Local-Ekkubo)"| CloudOrLocal{"Ekire CSI Volume oba Local Host Disk?"}

    CloudOrLocal -->|"CSI y’ekire (AWS EBS / GCP / Azure / Ceph) ."| CloudSnap["Kebera Ekire Console Recycle Bin / Automated EBS Ebifaananyi / Ceph RBD Kasasiro (rbd kasasiro ls)"]
    CloudOrLocal -->|"Disiki ya Node y’Ekitundu (ekkubo-ery’omu kitundu / ekkubo ly’omukozi) ."| StopDocker

    StopDocker --> RemountRO["Remount Host Partition Read-Only (mount -o remount,ro) OBA Stream Ekifaananyi kya Block ku SSH"]
    RemountRO --> HostFS{"Enkola ki eya Fayiro Ekyaza /var/lib/docker?"}
    HostFS -->|"ext4"| Ext4Rec["Kozesa debugfs / ext4magic Journal Inode Enkolagana Rollback (-akabonero k'ekiseera)"]
    HostFS -->|"XFS / Ebitongole bya Btrfs"| CarveRec["Kozesa Btrfs Roots / xfs_irecover / Okubumba Omukono ogw'enjawulo ku SQLite, Postgres Heap, oba InnoDB .ibd"]

Omutendera 1: Engeri Docker ne Kubernetes gye zisazaamu ddala voliyumu ku disiki

Nga tonnaba kukola kiragiro kyonna eky'okuzzaawo, tegeera data yo gye yali ebeera mu mubiri ku Linux host ne kiki ekiragiro ky'okusazaamu kye kyakwatako ddala:

Ekika ky'okutereka & Ekiragiro ky'okusazaamu Ekkubo lya Host Filesystem ku Linux Node Ekiragiro Ky'okusazaamu Kye Kyakola Mu butuufu Enkola y’okuwona amangu
Erinnya lya Docker Volume (docker volume rm oba docker compose down -v) /var/lib/docker/volumes/<vol_name>/_data Unlinked fayiro eziri munda _data/ era n'aggyawo okuyingira kwa dayirekita okuva /var/lib/docker/volumes/metadata.db (boltdb). Yimirira Docker amangu ago, ddamu okussaako /var/lib/docker read-only, era okuzzaawo inodes ezitaliiko kakwate nga ziyita mu ext4magic / . debugfs oba okuyoola emikono.
Omuzingo gwa Docker ogutamanyiddwa mannya (docker run -v /var/lib/mysql + docker rm -v oba docker system prune --volumes) /var/lib/docker/volumes/<64-char-hex-id>/_data docker system prune --volumes esazaamu buli voliyumu etamanyiddwa mannya era eriko erinnya eritajuliziddwa mu kiseera kino waakiri ekintu kimu ekiriwo. Yimirira Docker mu bwangu; singa walina endala eziyimiridde nga volume zazo *tezisaliddwa, kebera ebisigadde /var/lib/docker/volumes/*/_data folders okusooka nga tonnaba kuyoola bulooka ezitagabanyizibwa.
Layer ewandiikibwa mu konteyina (docker rm <container> nga data ewandiikiddwa ebweru wa voliyumu) /var/lib/docker/overlay2/<layer-id>/diff/ Unlinked ekintu eky'okungulu diff/ dayirekita munda mu overlay2 ddereeva w’okutereka. Yimirira Docker amangu ago era zzaawo omuti gwa dayirekita ogutaliiko kakwate okuva ku ext4 journal oba XFS bulooka.
Docker Desktop ku macOS oba Windows (docker system prune --volumes) Munda mu kifaananyi kya disiki y’ekyuma ekimu eky’omubiri: -/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw (macOS) oba %LocalAppData%\Docker\wsl\disk\docker_data.vhdx (Eddirisa WSL2). Yasindikiddwa unlink() munda mu Linux VM, era singa discard/TRIM akola ku Docker.raw / . docker_data.vhdx, yakuba ebituli ebitonotono mu fayiro y’omugenyi. Vva mu Docker Desktop mu sikonda 5, koppa Docker.raw oba docker_data.vhdx ku drive ey’ebweru, era odduke ext4magic / . PhotoRec ku kifaananyi kya disiki ey’omubiri (virtual disk image).
Kubernetes PVC ne... Delete Enkola y'okuzzaawo ebintu ku Ceph RBD (Rook-Ceph) oba Longhorn . Ekidiba kya Ceph OSD (rbd) oba /var/lib/longhorn/replicas/. Singa csi-rbdplugin alina trash esobozeseddwa (rbd trash), ekifaananyi kya RBD kitwalibwa mu kasasiro wa Ceph; bwe kitaba ekyo bulooka tezikolebwako maapu. Dduka rbd trash ls --pool <pool> munda mu... rook-ceph-tools pod n'okuzzaawo ne rbd trash restore.

Omutendera 2: Okununula fayiro za database eziggule okuva mu kibya ekikyakola (/proc/<pid>/fd/) .

Linda: konteyina ekyakola mu kiseera kino? Emirundi mingi, yinginiya addukanya script y'okukyusa enkola, omulimu gwa cron ogw'okuyonja, oba ekitabo rm -rf /var/lib/postgresql/data/* oba rm /app/data/production.sqlite3 munda mu kibya ekidduka, oba okusazaamu ekitabo ekiri wansi w'ekifo eky'okusiba eky'okusimba /opt/app/data ate nga ekibya kyennyini (postgres, . mysqld, . mariadbd, . redis-server, . mongod, . gunicorn, . node) akyagenda mu maaso.

Mu Linux, fayiro tesazibwamu ku disiki nga rm oba unlink() kiyitibwa. Disiki blocks zaayo ne inode zisigala 100 ku buli 100 nga ziweereddwa era nga zisomebwa okutuusa ku nkola esembayo ekwata ennyonyola ya fayiro enzigule (FD) ku inode eyo eggalawo oba efuluma.

Omutendera 1: Funa host Process ID (PID) ey’enkola y’okutereka

Ku Linux host node (si munda mu container), funa host PID wa database yo oba enkola y’okusaba:

sudo lsof +L1 | grep -E "postgres|mysqld|mariadbd|sqlite|redis|mongo|node|python|java"
Laba ebifulumizibwa:
COMMAND     PID   USER   FD   TYPE DEVICE  SIZE/OFF NLINK    NODE NAME
mysqld    18492    999   14u   REG  259,1 482344960     0 1849201 /var/lib/mysql/app_prod/users.ibd (deleted)
mysqld    18492    999   15u   REG  259,1 125829120     0 1849202 /var/lib/mysql/app_prod/orders.ibd (deleted)
mysqld    18492    999   16u   REG  259,1  79691776     0 1849190 /var/lib/mysql/ibdata1 (deleted)
python3   22104   1000    4u   REG  259,1  89128960     0 3102944 /data/production.sqlite3 (deleted)
Laba ku mpagi NLINK: kigamba nti ** .0, era erinnya lya fayiro likoma ne ** .(deleted). Fayiro eweddewo ddala okuva ls /var/lib/docker/volumes/..., naye buli byte emu (482 MB mu users.ibd, . 89 MB mu production.sqlite3) akyali mulamu munda /proc/<PID>/fd/<FD>.

Omutendera 2: Koppa fayiro za database ezitaliiko kakwate butereevu okuva mu /proc/<PID>/fd/

To to kuyimiriza oba okuddamu okutandika ekintu. Nga enkola ekyatambula, koppa ebinnyonnyola fayiro embisi butereevu mu folda etaliiko bulabe ku host yo:

sudo mkdir -p /root/proc_emergency_rescue

# Example 1: Rescuing an unlinked SQLite3 database (PID 22104, FD 4)
sudo cp /proc/22104/fd/4 /root/proc_emergency_rescue/production.sqlite3
# Check if PID 22104 also holds the -wal file open (e.g. FD 5) and copy it too:
sudo cp /proc/22104/fd/5 /root/proc_emergency_rescue/production.sqlite3-wal

# Example 2: Automatically rescuing ALL open (deleted) MySQL/Postgres files for PID 18492
for fd in /proc/18492/fd/*; do
    target=$(sudo readlink "$fd" 2>/dev/null)
    if echo "$target" | grep -q "(deleted)"; then
        fd_num=$(basename "$fd")
        clean_name=$(echo "$target" | sed 's/ (deleted)//; s/\//_/g')
        echo "Rescuing FD $fd_num -> $clean_name"
        sudo cp "$fd" "/root/proc_emergency_rescue/${fd_num}${clean_name}"
    fi
done

Omutendera 3: N’okusingawo: Duka live logical dump (pg_dump / . mysqldump / . .backup) nga konteyina tennaggalawo FDs

Singa postgres oba mysqld ekyakola nga fayiro zaayo za data ziggule mu jjukira era /proc/<PID>/fd/, gezaako okuddukanya live logical dump ku unix socket oba TCP connection okusooka:

# If the database engine can still read its open file descriptors:
docker exec <container_name> pg_dumpall -U postgres > /root/proc_emergency_rescue/live_dump.sql
# Or for MySQL:
docker exec <container_name> mysqldump -u root -p --all-databases --single-transaction > /root/proc_emergency_rescue/live_mysql.sql
(Weetegereze: PostgreSQL eggulawo era n'eggalawo .1, . .2 segment files mu nkola z'omukozi mu ngeri ey'amaanyi, kale pg_dump ayinza okulemererwa ku mmeeza ezitaterekeddwa; okugatta okubuuza kwa SQL okulamu n'okukoppa buli kiggule /proc/<pid>/fd/* okubuna byonna postgres omwana backend PIDs etereka data y'entuumu y'emmeeza esinga obunene.)


Omutendera 3: Okuzzaawo voliyumu ya Docker eyasazibwamu ku ext4 oba XFS oluvannyuma lw’ekibya okuyimirira

Watya singa wadduka docker compose down -v oba docker system prune --volumes, kale ekibya kyayimiridde dda ne byonna /proc/<pid>/fd/ ebinyonyola biggaddwa? Kati oli mu mpaka za background disk writes ku Linux host.

Omutendera 1: Freeze enkola ya fayiro ya Linux host mu sikonda 10

  1. Komya Docker, containerd, kubelet, ne cron amangu ddala kale tewali container, healthcheck, oba log rotator ewandiika byte endala ku /var/lib/docker:
    sudo systemctl stop docker.socket docker.service containerd.service cron.service
    
  2. Kebera ekyuma kya block ki ne filesystem ki ebikutte /var/lib/docker:
    df -Th /var/lib/docker
    
    Filesystem     Type  Size  Used Avail Use% Mounted on
    /dev/nvme0n1p1 ext4  100G   42G   58G  42% /
    
  3. Ddamu okussa ekitundu Read-Only (oba okuyisa ekifaananyi ky'ekitundu ekibisi ku SSH ku kyuma ekirala):
  4. Singa /var/lib/docker eri ku kitundu kyayo ekyetongodde oba voliyumu ya LVM (okugeza /dev/nvme0n1p2 oba /dev/mapper/vg0-docker), remount it read-only amangu ddala:
    sudo mount -o remount,ro /var/lib/docker
    
  5. Singa /var/lib/docker eri ku kikolo / okugabanya (/), gezaako okukaka ekitundu ky'ekikolo okusoma kwokka ng'okozesa kernel Magic SysRq trigger (echo u | sudo tee /proc/sysrq-trigger) oba sudo mount -o remount,ro /.
  6. Bw’oba oli ku cloud VPS (AWS EC2, GCP, DigitalOcean, Hetzner, Linode): Amangu ago genda ku cloud web console yo onyige Create Snapshot ku block volume ya server (oba stream the raw block device ku SSH ku server eyookubiri: sudo dd if=/dev/nvme0n1p1 bs=4M status=progress | gzip -1 | ssh user@backup-server "cat > /mnt/storage/docker_host_raw.img.gz").

Omutendera 2: Kebera oba data yo ekyatudde mu volume ENDALA etasaliddwa oba overlay2 layeri

Nga tonnaba kuyoola bulooka za disiki ezitagabibwa, kakasa nti mu butuufu database yo teyali eterekeddwa mu bind mount oba voliyumu eriko erinnya ery'enjawulo eyasigalawo:

# Search the entire /var/lib/docker tree read-only for any surviving database files:
sudo find /var/lib/docker -name "PG_VERSION" -o -name "ibdata1" -o -name "*.sqlite*" -o -name "*.db" -o -name "dump.rdb" -o -name "WiredTiger" 2>/dev/null
Buli wiiki, abaddukanya emirimu basattira oluvannyuma lw’okudduka docker volume rm app_db_data, kyokka okuzuula ne find /var/lib/docker nti docker-compose.yml mu butuufu yali yatonda projectname_app_db_data (ekikyali 100 ku 100 nga tekikyuse ku disiki) ate nga app_db_data yali voliyumu nkadde etaakozesebwa okuva emyezi mukaaga egiyise.

Omutendera 3: Okuzzaawo Docker volume directories ezitaliiko kakwate ku ext4 nga bakozesa enkola ya ext4 Journal (ext4magic era debugfs) .

Ddi lwe docker volume rm asazaamu /var/lib/docker/volumes/<vol_name>/_data ku an ext4 enkola ya fayiro, . ext4 ziro okuva mu bifo ebiraga obutereevu bbulooka (i_block / ekikolo ky'omuti ekinene) mu mmeeza ya inode obulamu. Kyokka, ext4 ekitabo ky’amawulire (inode <8>, mu ngeri entuufu 128 MB okutuuka ku 1024 MB circular ring buffer) ekyakutte kkopi ez'ebyafaayo ez'emmeeza za inode entuufu ne bulooka za dayirekita okuva ddala emabega docker compose down -v yattibwa.

+-------------------------------------------------------------------------+
| HOW ext4magic RECOVERS A DELETED DOCKER VOLUME FROM THE EXT4 JOURNAL    |
|                                                                         |
| Live Inode Table on Disk (After docker volume rm):                      |
|   Inode #918402 (users.ibd): [Size = 0, Extent Pointers = ZEROED]       |
|                                                                         |
| Ext4 Journal Ring Buffer (Inode <8> on Disk):                           |
|   Transaction #41902 (10 mins ago):                                     |
|   Inode #918402 (users.ibd): [Size = 482MB, Extents = Blocks 9000..9999]|
|                                                                         |
| -> ext4magic reads the old Inode Copy from Journal Transaction #41902   |
|    and extracts Blocks 9000..9999 directly to your rescue drive.        |
+-------------------------------------------------------------------------+

Dduka ext4magic ku kitundu kyo eky'okusoma kwokka (oba the .img kkopi y’ekifaananyi ku seva eyookubiri), ng’olaga akabonero k’ekiseera (-a) okuva ku eddakiika 5 nga wabula odduse docker compose down -v oba docker system prune --volumes:

# Install ext4magic on your rescue machine (never on the affected partition)
sudo apt-get install -y ext4magic e2fsprogs

# Dump the ext4 journal from the frozen partition / image to a file in RAM (/dev/shm)
sudo debugfs -R "dump <8> /dev/shm/ext4_journal.copy" /dev/nvme0n1p1

# Recover all files deleted under var/lib/docker/volumes after (Current Time - 15 minutes)
sudo mkdir -p /mnt/external_rescue/docker_recovered
sudo ext4magic /dev/nvme0n1p1 \
  -j /dev/shm/ext4_journal.copy \
  -f var/lib/docker/volumes \
  -a $(date -d "-15 minutes" +%s) \
  -r -d /mnt/external_rescue/docker_recovered
- -j /dev/shm/ext4_journal.copy: Esoma ekifaananyi kya journal kye watereka mu RAM amangu ddala nga omaze okuyimiriza Docker. - -f var/lib/docker/volumes: Etunuulira omuti gwennyini ogwa Docker volumes directory (weetegereze: lekawo ekikulembera / mu ext4magic amakubo ag’enjawulo). - -a $(date -d "-15 minutes" +%s): Agamba ext4magic okuddamu okuzimba omuti gwa dayirekita nga okozesa kkopi za inode ezituufu eddakiika 15 eziyise (nga tewannabaawo kusazaamu mu butanwa). - -r: Ezzaawo dayirekita enzijuvu nga tewali bulooka zawandiikibwako; singa -r esubwa fayiro eziwandiikiddwako ekitundu, dduka okuyita okw'okubiri ng'okyusa -r nga balina -m (okubumba okw'amagezi + enkola y'omugatte mu jurnal).

Omutendera 4: Okuyoola fayiro za SQLite, PostgreSQL, oba MySQL InnoDB embisi nga journal ezingiddwa (XFS oba ext4) .

Warning

Lwaaki XFS tawagira ext4magic era kyetaagisa okusumulula amangu okusoma kwokka: Okwawukana ku ext4, ewandiika kkopi za inode ezijjuvu eza byte 256 mu jurnal yaayo, . XFS logs metadata intent deltas era mu ngeri ey’obukambwe eddamu okukozesa inode B-emiti egyasumuluddwa (agi). Singa /var/lib/docker atuula ku an XFS okugabanya (ekisookerwako ku RHEL, Rocky Linux, AlmaLinux, ne Amazon Linux), okuggyawo /var/lib/docker oba okuddamu okussaako / okusoma kwokka mu sikonda ntono gwe mutendera gumu ogusinga obukulu nga tonnaba kuyoola.

Singa omugenyi akozesa ** .XFS** oba singa... ext4 journal yazingibwa dda ku inode pointers, kozesa signature ne structure carving ku kifaananyi kya disiki embisi (docker_host_raw.img):

  1. Ku Databases za SQLite3 (.sqlite, . .db - e.g., Vaultwarden, Nextcloud, Omuyambi w'awaka, Gitea, Grafana): Buli database ya SQLite3 etandika n'omutwe gwa ASCII ogwa byte 16 ogutaliimu kubuusabuusa ku byte 0 ku lupapula lwayo olusooka olwa kilobyte 4: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 ("SQLite format 3\0"), era etereka obunene bw’olupapula lwa database entuufu (Bytes 16..17, mu ngeri entuufu 4096) n’obunene bwa database yonna mu mpapula (Bytes 28..31, big-endian 32-bit integer) munda ddala mu mutwe ogwo gwe gumu.
  2. Dduka PhotoRec nga balina [File Opt] -> [x] sqlite esobozeseddwa, oba sikaani ekitundu butereevu ne grep -ab "SQLite format 3" okuzuula byte offset entuufu eya fayiro yo eya SQLite eyasazibwamu n'okugiggyamu nayo dd:
    # Find the exact byte offsets of every "SQLite format 3" header on the partition:
    sudo grep -ab "SQLite format 3" /dev/nvme0n1p1
    
    Bw’omala okuggyibwamu, dduka sqlite3 carved.db ".recover" | sqlite3 repaired.db okuddamu okuzimba buli lupapula lw’amakoola g’omuti gwa B ogutaliiko kamogo.

Tip

Engeri y'okubalirira ekituufu dd sayizi ya byte ya fayiro ya SQLite3 etaliiko kakwate okuva ku mutwe gwayo: Omulundi gumu grep -ab "SQLite format 3" ekuweereza byte offset etandika OFFSET wa database yo eya SQLite eyasazibwamu, soma bytes 16..17 (uint16 big-endian Sayizi y’Olupapula, e.g., 0x1000 = 4096 bytes) ne bytes 28..31 (uint32 big-endian Okubala Omuko, e.g., 25000 empapula) nga bakozesa hexdump -C -s OFFSET -n 32. Okukubisaamu Page Size x Page Count ekuweereza obuwanvu bwa byte obutuufu bw'olina okuyitamu dd (iflag=skip_bytes,count_bytes) nga fayiro ekwatagana ku disiki.

  1. Ku lwa MySQL / MariaDB InnoDB (.ibd fayiro z'emmeeza): Buli InnoDB .ibd emmeeza erimu ebiddiriŋŋana 16 KB (16,384 byte) empapula ezirimu FIL_PAGE_INDEX (0x45BF) omutwe n'emmeeza ey'enjawulo space_id. Kozesa Percona / TwinDB ** .undrop-for-innodb (stream_parser + c_parser)** ekitabo ky'ebikozesebwa okusika /dev/nvme0n1p1 eri bonna 16 KB InnoDB index pages era osuule buli lunyiriri butereevu mu fayiro za TSV/SQL okuddamu okuyingiza.
  2. Ku Fayiro z'Entuumu za PostgreSQL ($PGDATA/base/<db_oid>/<relfilenode>): PostgreSQL etereka buli mmeeza nga ekwatagana 8 KB (8,192 byte) entuumu empapula ezirimu PageHeaderData (pd_lower, . pd_upper, . pd_special). Kozesa ** .pg_filedump** oba ** .pglazarus / . pdu** okusika ebitundu bya disiki ebitagabanyizibwa ku 8 KB empapula ezikwatagana n'ensengeka ya tuple y'ennyiriri z'emmeeza yo (HeapTupleHeaderData) n’okuddamu okuzimba ennyiriri.

Omutendera 4: Kubernetes PVC, PV, ne etcd Snapshot Okudda engulu mu bwangu

Mu Kubernetes (EKS, . GKE, . AKS, . k3s, . RKE2, . kubeadm, . OpenShift), okusazaamu mu butanwa PersistentVolumeClaim (kubectl delete pvc), StatefulSet, oba ekifo kyonna eky'Erinnya (kubectl delete ns prod) egoberera enzimba ey’enjawulo ennyo okusinga Docker eyeetongodde.

Ensonga A: PVC eraga Terminating (Omuwonya Obulamu bw'Omumalirizo)

Emisinde:

kubectl get pvc -n <namespace>
Singa aba... STATUS omuko gugamba nti Terminating, ssa omukka ogw'obuweerero: data yo TENASAJJIBWA. - Lwaaki? Buli Kubernetes PVC eyatondebwa Okuva Kubernetes 1.9 bweri mu automatically finalizers: [kubernetes.io/pvc-protection]. - Kasita Pod eba ekyassa PVC eyo, Kubernetes controller egaana okumaliriza okusazaamu PVC era teyitangako ya CSI driver's DeleteVolume RPC. - Ekikolwa eky'amangu: Tokola TO sazaamu oba okuddamu okutandika Pod, era tokola SI patch out finalizer. Amangu ago koppa data yonna okuva mu Pod ekola ku kyuma kyo oba mu baketi ya S3:
# Stream a compressed tar backup or pg_dump out of the still-running pod immediately:
kubectl exec -n <namespace> <pod-name> -- pg_dumpall -U postgres > ./rescued_k8s_db.sql
# Or tar an entire mounted volume directory out over stdout:
kubectl exec -n <namespace> <pod-name> -- tar czf - /var/lib/postgresql/data > ./rescued_pvc_files.tar.gz

Ensonga B: PVC yasazibwamu, era kubectl get pv eraga PersistentVolume mu Released embeera (ReclaimPolicy: Retain) .

Emisinde:

kubectl get pv
Singa PersistentVolume yo (pv-prod-postgres) ekyawandiikibwa ne STATUS: Released (kubanga StorageClass yaayo ekozesebwa reclaimPolicy: Retain), 100 ku buli 100 ebya data yo bikyatudde nga tekwatibwako ku disiki eri wansi. Wabula Kubernetes egaana okuleka PVC empya okusiba ku a Released PV kubanga PV ekyalimu a spec.claimRef nga asonga ku PVC enkadde ezaasangulwa UID.

Engeri y’okukolamu a Released PV Available nate mu sikonda 10 nga tewali data efiiriddwa: 1. Edita ekintu PersistentVolume era osazeewo spec.claimRef block:

kubectl patch pv <your-pv-name> --type json -p '[{"op": "remove", "path": "/spec/claimRef"}]'
2. Dduka kubectl get pv nate: embeera ekyuka amangu ago okuva ku Released okutuuka ku Available. 3. Ddamu okutondawo PersistentVolumeClaim (nga alaga volumeName: <your-pv-name> n'obusobozi obukwatagana/storageClassName). Kijja kwesiba ku PV eriwo amangu ddala nga fayiro zonna tezifudde.

Ensonga C: Okuzzaawo embeera y'ekibinja kya Kubernetes eyasazibwamu okuva ku etcd ekifaananyi ekitono (etcdctl snapshot restore) .

Watya singa omuntu yadduka kubectl delete namespace prod oba helm uninstall era n’asangulawo 200 Kubernetes manifests, Secrets, ConfigMaps, ne PV ennyonyola ku self-managed kubeadm, . k3s, oba RKE2 ennyonyi efugira?

  1. Funa ebipya byo etcd snapshot (nga bwe kibadde mu /var/lib/rancher/k3s/server/db/snapshots/, . /var/lib/rancher/rke2/server/db/snapshots/, oba enteekateeka yo /var/backups/etcd/snapshot.db).
  2. Kakasa obulungi bw'ekifaananyi nga tonnakwata ku kibinja ekiramu:
    ETCDCTL_API=3 etcdctl snapshot status /path/to/snapshot.db --write-out=table
    
  3. Mukomye kube-apiserver era etcd ku nnyonyi efugira node(s):
  4. Ku kubeadm (ebikoola ebitali bikyuka): Tambula /etc/kubernetes/manifests/kube-apiserver.yaml era /etc/kubernetes/manifests/etcd.yaml okumala akaseera okutuuka /root/manifests_hold/ kale kubelet ayimiriza ebibya byombi bulungi, olwo n’adda waggulu /var/lib/etcd okutuuka ku /var/lib/etcd.bak.
  5. Ku k3s: Dduka sudo systemctl stop k3s era sudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshot.
  6. Okuzzaawo... etcd data directory ku kubeadm:
    sudo ETCDCTL_API=3 etcdctl snapshot restore /path/to/snapshot.db \
      --data-dir=/var/lib/etcd \
      --name=<control-plane-node-name> \
      --initial-cluster=<node-name>=https://<node-ip>:2380 \
      --initial-advertise-peer-urls=https://<node-ip>:2380
    
  7. Tambula etcd.yaml era kube-apiserver.yaml okudda mu /etc/kubernetes/manifests/. Mu sikonda 30, . kube-apiserver addamu okuyungibwa ku bikomezeddwawo etcd store era buli kintu kya Namespace, Secret, ConfigMap, ne PersistentVolume ekisaziddwamu kiddamu okulabika.

Omutendera 5: Okukakanyaza voliyumu za Docker ne Kubernetes obutasazibwamu mu butanwa

Oluvannyuma lw'okuzzaawo database yo ey'okufulumya, teeka mu nkola ebikuumi bino ebina eby'ebizimbe kale ensobi emu ey'okuwandiika eya CLI tesobola kuddamu kusazaamu voliyumu butereevu:

  • Kyusa buli kufulumya Kubernetes StorageClass okuva reclaimPolicy: Delete okutuuka ku reclaimPolicy: Retain: Nga bwekiba, ekire ekizimbibwamu StorageClasses (gp2, . gp3, . standard-rwo) default ku reclaimPolicy: Delete, ekitegeeza okusazaamu PVC kisaanyaawo disiki y'ekire. Tonda a StorageClass nga balina reclaimPolicy: Retain (oba patch PVs eziriwo ne... kubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}') kale okusazaamu PVC oba Namespace tekisazaamu voliyumu ya bulooka eri wansi.
  • Ssobozesa AWS EBS Recycle Bin / GCP Snapshot Schedules / Velero ne CSI Snapshots: Okusobozesa AWS EBS Recycle Bin ekuuma volume yonna eya EBS esaziddwamu okumala ennaku 7 okutuuka ku 30 ne bwe kiba nti ddereeva wa CSI akubira essimu DeleteVolume.
  • Tokozesangako docker system prune --volumes mu scripts ez'okuyonja ez'obwengula oba abaddusi ba CI/CD: Singa ekintu ekitereka database y'okufulumya kigwa mu bufunze (Exited (1)) mu kiseera kyennyini omulimu gwa cron we gutambula docker system prune -a --volumes -f, Docker etwala voliyumu zaayo ezitamanyiddwa mannya "ezitakozesebwa" era n'ezisazaamu enkalakkalira. Strip --volumes okuva mu biwandiiko byonna eby’okuyonja.
  • Kozesa host bind mounts ezitegeerekeka (/srv/prod_data/postgres:/var/lib/postgresql/data) oba database eziddukanyizibwa ebweru ez'emirimu gy'okufulumya egy'embeera: Okwawukana ku /var/lib/docker/volumes/, host bind-mount dayirekita ebweru /var/lib/docker/ zi tezikwatibwako docker compose down -v, . docker volume rm, oba docker system prune --volumes.

Ennamba z’embeera ez’amangu mu bitundu n’ebiragiro by’ebitongole

Okusazaamu konteyina oba okutereka kwa Kubernetes bwe kukosa emirimu gy’obujjanjabi bw’eddwaliro, okusindika obukuumi bw’abantu, oba ebikwata ku muntu ebifugibwa, yongera amangu ddala:

  • Amerika ne Canada: Kuba 911 singa okulemererwa kw’ekibinja kya konteyina kulemesa okulondoola abalwadde mu malwaliro, enkola za EHR, oba okusindika mu bwangu. Loopa okusangulwa kw’ebikozesebwa mu konteyina eby’obulabe oba ebibaddewo ku mikutu gya yintaneeti eri CISA (1-844-Say-CISA / . cisa.gov/report) oba Ekitongole kya Canada ekikola ku by'okwerinda ku mikutu gya yintaneeti (1-833-CYBER-88).
  • Bungereza: Kuba 999 olw’okutiisa obulamu oba ebikozesebwa ebikulu ebya NHS. Mu UK GDPR, okusaanyaawo enkalakkalira oba okufiirwa okubeerawo kw’ebikwata ku muntu awatali backup esobola okuddizibwa kyetaagisa okwekenneenya okutegeeza ICO (0303 123 1113).
  • Omukago gwa Bulaaya: Kuba 112 mu mawanga gonna agali mu mukago gwa EU. Ebitongole ebiri wansi w’ekiragiro kya NIS2 birina okuleeta okulabula nga bukyali eri CSIRT y’eggwanga lyabyo mu ssaawa 24 oluvannyuma lw’okuvaako ennyo empeereza, era okufiirwa ebikwata ku muntu ow’olubeerera kivaako GDPR Article 33 okukola lipoota mu ssaawa 72.
  • Australia ne New Zealand: Kuba 000 mu Australia oba 111 mu New Zealand; okuloopa ebizibu ebikulu ebibaddewo mu bikozesebwa eri ACSC (1300 CYBER1).
  • Buyindi ne Asia-Pacific: Kuba 112 mu Buyindi olw’okukola ku mbeera ez’amangu; loopa ebibaddewo mu by’okwerinda mu kire oba mu konteyina eri CERT-In (incident@cert-in.org.in) mu ddirisa ery'essaawa 6 erikakatako.

Ebibuuzo ebitera okubuuzibwa

Akola docker compose down -v okusazaamu host bind mounts (./data:/var/lib/mysql) oba voliyumu za Docker eza Named ne Anonymous zokka?

`docker compose down -v` ONLY esazaamu voliyumu ezituumiddwa amannya ezirangiriddwa mu `volumes:` ekitundu kya `docker-compose.yml` ne Anonymous volumes ezigattibwa ku bidomola; it never esazaamu fayiro munda mu host bind mount (nga `- /opt/mysql_data:/var/lib/mysql` oba `- ./postgres_data:/var/lib/postgresql/data`). Singa fayiro yo eya compose yakozesa ekkubo lya host okutandika ne `/` oba `./`, kebera folda eyo ku host kati kati: fayiro zo zikyali 100 ku buli 100 nga tezifudde.

Lwaki yakola docker system prune --volumes delete my database volume nga nayimiriza container okumala eddakiika 2 zokka okulongoosa environment variable?

Linda n’obwegendereza enjawulo eriwo wakati wa `docker stop` era `docker rm`: singa ekibya kiba kyokka `Stopped / Exited` (ekirabika mu `docker ps -a`), . `docker system prune --volumes` akola si bwe kiri sazaamu voliyumu zaayo kubanga ekintu ekiyimiriziddwa ekyazijuliza. Kyokka singa wadduka `docker rm ` (okuddamu okukola ekintu ekirimu bendera empya) oba singa oyiseewo `docker system prune -a --volumes` (ekisooka okusazaamu konteyina zonna eziyimiridde era... olwo esazaamu voliyumu zonna ezitakyayungiddwa ku kibya kyonna), obuzito bwafuuka "okulengejja" milisekondi ekintu ekiyimiridde bwe kyaggyibwawo era n'esanzibwa amangu ddala oluvannyuma lw'ekyo.

Nsobola okuzzaawo voliyumu ya Docker eyasazibwamu munda mu Docker Desktop ku Mac (Apple Silicon / . Intel) oba Windows (WSL2)?

Yee, singa ova mu Docker Desktop amangu ddala kale ekyuma ekirabika ne kilekera awo okukola `fstrim` ku disiki ey’omubiri (virtual disk). Ku macOS, Docker etereka voliyumu zonna eza Linux munda `-/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw`; ku Windows WSL2, munda `%LocalAppData%\Docker\wsl\disk\docker_data.vhdx`. Ekyo kikoppa `.raw` oba `.vhdx` fayiro ku SSD ey'ebweru amangu ago, gigatteko okusoma kwokka mu Linux (nga okozesa `losetup -Pr` -a `.raw` oba `qemu-nbd -r` -a `.vhdx`), n’okudduka `ext4magic` oba `PhotoRec` ku bikolwa eby’omubiri (virtual). `ext4` okugabanya munda.

Watya singa nsazaamu Kubernetes StatefulSet ne kubectl delete statefulset postgres? Ekyo nazo kyasazaamu PVC zange?

Nedda. Nga bwekiba mu Kubernetes (okuggyako nga `persistentVolumeClaimRetentionPolicy.whenDeleted: Delete` yategekebwa mu bulambulukufu ku Kubernetes 1.27+), ng'ekola `kubectl delete statefulset` esazaamu omufuzi wa StatefulSet ne Pods zaayo, . okuleka byonna `PersistentVolumeClaims` (`data-postgres-0`, . `data-postgres-1`) ne data zaabwe ezisibukako ebitundu 100 ku 100 nga tezifudde. Simply okuddamu okusiiga ebibyo... `StatefulSet` YAML yeeyoleka n’erinnya lye limu era `volumeClaimTemplates`, era Pods empya zijja kuddamu okwegatta ku eziriwo mu ngeri ey’otoma `data-postgres-0` Ebintu ebiyitibwa PVCs.

Nkola ntya okuyingira mu fayiro munda mu Docker overlay2 dayirekita nga ekintu ekitereka kigaanye okutandika (CrashLoopBackOff / . Exited (1))?

Tosazaamu kibya ekigudde. Kasita ekintu ekiyimiridde kikyaliwo mu `docker ps -a`, layeri yaayo ewandiikibwa ne volume mounts tezifudde ddala ku disiki. Osobola okukoppa fayiro butereevu okuva mu kibya ekiyimiriziddwa ng'okozesa `docker cp :/var/lib/postgresql/data /root/rescued_data`, oba funa ekifo kyayo ekituufu `overlay2` ekkubo nga odduka `docker inspect --format '{{.GraphDriver.Data.UpperDir}}'` n’okusoma dayirekita eyo butereevu nga `root`.

Watya singa omuntu asazaamu Kubernetes Namespace (kubectl delete ns prod) era nga PVC zonna zaali zirina reclaimPolicy: Delete ku AWS EBS oba GCP?

Singa ddereeva wa CSI ow’ekire (`ebs.csi.aws.com` oba `pd.csi.storage.gke.io`) yattibwa dda `DeleteVolume` kubanga `reclaimPolicy` yali `Delete`, kebera obutimba busatu obw’obukuumi obw’omutendera gw’ekire amangu ddala: (1) kebera **AWS Recycle Bin for EBS Volumes** mu AWS EC2 console (singa etteeka ly’okukuuma lyali likola ku akawunti/tags, volume ya EBS eyasaziddwamu etuula mu Recycle Bin era esobola okuzzibwa mu kunyiga 1); (2) kebera **AWS Backup / DLM / GCP Snapshot Schedules** ku kifaananyi ekisembyeyo eky'obuzito obw'obwengula; ne (3) okukebera oba database yo yali etambuza WAL/binlogs (`WAL-G`, . `pgBackRest`, . `Litestream`) okutuuka ku baketi ya S3/GCS.


Ebiragiro ebikwatagana nabyo


Ensonda n’obulagirizi obutongole

  • Ebiwandiiko ebitongole bya Kubernetes (kubernetes.io / Cloud Native Computing Foundation): Ekintu ky'okutereka mu Kukuuma Okukozesa (kubernetes.io/pvc-protection Finalizers), Okuzzaawo Volume ezitaggwaawo (Retain vs. Delete), n’Okuddukanya emirimu etcd Ebibinja bya Kubernetes (etcdctl snapshot restore).
  • Kkampuni ya Docker Inc. (docs.docker.com): Ddukanya Data mu Docker: Volumes, Bind Mounts, . overlay2 Enzimba ya Ddereeva w’okutereka, ne Prune Reference.
  • Ekitongole kya Linux Kernel (kernel.org): Aba... /proc Enkola ya fayiro (procfs Ggulawo Okuzzaawo Ennyonnyola Fayiro okuyita mu /proc/<pid>/fd/) ne Ext4 Ebikwata ku Journal.
  • ext4magic Ebiwandiiko bya Pulojekiti (ext4magic.sourceforge.net): Okuzzaawo Enkolagana ya Forensic Inode ne Journal ku Ext3/Ext4 Filesystems.
  • Ekitongole ky’eggwanga ekikola ku mutindo ne tekinologiya (NIST) (United States): Ekiwandiiko eky’enjawulo 800-190: Ekitabo ky’obukuumi mu konteyina y’okukozesa & Okuzzaawo ebibaddewo.