Docker eða Kubernetes framleiðslumagni eytt: Björgun docker system prune --volumes, overlay2 Inodes, og etcd Skyndimyndir¶
Neyðarnúmer eru mismunandi eftir löndum. Þessi síða notar 911, númerið fyrir Bandaríkin og Kanada. Mörg önnur lönd nota 112, 999 eða annað númer. Finndu númerið fyrir landið þitt.
Hlaupandi docker compose down -v, docker system prune -a --volumes, docker volume rm, eða kubectl delete pvc á röngum flugstöðvarflipa í framleiðslu er ein fljótlegasta leiðin til að þurrka lifandi PostgreSQL, MySQL, MariaDB, Redis, MongoDB eða SQLite gagnagrunnsmagn. Ólíkt skyndimyndum af sýndarvél úr skýi sem færast í 7 daga ruslakörfu, er staðbundinn bindistjóri Docker (/var/lib/docker/volumes/<name>/_data) og Kubernetes local-path / hostPath veitendur gefa strax út staðal POSIX unlink() og rmdir() kallar beint á undirliggjandi Linux hýsingarkerfi (ext4, XFS, eða Btrfs). Sérhver skrif sem á sér stað á þeim Linux hýsingaraðila eftir að skipuninni lýkur getur skrifað yfir losaðar gagnagrunnsblokkir á disknum. Ef netþjónsdiskurinn þinn fylltist 100 prósent (0 bytes free) áður en einhver hljóp docker system prune --volumes í læti, ráðfærðu þig miðlara diskur 100% fullur, gagnagrunnur WAL log uppþemba, og núll-rými bati; fyrir hreinmálm Linux skrá eyðingu utan gáma, sjá óvart rm -rf eða Shift-Delete á ext4, XFS, APFS og NTFS: skrifvarinn endurfesting og inode útskurður og sýndarvél VMDK, VHDX og qcow2 skyndimynd keðjuspilling og björgun hásjávar. Ef þessi framleiðslustöðvun hefur áhrif á umönnun sjúklinga á sjúkrahúsi, neyðarsendingu eða öryggiskerfi almenningsveitna skaltu hringja í neyðarnúmerið þitt (911 í Bandaríkjunum og Kanada, 112 víðsvegar um Evrópusambandið, 999 í Bretlandi) eða skoðaðu skrána okkar yfir neyðarnúmer.
Gerðu þetta núna¶
- EKKI hlaupa
docker compose up -d,systemctl restart docker, eða endursetja Kubernetes hólf: Með því að endurskapa ílátið eða endurræsa Docker púkann skrifar megabæt af nýjumoverlay2lýsigögn, gáma JSON logs og nýuppstilltar tómar gagnagrunnsskrár (initdb) beint yfir nákvæmlegaext4eðaXFSblokkir þar sem hljóðstyrkurinn sem var eytt var til staðar fyrir sekúndum. - ** Athugaðu í 5 sekúndur ef gámaferlið (
postgres,mysqld,redis-server,node,python) er enn í gangi í minni (ps auxogsudo lsof +L1)**: Ef einhver eyddi skrám í uppsettu bindi eða aftengdi nafnlaust bindi meðan gámurinn er enn í gangi heldur Linux kjarninn 100 prósent af ótengdum gagnagrunnsskrám lifandi á disknum svo framarlega sem hýsilsins Process ID (PID) hefur opinn skráarlýsingu (FD). Þú getur afritað þessar skrár beint út úr/proc/<PID>/fd/eða/proc/<PID>/root/með núll gagnatapi áður en ílátið stoppar. - Ef ílátið er þegar stöðvað og hljóðstyrknum var eytt (
docker compose down -veðadocker system prune --volumes), frystu gestgjafi diskur skrifar strax: Stöðva Docker púkinn (sudo systemctl stop docker.socket docker.service containerd) so background containers and healthchecks stop writing logs into/var/lib/docker, þá annað hvort aftur/var/lib/docker(eða rótin/skipting) skrifvarinn (sudo mount -o remount,ro /) or take an immediate block-level cloud volume snapshot (AWS EBS Snapshot,GCP Persistent Disk Snapshot,DigitalOcean Volume Snapshot) before touching anything. - If you are on Kubernetes (
kubectl delete pvceðakubectl delete namespace), check the PersistentVolume (PV)ReclaimPolicy(kubectl get pv) strax: - If the
PVhadpersistentVolumeReclaimPolicy: Retain, your data is not deleted: thePVsimply moved toReleasedstatus and your cloud disk (EBS,Azure Disk,Ceph RBD,NFS) is 100 percent intact. - Even if
kubectl delete pvcis stuck inTerminating, Kubernetes Finalizers (kubernetes.io/pvc-protection) block the CSI driver from deleting the underlying storage as long as any Pod still references that PVC. Do not delete the Pod until you copy the data out of the running Pod. - Image the underlying block partition (
dd/ddrescueover SSH) to an external disk or separate cloud volume before runningext4magic,extundelete, eðaPhotoRec: Never run file carvers that write output files onto the same disk partition from which you are recovering/var/lib/docker/volumes. - For corrupted or accidentally wiped Kubernetes cluster state (
kubectl delete crd/namespace), stopkube-apiserverand restore your latestetcdsnapshot (etcdctl snapshot restore): If the cluster state inetcdwas wiped while the underlying cloud storage volumes still exist, restoringetcdendurheimtir alltPV,PVC,Secret, ogConfigMaphlutir samtímis.
Danger
Fjarlægðu aldrei kubernetes.io/pvc-protection eða kubernetes.io/pv-protection lokaritari með kubectl patch ... -p '{"metadata":{"finalizers":null}}' þegar PVC er fastur í Terminating: Þessi lokaútbúnaður er það eina sem heldur skýinu CSI bílstjóranum þínum (aws-ebs-csi-driver, pd.csi.storage.gke.io, Longhorn, Rook-Ceph) frá útgáfu vélbúnaðar DeleteVolume API kall til að eyðileggja framleiðsludiskinn þinn. Á meðan PVC er fast í Terminating, Pod er enn í gangi og hljóðstyrkurinn er enn festur: keyra kubectl exec eða kubectl cp (eða pg_dump / mysqldump) strax til að bjarga 100 prósent af gagnagrunninum þínum áður en Pod lýkur.
Ákvörðunartré: eytt Docker bindi, overlay2 lag, eða Kubernetes PVC triage¶
Notaðu þetta flæðirit til að velja hraðvirkustu endurheimtarleiðina fyrir núll tap byggt á því hvort gámaferlið sé enn á lífi, hvort hljóðstyrkurinn hafi verið studdur af staðbundnum diski eða CSI geymslu í skýi og hvaða skráarkerfi hýsir /var/lib/docker:
flowchart TD
Start["Framleiðslugögn vantar eftir Docker eða Kubernetes Delete Command"] --> WhichEnv{"Hvaða pallur og stjórn olli tapinu?"}
WhichEnv -->|"Docker: gámur enn í gangi (skrár ótengdar inni í bindi/íláti)"| ProcRescue["Bjarga opnum ótengdum skráarlýsingum með sudo lsof +L1 og /proc/PID/fd/N eða /proc/PID/root/"]
WhichEnv -->|"Docker: Gámur stöðvaður og bindi eytt (semja niður -v / prune --volumes)"| StopDocker["Hlaupa strax: sudo systemctl stop docker.socket docker containerd"]
WhichEnv -->|"Kubernetes: kubectl eyða pvc / pv / statefulset / nafnrými"| K8sCheck{"Er fræbelgurinn enn í gangi EÐA er PVC fastur í lokun?"}
K8sCheck -->|"Já: Pod Enn í gangi (Finalizer hindrar CSI Delete)"| K8sExec["EKKI eyða Pod -> Keyra kubectl exec / pg_dump / tar yfir stdout á staðbundinn disk strax"]
K8sCheck -->|"Nei: Pod Gone -> Athugaðu kubectl fá pv"| ReclaimCheck{"Hvað var PV Reclaim Policy?"}
ReclaimCheck -->|"Halda (PV Staða = Gefin út)"| ClearClaimRef["100% gögn ósnortin -> Breyta PV til að fjarlægja spec.claimRef.uid -> Endurbinda við nýtt PVC"]
ReclaimCheck -->|"Eyða (Cloud EBS / PD / Longhorn / Local-Path)"| CloudOrLocal{"Cloud CSI Volume eða Local Host Disk?"}
CloudOrLocal -->|"Cloud CSI (AWS EBS / GCP / Azure / Ceph)"| CloudSnap["Athugaðu ruslafötuna úr Cloud Console / Sjálfvirkar EBS skyndimyndir / Ceph RBD rusl (rbd rusl ls)"]
CloudOrLocal -->|"Local Node Disk (local-path / hostPath)"| StopDocker
StopDocker --> RemountRO["Endurtengja hýsingarskiptingu skrifvarið (mount -o remount,ro) EÐA Straumaðu blokkamynd yfir SSH"]
RemountRO --> HostFS{"Hvaða skráakerfi hýsir /var/lib/docker?"}
HostFS -->|"ext4"| Ext4Rec["Notaðu villuleit / ext4magic Journal Inode Transaction Backback (-tímastimpill)"]
HostFS -->|"XFS / Btrfs"| CarveRec["Notaðu Btrfs Roots / xfs_irecover / Custom Signature Carving fyrir SQLite, Postgres Heap eða InnoDB .ibd"]
Áfangi 1: Hvernig Docker og Kubernetes eyða í raun bindum á disknum¶
Áður en þú keyrir endurheimtarskipun skaltu skilja hvar gögnin þín bjuggu líkamlega á Linux hýsingaraðilanum og hvað eyða skipunin snerti í raun:
| Tegund geymslu og Eyða skipun | Host File System Path á Linux hnút | Það sem Eyða skipunin gerði í raun | Tafarlaus bataaðferð |
|---|---|---|---|
Nafnt Docker Volume (docker volume rm eða docker compose down -v) |
/var/lib/docker/volumes/<vol_name>/_data |
Aftengdi skrárnar inni _data/ og fjarlægði möppufærsluna frá /var/lib/docker/volumes/metadata.db (boltdb). |
Stöðvaðu Docker strax, settu aftur upp /var/lib/docker skrifvarið, og endurheimta ótengdar inóða í gegnum ext4magic / debugfs eða undirskriftarskurður. |
Anonymous Docker Volume (docker run -v /var/lib/mysql + docker rm -v eða docker system prune --volumes) |
/var/lib/docker/volumes/<64-char-hex-id>/_data |
docker system prune --volumes eyðir hverju nafnlausu og nafngreindu bindi sem ekki er vísað til eins og er af að minnsta kosti einum núverandi íláti. |
Stöðva Docker strax; ef þú varst með önnur stöðvuð ílát þar sem rúmmál þeirra var ekki klippt, athugaðu þá sem eftir eru /var/lib/docker/volumes/*/_data möppur fyrst áður en óúthlutaðar blokkir eru skornar út. |
** Skrifanlegt lag ílát (docker rm <container> þegar gögn voru skrifuð utan bindis)** |
/var/lib/docker/overlay2/<layer-id>/diff/ |
Aftengdi efri hluta gámsins diff/ skrá inni í overlay2 geymslu bílstjóri. |
Stöðvaðu Docker strax og endurheimtu ótengda skráartréð úr ext4 dagbók eða XFS blokkir. |
Docker Desktop á macOS eða Windows (docker system prune --volumes) |
Inni í einni mynd af sýndarvélardiski: -/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw (macOS) eða %LocalAppData%\Docker\wsl\disk\docker_data.vhdx (Windows WSL2). |
Sent unlink() inni í Linux VM, og ef discard/TRIM er virkt á Docker.raw / docker_data.vhdx, sló dreifð göt í hýsilskrána. |
Hættu Docker Desktop innan 5 sekúndna, afritaðu Docker.raw eða docker_data.vhdx á utanáliggjandi drif og keyrðu ext4magic / PhotoRec á móti sýndardisksmyndinni. |
Kubernetes PVC með Delete ReclaimPolicy á Ceph RBD (Rook-Ceph) eða Longhorn |
Ceph OSD laug (rbd) eða /var/lib/longhorn/replicas/. |
Ef csi-rbdplugin hefur trash virkt (rbd trash), RBD myndin er færð í Ceph ruslatunnu; annars eru blokkir ókortlagðar. |
Hlaupa rbd trash ls --pool <pool> inni í rook-ceph-tools pod og endurheimta með rbd trash restore. |
Stig 2: Að bjarga opnum gagnagrunnsskrám úr íláti sem er enn í gangi (/proc/<pid>/fd/)¶
Bíddu: er gámurinn enn í gangi núna?
Oft keyrir verkfræðingur forritaflutningsforskrift, cron-hreinsunarvinnu eða handbók rm -rf /var/lib/postgresql/data/* eða rm /app/data/production.sqlite3 inni í gangi ílát, eða eyðir undirliggjandi host bind-mount möppu /opt/app/data á meðan ílátið sjálft (postgres, mysqld, mariadbd, redis-server, mongod, gunicorn, node) er enn í gangi.
Í Linux er skrá ekki eytt af disknum þegar rm eða unlink() heitir. Diskblokkir þess og inóða eru áfram 100 prósent úthlutað og læsileg þar til síðasta ferlið er með opna skráarlýsingu (FD) við það inode lokar það eða hættir.
Skref 1: Finndu auðkenni gestgjafaferlisins (PID) af gámaferlinu¶
Finndu hýsilinn á Linux hýsingarhnútnum (ekki inni í ílátinu). PID af gagnagrunninum þínum eða umsóknarferli:
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)
NLINK: það stendur 0, og skráarnafnið endar á (deleted). Skráin er alveg horfin úr ls /var/lib/docker/volumes/..., samt hvert einasta bæti (482 MB inn users.ibd, 89 MB inn production.sqlite3) er enn á lífi inni /proc/<PID>/fd/<FD>.
Skref 2: Afritaðu ótengdu gagnagrunnsskrárnar beint úr /proc/<PID>/fd/¶
Ekki **stöðva eða endurræsa ílátið. Á meðan ferlið er enn í gangi, afritaðu hráskráarlýsingarnar beint í örugga möppu á gestgjafanum þínum:
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
Skref 3: Jafnvel betra: Keyra lifandi rökrétt sorp (pg_dump / mysqldump / .backup) áður en ílátið lokar FDs¶
Ef postgres eða mysqld er enn í gangi með gagnaskrár sínar opnar í minni og /proc/<PID>/fd/, reyndu fyrst að keyra lifandi rökrétt dump yfir núverandi unix fals eða TCP tengingu:
# 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
.1, .2 skiptu skrám yfir starfsferla á virkan hátt, svo pg_dump gæti bilað á borðum sem eru ekki í skyndiminni; að sameina lifandi SQL fyrirspurn og afrita hvert opið /proc/<pid>/fd/* yfir allt postgres barnabakenda PID vistar hámarks möguleg töfluhrúgugögn.)
3. áfangi: Endurheimt eytt Docker bindi á ext4 eða XFS eftir að gámurinn stöðvaðist¶
Hvað ef þú hleypur docker compose down -v eða docker system prune --volumes, þannig að gámurinn er þegar stöðvaður og allt /proc/<pid>/fd/ lýsingar eru lokaðar? Nú ertu í kapphlaupi við bakgrunnsdisk sem skrifar á Linux hýsilinn.
Skref 1: Frystu Linux hýsingarkerfið innan 10 sekúndna¶
- Stöðvaðu Docker, containerd, kubelet og cron strax þannig að enginn gámur, heilsufarsskoðun eða annálarsnúningur skrifar annað bæti til
/var/lib/docker: - ** Athugaðu hvaða blokkunartæki og skráarkerfi geymir
/var/lib/docker**: - Tengdu aftur skiptinguna Read-Only (eða streymdu hrári skiptingarmynd yfir SSH á aðra vél):
- Ef
/var/lib/dockerer á eigin sérstöku skiptingi eða LVM bindi (til dæmis/dev/nvme0n1p2eða/dev/mapper/vg0-docker), settu það aftur skrifvarið strax: - Ef
/var/lib/dockerer á rótinni/skipting (/), reyndu að þvinga rótarskiptingu skrifvarið með því að nota kjarnann Magic SysRq kveikju (echo u | sudo tee /proc/sysrq-trigger) eðasudo mount -o remount,ro /. - Ef þú ert á VPS skýi (AWS EC2, GCP, DigitalOcean, Hetzner, Linode): Farðu strax á skýjavefborðið þitt og smelltu á Create Snapshot á blokkarmagni þjónsins (eða streymdu hráu blokkartækinu yfir SSH á annan netþjón:
sudo dd if=/dev/nvme0n1p1 bs=4M status=progress | gzip -1 | ssh user@backup-server "cat > /mnt/storage/docker_host_raw.img.gz").
Skref 2: Athugaðu hvort gögnin þín séu enn í ANNU óklipptu bindi eða overlay2 lag¶
Áður en óúthlutaðar diskablokkir eru skornar út skaltu ganga úr skugga um að gagnagrunnurinn þinn hafi ekki verið geymdur í bindingarfestingu eða öðru nafni bindi sem lifði af:
# 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
docker volume rm app_db_data, aðeins til að uppgötva með find /var/lib/docker það docker-compose.yml hafði í raun skapað projectname_app_db_data (sem er enn 100 prósent ósnortinn á disknum) á meðan app_db_data var gamalt ónotað bindi frá því fyrir hálfu ári.
Skref 3: Endurheimt ótengdar Docker bindiskrár á ext4 með því að nota ext4 Dagbók (ext4magic og debugfs)¶
Hvenær docker volume rm eyðir /var/lib/docker/volumes/<vol_name>/_data á an ext4 skráarkerfi, ext4 núllar út beinu blokkavísana (i_block / umfang trjárótar) í lifandi inode töflunni. Hins vegar er ext4 dagbók (inode <8>, venjulega 128 MB til 1024 MB hringlaga hringja biðminni) geymir enn söguleg afrit af nákvæmum inode töflum og skráarblokkum frá rétt áður docker compose down -v var tekinn af lífi.
+-------------------------------------------------------------------------+
| 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. |
+-------------------------------------------------------------------------+
Hlaupa ext4magic gegn skrifvarið skiptingunni þinni (eða .img skyndimynd afrit á öðrum netþjóni), sem tilgreinir tímastimpil (-a) frá 5 mínútum áður þú hljóp docker compose down -v eða 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: Lesir dagbókarmyndina sem þú vistaðir í vinnsluminni strax eftir að Docker er stöðvað.
- -f var/lib/docker/volumes: Miðar á nákvæmlega Docker bindi skráartréð (athugið: slepptu fremstu / inn ext4magic afstæðar leiðir).
- -a $(date -d "-15 minutes" +%s): Segir ext4magic til að endurbyggja möpputréð með því að nota inode afrit sem giltu fyrir 15 mínútum (rétt fyrir eyðingu fyrir slysni).
- -r: Endurheimtir heilar möppur þar sem engar blokkir voru skrifaðar yfir; ef -r vantar yfirskrifaðar skrár að hluta, keyrðu aðra leið í staðinn -r með -m (galdur útskurður + journal blendingur háttur).
Skref 4: Útskorið hráar SQLite, PostgreSQL eða MySQL InnoDB skrár þegar dagbókin hefur pakkað (XFS eða ext4)¶
Warning
Af hverju XFS styður ekki ext4magic og krefst tafarlausrar skrifvarins aftengingar: Ólíkt ext4, sem skrifar full 256-bæta inode afrit í dagbók sína, XFS skráir lýsigögn ásetning deltas og endurnýtir lausa inode B-tré á harkalegan hátt (agi). Ef /var/lib/docker situr á an XFS skipting (sjálfgefið á RHEL, Rocky Linux, AlmaLinux og Amazon Linux), aftenging /var/lib/docker eða endurreisn / skrifvarinn innan nokkurra sekúndna er mikilvægasta skrefið fyrir útskurð.
Ef gestgjafinn notar XFS eða ef ext4 dagbók sem þegar er vafið yfir inode bendina, notaðu undirskrift og uppbyggingarskurð á móti hráu diskamyndinni (docker_host_raw.img):
- Fyrir SQLite3 gagnagrunna (
.sqlite,.db- t.d. Vaultwarden, Nextcloud, Home Assistant, Gitea, Grafana): Sérhver SQLite3 gagnagrunnur byrjar á ótvíræðum 16-bæta ASCII-haus á bæti 0 á fyrstu 4 kílóbæta síðu sinni:53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00("SQLite format 3\0"), og geymir nákvæma gagnagrunnssíðustærð (Bytes 16..17, venjulega4096) og heildarstærð gagnagrunns á síðum (Bytes 28..31, big-endian 32-bita heiltala) beint inni í sama haus. - Hlaupa
PhotoRecmeð[File Opt]->[x] sqlitevirkt, eða skannaðu skiptinguna beint meðgrep -ab "SQLite format 3"til að finna nákvæma bætajöfnun á eyddum SQLite skránni þinni og draga hana út meðdd:Þegar búið er að draga það út skaltu keyra# Find the exact byte offsets of every "SQLite format 3" header on the partition: sudo grep -ab "SQLite format 3" /dev/nvme0n1p1sqlite3 carved.db ".recover" | sqlite3 repaired.dbað endurgera hverja ósnortna B-tré laufsíðu.
Tip
Hvernig á að reikna út nákvæmlega dd bætastærð ótengdrar SQLite3 skrá frá haus hennar: Einu sinni grep -ab "SQLite format 3" gefur þér upphafsbætajöfnun OFFSET af SQLite gagnagrunninum sem var eytt, lestu bæti 16..17 (uint16 big-endian síðustærð, t.d., 0x1000 = 4096 bæti) og bæti 28..31 (uint32 big-endian Page Count, t.d., 25000 síður) með því að nota hexdump -C -s OFFSET -n 32. Margföldun Page Size x Page Count gefur þér nákvæma bætislengd til að fara í dd (iflag=skip_bytes,count_bytes) þegar skráin er samliggjandi á disknum.
- Fyrir MySQL / MariaDB InnoDB (
.ibdtöfluskrár): Sérhver InnoDB.ibdtafla samanstendur af röð16 KB(16,384bæti) síður sem innihaldaFIL_PAGE_INDEX(0x45BF) haus og borðið er einstaktspace_id. Notaðu Percona / TwinDBundrop-for-innodb(stream_parser+c_parser) verkfærakista til að skanna/dev/nvme0n1p1fyrir alla16 KBInnoDB skráarsíður og sendu hverja röð beint í TSV/SQL skrár til að flytja inn aftur. - Fyrir PostgreSQL hrúguskrár (
$PGDATA/base/<db_oid>/<relfilenode>): PostgreSQL geymir hvert borð sem samliggjandi8 KB(8,192bæti) hrúgusíður sem innihaldaPageHeaderData(pd_lower,pd_upper,pd_special). Notaðupg_filedumpeðapglazarus/pdutil að skanna óúthlutað disksvæði fyrir8 KBsíður sem passa við dálkauppsetningu töflunnar þinnar (HeapTupleHeaderData) og endurgerðu línurnar.
Áfangi 4: Kubernetes PVC, PV, og etcd Skyndimynd neyðarbata¶
Í Kubernetes (EKS, GKE, AKS, k3s, RKE2, kubeadm, OpenShift), eyðir fyrir slysni PersistentVolumeClaim (kubectl delete pvc), StatefulSet eða heilt nafnarými (kubectl delete ns prod) fylgir mjög öðrum arkitektúr en sjálfstæður Docker.
Atburðarás A: PVC sýnir Terminating (The Finalizer Lifesaver)¶
Hlaupa:
If theSTATUS dálkur segir Terminating, andaðu léttar: Gögnum þínum hefur EKKI verið eytt ennþá.
- Hvers vegna? Sérhver Kubernetes PVC búin til þar sem Kubernetes 1.9 inniheldur sjálfkrafa finalizers: [kubernetes.io/pvc-protection].
- Svo lengi sem Pod er enn að setja upp PVC, neitar Kubernetes stjórnandi að ljúka PVC eyðingu og ** hringir aldrei í CSI bílstjórann DeleteVolume RPC**.
- Aðgerð strax: Ekki EKKI eyða eða endurræsa Pod, og EKKI plástra út lokaútbúnaðinn. Afritaðu strax öll gögn úr hlaupandi Pod yfir á staðbundna vélina þína eða S3 fötu:
# 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
Sviðsmynd B: PVC var eytt, og kubectl get pv sýnir PersistentVolume í Released ríki (ReclaimPolicy: Retain)¶
Hlaupa:
Ef viðvarandi hljóðstyrkur þinn (pv-prod-postgres) er enn skráð með STATUS: Released (vegna þess að StorageClass þess er notaður reclaimPolicy: Retain), 100 prósent af gögnum þínum eru enn ósnert á undirliggjandi diski. Hins vegar, Kubernetes neitar að láta nýtt PVC bindast a Released PV vegna þess að PV inniheldur enn a spec.claimRef sem bendir á gömlu eyddu PVC-efnið UID.
Hvernig á að búa til a Released PV Available aftur eftir 10 sekúndur án gagnataps:
1. Breyttu PersistentVolume hlutnum og eyddu spec.claimRef blokk:
kubectl get pv aftur: staðan breytist strax úr ReleasedtilAvailable.
3. Endurskapa þitt PersistentVolumeClaim (tilgreinir volumeName: <your-pv-name> og samsvarandi getu/geymslaClassName). Það mun bindast núverandi PV strax með allar skrár ósnortnar.
Atburðarás C: Endurheimt þurrkað Kubernetes klasaástand frá an etcd snapshot (etcdctl snapshot restore)¶
Hvað ef einhver hljóp kubectl delete namespace prod eða helm uninstall og þurrkaði út 200 Kubernetes upplýsingaskrár, Secrets, Config Maps og PV skilgreiningar á sjálfstýrðri kubeadm, k3s, eða RKE2 stjórna flugvél?
- ** Finndu nýjasta
etcdskyndimynd** (sjálfgefið í/var/lib/rancher/k3s/server/db/snapshots/,/var/lib/rancher/rke2/server/db/snapshots/, eða áætlun þinni/var/backups/etcd/snapshot.db). - Staðfestu heilleika skyndimyndarinnar áður en þú snertir lifandi þyrpinguna:
- Hættu
kube-apiserverogetcdá hnút/-um stjórnplans: - Á
kubeadm(stöðugir belg): Færðu þig/etc/kubernetes/manifests/kube-apiserver.yamlog/etc/kubernetes/manifests/etcd.yamltímabundið til/root/manifests_hold/svokubeletstöðvar báðar ílátin hreint og snýr síðan aftur upp/var/lib/etcdtil/var/lib/etcd.bak. - Á
k3s: Hlaupasudo systemctl stop k3sogsudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshot. - ** Endurheimtu
etcdgagnaskrá ákubeadm**: - Færa
etcd.yamlogkube-apiserver.yamlaftur inn í/etc/kubernetes/manifests/. Innan 30 sekúndna,kube-apiservertengist aftur við endurheimtetcdgeyma og sérhver eyddur Namespace, Secret, ConfigMap og PersistentVolume hlutur birtist aftur.
Áfangi 5: Herða Docker og Kubernetes bindi gegn eyðingu fyrir slysni¶
Þegar framleiðslugagnagrunnurinn þinn hefur verið endurheimtur skaltu innleiða þessar fjórar byggingarvarðar svo ein CLI innsláttarvilla geti aldrei eytt lifandi bindi aftur:
- Breyttu hverri framleiðslu Kubernetes
StorageClassfráreclaimPolicy: DeletetilreclaimPolicy: Retain: Sjálfgefið, innbyggðir skýjageymsluflokkar (gp2,gp3,standard-rwo) sjálfgefið tilreclaimPolicy: Delete, sem þýðir að eyða PVC eyðileggur skýjadiskinn. Búðu til aStorageClassmeðreclaimPolicy: Retain(eða plástra núverandi PVs meðkubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}') þannig að það að eyða PVC eða nafnrými eyðir aldrei undirliggjandi bindi. - Virkja AWS EBS ruslatunnu / GCP skyndimyndaáætlanir / Velero með CSI skyndimyndum: Með því að virkja AWS EBS ruslatunnu geymir allt eytt EBS bindi í 7 til 30 daga jafnvel þótt CSI bílstjórinn hringi
DeleteVolume. - Aldrei nota
docker system prune --volumesí sjálfvirkum hreinsunarforskriftum eða CI/CD hlaupurum: Ef framleiðslugagnagrunnsílát hrynur í stutta stund (Exited (1)) á nákvæmlega því augnabliki sem cron starf keyrirdocker system prune -a --volumes -f, Docker telur nafnlaus bindi þess „ónotuð“ og eyðir þeim varanlega. Strip--volumesúr öllum hreinsunarforskriftum. - Notaðu skýrar hýsilbindingar (
/srv/prod_data/postgres:/var/lib/postgresql/data) eða utanaðkomandi stýrðum gagnagrunnum fyrir staðbundið framleiðsluálag: Ólíkt/var/lib/docker/volumes/, hýsir bind-mount möppur fyrir utan/var/lib/docker/eru aldrei snert afdocker compose down -v,docker volume rm, eðadocker system prune --volumes.
Svæðisbundin neyðarnúmer og samskiptareglur stofnunarinnar¶
Þegar eyðing íláts eða Kubernetes geymslu hefur áhrif á klíníska starfsemi sjúkrahúss, sendingu almenningsöryggis eða eftirlitsskyldra persónuupplýsinga, skal stigmagnast strax:
- Bandaríkin og Kanada: Hringdu
911ef bilun í gámaklasa gerir klínískt eftirlit með sjúklingum óvirkt, EHR kerfi eða neyðarsendingu. Tilkynna skaðlega eyðingu gámainnviða eða netatvik til CISA (1-844-Say-CISA/cisa.gov/report) eða Canadian Center for Cyber Security (1-833-CYBER-88). - Bretland: Hringdu
999fyrir ógnir við líf eða mikilvægan innviði NHS. Samkvæmt GDPR í Bretlandi krefst varanleg eyðilegging eða tap á aðgengi að persónulegum gögnum án endurheimtanlegs öryggisafrits að metið sé 72 klukkustunda tilkynning um brot til ICO (0303 123 1113). - Evrópusambandið: Hringja
112í öllum aðildarríkjum ESB. Aðilar samkvæmt NIS2 tilskipuninni verða að senda inn viðvörun til innlendra CSIRT innan 24 klukkustunda frá alvarlegu þjónustuleysi og varanlegt tap á persónuupplýsingum kallar fram GDPR grein 33. grein tilkynningar innan 72 klukkustunda. - Ástralía og Nýja Sjáland: Hringja
000í Ástralíu eða111á Nýja Sjálandi; tilkynna mikilvæg innviðaatvik til ACSC (1300 CYBER1). - Indland og Asíu-Kyrrahaf: Hringja
112á Indlandi fyrir neyðarviðbrögð; tilkynntu öryggisatvik í skýi eða gámum til CERT-In (incident@cert-in.org.in) innan lögboðins 6 tíma glugga.
Algengar spurningar¶
Gerir það docker compose down -v eyða hýsilbindingum (./data:/var/lib/mysql) eða aðeins Named and Anonymous Docker bindi?¶
`docker compose down -v` AÐEINS eyðir nafngreindum bindum sem lýst er yfir í `volumes:` kafla af `docker-compose.yml` og nafnlaus bindi sem fylgja ílátunum; það aldrei eyðir skrám inni í host bind fjalli (svo sem `- /opt/mysql_data:/var/lib/mysql` eða `- ./postgres_data:/var/lib/postgresql/data`). Ef skrifa skráin þín notaði hýsilslóð sem byrjar á `/` eða `./`, athugaðu þá möppu á gestgjafanum núna: skrárnar þínar eru enn 100 prósent ósnortnar.
Hvers vegna gerði docker system prune --volumes eyða gagnagrunnsmagninu mínu þegar ég stoppaði aðeins ílátið í 2 mínútur til að uppfæra umhverfisbreytu?¶
Bíddu vandlega eftir greinarmun á milli `docker stop` og `docker rm`: ef ílát er eingöngu `Stopped / Exited` (sýnilegt í `docker ps -a`), `docker system prune --volumes` gerir ekki eyða bindum þess vegna þess að stöðvaði ílátið vísar enn til þeirra. Hins vegar, ef þú hljóp `docker rm
Get ég endurheimt eytt Docker bindi inni í Docker Desktop á Mac (Apple Silicon / Intel) eða Windows (WSL2)?¶
Já, ef þú hættir strax í Docker Desktop svo sýndarvélin hætti að keyra `fstrim` á móti sýndardisknum. Á macOS geymir Docker öll Linux bindi inni `-/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw`; á Windows WSL2, inni `%LocalAppData%\Docker\wsl\disk\docker_data.vhdx`. Afritaðu það `.raw` eða `.vhdx` skrá strax á ytri SSD, hengja hana skrifvarið í Linux (með því að nota `losetup -Pr` fyrir `.raw` eða `qemu-nbd -r` fyrir `.vhdx`), og hlaupið `ext4magic` eða `PhotoRec` á móti sýndarverunni `ext4` skilrúm að innan.
Hvað ef ég eyddi Kubernetes StatefulSet með kubectl delete statefulset postgres? Eyddi það PVC-skjölunum mínum líka?¶
Nei. Sjálfgefið í Kubernetes (nema `persistentVolumeClaimRetentionPolicy.whenDeleted: Delete` var sérstaklega stillt á Kubernetes 1.27+), í gangi `kubectl delete statefulset` eyðir StatefulSet stjórnandanum og belgjum hans, yfirgefa allt `PersistentVolumeClaims` (`data-postgres-0`, `data-postgres-1`) og undirliggjandi gögn þeirra 100 prósent ósnortinn. Notaðu einfaldlega aftur `StatefulSet` YAML upplýsingaskrá með sama nafni og `volumeClaimTemplates`, og nýju belgirnir festast sjálfkrafa aftur við það sem fyrir er `data-postgres-0` PVC.
Hvernig fæ ég aðgang að skrám inni í Docker overlay2 möppu þegar ílátið neitar að byrja (CrashLoopBackOff / Exited (1))?¶
Ekki eyða ílátinu sem hrundi. Svo lengi sem stöðvaði gámurinn er enn til í `docker ps -a`, skrifanlegt lag og hljóðstyrksfestingar eru alveg ósnortnar á disknum. Þú getur annað hvort afritað skrár beint úr stöðvuðu ílátinu með því að nota `docker cp
Hvað ef einhver eyddi Kubernetes Namespace (kubectl delete ns prod) og allir PVC-efni höfðu reclaimPolicy: Delete á AWS EBS eða GCP?¶
Ef ský CSI bílstjórinn (`ebs.csi.aws.com` eða `pd.csi.storage.gke.io`) þegar framkvæmd `DeleteVolume` vegna þess að `reclaimPolicy` var `Delete`, athugaðu strax þrjú öryggisnet á skýjastigi: (1) athugaðu **AWS ruslafötuna fyrir EBS bindi** í AWS EC2 stjórnborðinu (ef varðveisluregla var virk á reikningnum/merkjunum, þá situr eytt EBS rúmmálið í ruslafötunni og hægt er að endurheimta það með 1 smelli); (2) athugaðu **AWS Backup / DLM / GCP Snapshot Schedules** fyrir nýjustu sjálfvirku hljóðstyrksmyndina; og (3) athugaðu hvort gagnagrunnurinn þinn streymdi WAL/binlogs (`WAL-G`, `pgBackRest`, `Litestream`) í S3/GCS fötu.
Tengdir leiðsögumenn¶
- Miðlaradiskur 100% fullur (0 bæti ókeypis): WAL gagnagrunnsuppþemba, skemmd B-tré og núll-pláss endurheimt
- Óviljandi
rm -rfeðaShift+Deleteá Linux, macOS eða Windows: tafarlaus skrifvarinn endurfesting og inode útskurður - Sýndarvél VMDK, VHDX og qcow2 skyndimyndakeðjuspilling og björgun hásjávar
- Óviljandi Git commit af AWS lyklum,
.envskrá eða einka SSH lykil í opinbera GitHub endurhverfu - Vefhýsingarkreppa, flutningur og endurheimt afritunar
- Tölvuafrit, 3-2-1 stefnan og hörmungarbati
- Neyðarnúmer eftir löndum
Heimildir og opinberar leiðbeiningar¶
- Opinber skjöl Kubernetes (
kubernetes.io/ Cloud Native Computing Foundation): Vörn fyrir geymsluhlut í notkun (kubernetes.io/pvc-protectionFinalizers), Reclaiming Persistent Volumes (Retainvs.Delete), og reksturetcdKlasar fyrir Kubernetes (etcdctl snapshot restore). - Docker Inc. (
docs.docker.com): Stjórna gögnum í Docker: Bindi, Bind Mounts,overlay2Arkitektúr fyrir geymslubílstjóra og tilvísun til prune. - Linux kjarnasamtökin (
kernel.org): The/procSkráarkerfi (procfsOpnaðu File Descriptor Recovery í gegnum/proc/<pid>/fd/) og Ext4 Journal Specification. ext4magicVerkefnaskjöl (ext4magic.sourceforge.net): Réttar inode and Journal Transaction Recovery on Ext3/Ext4 File Systems.- National Institute of Standards and Technology (
NIST) (Bandaríkin): Special Publication 800-190: Application Container Security Guide & Incident Recovery.