Volume Hilberîna Docker an Kubernetes jêbirin: Rizgarkirin docker system prune --volumes, overlay2 Inodes, û etcd Snapshots¶
Hejmarên rewşa awarte li gorî welat cuda ne. Ev rûpel 911, jimareya Dewletên Yekbûyî û Kanada bikar tîne. Gelek welatên din 112, 999, an hejmareke din bikar tînin. Hejmara welatê xwe bibînin.
Running docker compose down -v, docker system prune -a --volumes, docker volume rm, an kubectl delete pvc li ser tabloya termînalê ya çewt di hilberînê de yek ji awayên zûtirîn e ku meriv cildê databasa PostgreSQL, MySQL, MariaDB, Redis, MongoDB, an SQLite zindî paqij bike. Berevajî dîmenên makîneya virtual ewr a ku ber bi qulikek vezîvirandinê ya 7-rojî ve diçin, ajokarê voltaja herêmî ya Docker (/var/lib/docker/volumes/<name>/_data) û Kubernetes local-path / hostPath dabînker tavilê POSIX standard derdixin unlink() û rmdir() rasterast li dijî pergala pelan a bingehîn a Linux-ê bang dike (ext4, XFS, an Btrfs). Her nivîsandina ku li ser wê mêvandarê Linux-ê çêdibe piştî ku ferman qediya dikare blokên databasa azadkirî li ser dîskê binivîsîne. Ger dîska servera we ji sedî 100 dagirtî (0 bytes free) berî ku kesek bezî docker system prune --volumes di panîkê de, şêwir bikin dîska serverê 100% tije, databasa têketina têketinê ya WAL, û vejandina cîhê sifir; ji bo jêbirina pelê Linux-ê ya tazî-metal li derveyî konteynir, binêre rm -rf an Shift-Delete li ser ext4, XFS, APFS, û NTFS-ya qezayî: ji nû ve veqetandin-tenê xwendinê û qutkirina inode û makîneya virtual VMDK, VHDX, û qcow2 zencîra wêneya berteng û rizgarkirina hypervisor. Ger ev qutbûna hilberînê bandorê li lênihêrîna nexweşên nexweşxaneyê, şandina acîl, an pergalên ewlehiya karûbarê giştî bike, bi hejmara xweya acîl ya herêmî re telefon bikin (911 li Dewletên Yekbûyî û Kanada, 112 li seranserê Yekîtiya Ewropayê, 999 li Keyaniya Yekbûyî) an pelrêça me ya kontrol bikin hejmarên acîl.
Vê niha bikin¶
- ** NEBIN
docker compose up -d,systemctl restart docker, an Kubernetes pod ji nû ve saz bikin**: Ji nû ve çêkirina konteynerê an ji nû ve destpêkirina Daemon Docker megabytes nû dinivîseoverlay2metadata, têketinên JSON konteynir, û pelên databasa vala yên nû hatine destpêkirin (initdb) rasterast li ser rastext4anXFSblokên ku cildê weya jêbirin saniye berê rûniştibû. - ** Ger pêvajoya konteynerê di 5 çirkeyan de kontrol bikin (
postgres,mysqld,redis-server,node,python) hîn jî di bîrê de dixebite (ps auxûsudo lsof +L1(PID) ravekerek pelê vekirî digire (FD). Hûn dikarin wan pelan rasterast ji wan kopî bikin/proc/<PID>/fd/an/proc/<PID>/root/bi windabûna daneya sifir berî ku konteynir raweste. - **Heke konteynir jixwe rawestiyaye û deng hat jêbirin (
docker compose down -vandocker system prune --volumes(sudo systemctl stop docker.socket docker.service containerd) Ji ber vê yekê konteynerên paşerojê û kontrolên tenduristiyê nivîsandina têketinê rawestînin/var/lib/docker, paşê yan ji nû ve rakin/var/lib/docker(an jî kok/dabeşkirin) tenê-xwendin (sudo mount -o remount,ro /) an tavilê wêneyek volta ewr a asta blokê bikişîne (AWS EBS Snapshot,GCP Persistent Disk Snapshot,DigitalOcean Volume Snapshot) berî ku dest bi tiştekî bike. - ** Ger hûn li Kubernetes in (
kubectl delete pvcankubectl delete namespace), SersistentVolume (PV)ReclaimPolicy(kubectl get pv) yekser **: - Ger ku
PVhebûpersistentVolumeReclaimPolicy: Retain, daneyên we ** nayê jêbirin **: yaPVbi tenê bar kirReleasedstatû û dîska weya ewr (EBS,Azure Disk,Ceph RBD,NFS) ji sedî 100 saxlem e. - Heta ku
kubectl delete pvctê de asê mayeTerminating, Kubernetes Finalizers (kubernetes.io/pvc-protection) ajokarê CSI-ê ji jêbirina hilanîna bingehîn bigire heya ku her Pod hîn jî PVC-yê referans dike. Heta ku hûn daneyan ji Pod-a xebitandinê kopî nekin, Pod-ê jê nekin. - ** Parvekirina blokê ya bingehîn (
dd/ddrescueli ser SSH) berî ku bixebite li dîskek derveyî an volga ewr veqetîneext4magic,extundelete, anPhotoRec**: Tu carî karkerên pelan ên ku pelên derketinê li ser heman dabeşkirina dîskê ya ku hûn jê vedigirin dinivîsin/var/lib/docker/volumes. - Ji bo dewleta koma Kubernetes ya xerabûyî an bi xeletî hatî paqij kirin (
kubectl delete crd/namespace), rawestekube-apiserverû ya herî dawî ya xwe sererast bikinetcdwêneyek (etcdctl snapshot restore): Ger rewşa komê tê deetcddema ku cildên hilanîna ewr ên bingehîn hîn jî hene, hate paqij kirinetcdhemî vedigerînePV,PVC,Secret, ûConfigMaptiştên hevdemî.
Danger
Qet jê dernekevin kubernetes.io/pvc-protection an kubernetes.io/pv-protection finalizer bi kubectl patch ... -p '{"metadata":{"finalizers":null}}' dema ku PVC tê de asê dibe Terminating: Ew dawîker tenê tiştê ku ajokera CSI-ya weya cloud digire (aws-ebs-csi-driver, pd.csi.storage.gke.io, Longhorn, Rook-Ceph) ji derxistina hardware DeleteVolume Banga API-ê ku dîska hilberîna we hilweşîne. Dema ku PVC tê de asê maye Terminating, Pod hîn jî dimeşe û deng hîn jî siwar e: birevin kubectl exec an kubectl cp (an pg_dump / mysqldump) tavilê ji sedî 100 ya databasa xwe rizgar bikin berî ku Pod biqede.
Dara biryarê: volume Docker jêbirin, overlay2 layer, an Kubernetes PVC triage¶
Vê nexşerêyê bikar bînin da ku rêça paşvekêşana zero-wendaza herî bilez hilbijêrin li ser bingeha ka pêvajoya konteynerê hîn sax e, gelo deng ji hêla dîska herêmî an hilanîna cloud CSI ve hatî piştgirî kirin, û kîjan mêvandarên pergala pelan e. /var/lib/docker:
flowchart TD
Start["Daneyên Hilberandinê Piştî Fermana Jêbirina Docker an Kubernetes winda ne"] --> WhichEnv{"Kîjan Platform û Fermandar Wenda Kirin?"}
WhichEnv -->|"Docker: Konteyner Hîn Dikeve (Pelên Di hundurê Volume / Konteynirê de neyên girêdan)"| ProcRescue["Bi rêya sudo lsof +L1 û /proc/PID/fd/N an /proc/PID/root/ Danasîna Pelên Negirêdayî Vekin Rizgar bikin"]
WhichEnv -->|"Docker: Konteyner rawestiya û cild hat jêbirin (-v / qut kirin --cild)"| StopDocker["Yekser Bixebitîne: sudo systemctl docker.socket docker konteynir rawestîne"]
WhichEnv -->|"Kubernetes: kubectl pvc / pv / statefulset / navan jêbirin"| K8sCheck{"Ma Pod Hîn Dikeve AN Ma PVC di Bidawîbûnê de Asteng e?"}
K8sCheck -->|"Erê: Pod Hîn Dikeve (Finalizer Astengkirina CSI jêbirin)"| K8sExec["Pod Jê Jê NEKIN -> Kubectl exec / pg_dump / tar tavilê li ser stdout biavêje Dîska Herêmî"]
K8sCheck -->|"Na: Pod Gone -> Kubectl kontrol bikin pv bistînin"| ReclaimCheck{"Polîtîkaya Reclaim PV çi bû?"}
ReclaimCheck -->|"Bihêle (Rewşa PV = berdan)"| ClearClaimRef["100% Daneyên Intact -> PV biguherînin ku spec.claimRef.uid Rake -> Ji nû ve bi PVC-ya Nû ve girêdin"]
ReclaimCheck -->|"Jêbirin (EBS EBS / PD / Longhorn / Local-Path)"| CloudOrLocal{"Cloud CSI Volume an Dîska Mêvandarê Herêmî?"}
CloudOrLocal -->|"Cloud CSI (AWS EBS / GCP / Azure / Ceph)"| CloudSnap["Çopa Vegerînê ya Cloud Console / Wêneyên EBS-ê yên Xweser / Çopa Ceph RBD (rbd trash ls) kontrol bikin"]
CloudOrLocal -->|"Dîska Nodê ya Herêmî (rêya herêmî / hostPath)"| StopDocker
StopDocker --> RemountRO["Dabeşkirina Hostê Ji nû ve Bikin Tenê-Tenê Xwendin (Çiya -o ji nû ve, ro) AN Wêneyê Astengkirina Stream li ser SSH"]
RemountRO --> HostFS{"Kîjan Pergala Pelê Mêvandar e /var/lib/docker?"}
HostFS -->|"ext4"| Ext4Rec["Debugfs / ext4magic Journal Inode Vegera Danûstandinan bikar bînin (-demek demkî)"]
HostFS -->|"XFS / Btrfs"| CarveRec["Ji bo SQLite, Postgres Heap, an InnoDB .ibd, Btrfs Roots / xfs_irecover / Neqandina Îmzeya Xweser bikar bînin"]
Qonaxa 1: Çawa Docker û Kubernetes bi rastî cildên li ser dîskê jêbirin¶
Berî ku hûn fermanek vegerandinê bimeşînin, fêm bikin ka daneyên we bi fîzîkî li ser mêvandarê Linux-ê li ku dijîn û fermana jêbirinê bi rastî çi bandor kiriye:
| Tîpa hilanînê & Fermana jêbirin | Rêya Pergala Pelê Mêvandar li ser Linux Node | Fermana Delete Bi rastî çi Kir | Rêbaza Recovery Immediate |
|---|---|---|---|
** Bi navê Docker Volume (docker volume rm an docker compose down -v)** |
/var/lib/docker/volumes/<vol_name>/_data |
Pelên hundir veqetandin _data/ û têketina pelrêça jê derxist /var/lib/docker/volumes/metadata.db (boltdb). |
Docker tavilê rawestînin, ji nû ve rakin /var/lib/docker tenê-xwendin, û bi navgîniya inodeyên negirêdayî vegerînin ext4magic / debugfs an îsbatkirina îmzayê. |
** Volume Docker Anonymous (docker run -v /var/lib/mysql + docker rm -v an docker system prune --volumes)** |
/var/lib/docker/volumes/<64-char-hex-id>/_data |
docker system prune --volumes her cildên nenas û bi navkirî yên ku niha bi kêmanî yek konteynerek heyî ve nehatine referans jê dike. |
Docker tavilê rawestînin; heke we **** konteynerên din ên rawestayî yên ku cildên wan ne qutkirî bûn, mayî kontrol bikin /var/lib/docker/volumes/*/_data Pêşî peldankan berî ku blokên neveqetandî biqedînin. |
Qaba Nivîsbar a Konteynirê (docker rm <container> dema ku dane li derveyî cildekê hatine nivîsandin) |
/var/lib/docker/overlay2/<layer-id>/diff/ |
Girêdana jorîn a konteynerê hat veqetandin diff/ pelrêça hundirê overlay2 ajokerê hilanînê. |
Docker tavilê rawestînin û dara pelrêça negirêdayî ji pêvekê vegerînin ext4 rojname an XFS blokên. |
** Sermaseya Docker li ser macOS an Windows (docker system prune --volumes)** |
Di hundurê yek wêneyek dîska makîneya virtual de: -/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw (macOS) an %LocalAppData%\Docker\wsl\disk\docker_data.vhdx (Windows WSL2). |
şandin unlink() di hundurê Linux VM de, û heke discard/TRIM li ser çalak e Docker.raw / docker_data.vhdx, di pelê mazûvan de kunên sparse xistin. |
Di nav 5 çirkeyan de Sermaseya Dockerê biterikînin, kopî bikin Docker.raw an docker_data.vhdx li ajokerek derveyî, û birevin ext4magic / PhotoRec li dijî wêneya dîska virtual. |
** Kubernetes PVC bi Delete ReclaimPolicy li ser Ceph RBD (Rook-Ceph) an Longhorn ** |
hewza Ceph OSD (rbd) an /var/lib/longhorn/replicas/. |
Ger csi-rbdplugin heye trash çalak kirin (rbd trash), wêneya RBD tê veguheztin berbi çopê ya Ceph; Wekî din, blokên nexşeyê ne. |
Run rbd trash ls --pool <pool> hundirê rook-ceph-tools pod û restore bi rbd trash restore. |
Qonaxa 2: Rizgarkirina pelên databasa vekirî ji konteynirek hê jî dimeşe (/proc/<pid>/fd/)¶
Bisekine: ** konteynir hîn jî niha dixebite?**
Bi gelemperî, endezyarek skrîptek koçberiya serîlêdanê, karekî krona paqijkirinê, an manualek dimeşîne rm -rf /var/lib/postgresql/data/* an rm /app/data/production.sqlite3 di hundurê konteynirek xebitandinê de, an peldanka bingehîn a mêvandarê bind-mount jê dike /opt/app/data dema ku konteynir bixwe (postgres, mysqld, mariadbd, redis-server, mongod, gunicorn, node) hîn li ser kar e.
Di Linux de, pelek dema ku ji dîskê nayê jêbirin rm an unlink() tê gotin. Blokên dîskê û inoda wê ** ji sedî 100 veqetandî û xwendinê dimînin ** heya pêvajoya paşîn a ku ravekerek pelê vekirî digire (FD) ji bo wê inode wê digire an jî derdikeve.
Gav 1: Nasnameya Pêvajoya mêvandar bibînin (PID) pêvajoya konteynerê¶
Li ser girêka mêvandarê Linux (ne di hundurê konteynerê de), mêvandar bibînin PID databasa we an pêvajoya serîlêdanê:
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: dibêje 0, û navê pelê bi ** bi dawî dibe(deleted)**. Pelê bi tevahî ji holê rabûye ls /var/lib/docker/volumes/..., dîsa jî her byte (482 MB in users.ibd, 89 MB in production.sqlite3) hê jî li hundir dijî /proc/<PID>/fd/<FD>.
Gav 2: Pelên databasa negirêdayî rasterast jê kopî bikin /proc/<PID>/fd/¶
Konteynerê ** nehêlin** an ji nû ve bidin destpêkirin. Dema ku pêvajo hîn jî dimeşe, ravekerên pelê xav rasterast li peldankek ewledar a li ser mêvandarê xwe kopî bikin:
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
Gav 3: Hîn çêtir: Xalek mentiqî ya zindî bimeşînin (pg_dump / mysqldump / .backup) berî ku konteynir FD-yan bigire¶
Ger postgres an mysqld hê jî bi pelên daneyên xwe yên di bîrê de vekirî dimeşe û /proc/<PID>/fd/, pêşî li ser pêwendiya unix an pêwendiya TCP-ê ya heyî dumpek mentiqî ya zindî bimeşînin:
# 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 pelên dabeşkirina li seranserê pêvajoyên karker bi dînamîk, da pg_dump dibe ku li ser tabloyên neçaxkirî têk biçin; tevhevkirina pirsek SQL ya zindî digel kopîkirina her vekirî /proc/<pid>/fd/* li ser hemû postgres PID-yên pişta zarokê daneya berhevoka tabloyê ya herî gengaz hilîne.)
Qonaxa 3: Vegerandina cildek Dockerê jêbirin ext4 an XFS piştî ku konteynir rawestiya¶
Çi eger hûn bezî docker compose down -v an docker system prune --volumes, ji ber vê yekê konteynir jixwe rawestiyaye û hemî /proc/<pid>/fd/ raveker girtî ne? Naha hûn di pêşbaziyekê de ne li hember nivîsandina dîska paşîn a li ser mêvandarê Linux.
Gav 1: Pergala pelan a mêvandarê Linux di nav 10 çirkeyan de cemidîne¶
- ** Docker, konteynir, kubelet, û cron tavilê rawestînin** ji ber vê yekê tu konteynir, kontrolkirina tenduristiyê, an rotatorê têketinê baytek din nanivîse.
/var/lib/docker: - ** Kontrol bikin ka kîjan amûr û pergala pelan asteng dike
/var/lib/docker**: - ** Parçeyê Tenê-Xwendinî ji nû ve bihejînin (an jî wêneyek dabeşkirina xav li ser SSH ji makîneyek din re bişînin)**:
- Ger
/var/lib/dockerli ser dabeşkirina xweya taybetî an volga LVM-ê ye (mînak/dev/nvme0n1p2an/dev/mapper/vg0-docker), wê tavilê tenê-xwendewarî ji nû ve saz bikin: - Ger
/var/lib/dockerli ser kokê ye/dabeşkirin (/), biceribînin ku bi kernel Magic SysRq vekêşana kernel tenê-xwendewarê bi zorê bidin dabeşkirin (echo u | sudo tee /proc/sysrq-trigger) ansudo mount -o remount,ro /. - Heke hûn li ser VPS-ya ewr in (AWS EC2, GCP, DigitalOcean, Hetzner, Linode): Tavilê herin konsoleya weba ewr a xwe û Create Snapshot li ser voltama bloka serverê bikirtînin (an jî amûra bloka xav li ser SSH bişînin serverek duyemîn:
sudo dd if=/dev/nvme0n1p1 bs=4M status=progress | gzip -1 | ssh user@backup-server "cat > /mnt/storage/docker_host_raw.img.gz").
Gav 2: Kontrol bikin ka daneyên we hîn jî di HEWLÊN DIN ê bêpere de rûdine yan na overlay2 layer¶
Berî ku blokên dîskê yên ne veqetandî çêkin, verast bikin ku databasa we bi rastî di çîçekek bind an cildek bi navên cûda de ku sax maye nehatiye hilanîn:
# 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, tenê ji bo kifşkirina bi find /var/lib/docker ew docker-compose.yml bi rastî afirandibû projectname_app_db_data (ku hîn jî ji sedî 100 li ser dîskê saxlem e) dema app_db_data cildeke kevn a ku ji şeş meh berê nehatibû bikaranîn bû.
Gav 3: Vegerandina pelrêçiyên volumanên Docker ên negirêdayî li ser ext4 bi kar tînin ext4 Rojname (ext4magic û debugfs)¶
Dema ku docker volume rm jê dike /var/lib/docker/volumes/<vol_name>/_data li ser an ext4 pergala pelan, ext4 nîşankerên blokê yên rasterast sifir dike (i_block / Rayê darê dirêj) di tabloya inode ya zindî de. Lêbelê, ext4 kovar (inode <8>, bi gelemperî 128 MB to 1024 MB tampon zengila dorhêl) hîn jî kopiyên dîrokî yên tabloyên inode yên tam û blokên pelrêça yên ji berê rast digire. docker compose down -v hat îdam kirin.
+-------------------------------------------------------------------------+
| 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. |
+-------------------------------------------------------------------------+
Run ext4magic li dijî dabeşkirina weya tenê-xwendin (an .img kopiya wêneya wêneyê li ser serverek duyemîn), diyarkirina demjimêrek (-a) ji **5 deqe berî ** tu bezî docker compose down -v an 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: Piştî rawestandina Docker tavilê wêneya kovarê ya ku we di RAM-ê de tomar kiriye dixwîne.
- -f var/lib/docker/volumes: Dara pelrêça cildên Docker-ê ya rastîn hedef digire (têbînî: pêşengê derxe / in ext4magic rêyên têkildar).
- -a $(date -d "-15 minutes" +%s): Dibêje ext4magic ji bo ji nû ve avakirina dara pelrêça bi karanîna kopiyên inode derbasdar 15 hûrdem berê (rast berî jêbirina bêserûber).
- -r: Pelrêktorên bêkêmasî yên ku tu blokên lê nehatine nivîsandin vedigerîne; eger -r pelên bi qismî hatine nivîsandin winda dike, li şûna wê derbasiyek duyemîn bimeşîne -r bi -m (karkirina sêrbaz + moda hîbrid a kovarê).
Gav 4: Dema ku kovar pêça bû, pelên SQLite, PostgreSQL, an MySQL InnoDB yên xav çêdikin (XFS an ext4)¶
Warning
**Çima XFS piştgirî nake ext4magic û tavilê rakirina tenê-xwendinê hewce dike **: Berevajî ext4, ku kopiyên inode yên 256-byte bi tevahî di kovara xwe de dinivîse, XFS deltayên metadata mebesta qeyd dike û darên B-yê yên azadkirî ji nû ve bi kar tîne (agi). Ger /var/lib/docker li ser rûniştiye XFS dabeşkirin (li ser RHEL, Rocky Linux, AlmaLinux, û Amazon Linux-ya xwerû), veqetandin /var/lib/docker an jî ji nû ve siwarkirin / tenê xwendin di nav saniyeyan de gava yekane ya herî girîng e berî darvekirinê.
Ger mêvandar ** bikar tîneXFS** an heke ext4 kovara ku berê li ser nîşangirên inode hatî pêçandin, li dijî wêneya dîska xav xêzkirina îmze û avahî bikar bînin (docker_host_raw.img):
- ** Ji bo Daneyên SQLite3 (
.sqlite,.db- Mînak, Vaultwarden, Nextcloud, Alîkarê Malê, Gitea, Grafana)**: Her databasa SQLite3 bi sernavek ASCII ya 16-byte ya bêkêmasî li byte 0 ya rûpela xweya yekem a 4 kilobyte dest pê dike:53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00("SQLite format 3\0"), û mezinahiya rûpela databasa rastîn (Bytes 16..17, bi gelemperî4096) û mezinahiya databasa tevahî di rûpelan de (Bytes 28..31, jimareya 32-bit a mezin-endî) rast di hundurê heman sernivîsê de. - Run
PhotoRecbi[File Opt]->[x] sqliteçalak kirin, an dabeşkirinê rasterast pê bişopîningrep -ab "SQLite format 3"ji bo ku hûn pelê SQLite-ya xweya jêbirkirî guheztina baytê ya rastîn bibînin û jê derxindd:Carekê derxistin, birevin# 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.dbji nû ve avakirina her rûpela pelê B-dara saxlem.
Tip
** Meriv çawa rast hesab dike dd Mezinahiya byte ya pelek SQLite3 ya negirêdayî ji sernivîsa wê **: Carek grep -ab "SQLite format 3" guheztina byte ya destpêkê dide we OFFSET ji databasa SQLite ya jêbirin, bytes bixwînin 16..17 (uint16 Mezinahiya Rûpelê ya mezin-endî, mînak, 0x1000 = 4096 bytes) û bytes 28..31 (Uint32 Hejmara Rûpelên Mezin-Endiyan, mînak, 25000 rûpel) bi kar tînin hexdump -C -s OFFSET -n 32. Pirkirin Page Size x Page Count dirêjahiya byte ya tam a ku hûn jê re derbas bibin dide dd (iflag=skip_bytes,count_bytes) gava ku pel li ser dîskê hevgirtî ye.
- ** Ji bo MySQL / MariaDB InnoDB (
.ibdpelên tabloyê)**: Her InnoDB.ibdtablo ji rêzikan pêk tê16 KB(16,384byte) rûpelên ku tê de heneFIL_PAGE_INDEX(0x45BF) sernivîs û tabloya yektaspace_id. Percona / TwinDB bikar bîninundrop-for-innodb(stream_parser+c_parser) toolkit ji bo şopandinê/dev/nvme0n1p1ji bo hemûyan16 KBRûpelên InnoDB navnîş bikin û her rêzek rasterast di pelên TSV/SQL de ji bo ji nû ve îtxalkirinê davêjin. - ** Ji bo Pelên Heap PostgreSQL (
$PGDATA/base/<db_oid>/<relfilenode>)**: PostgreSQL her tabloyê wekî hevgirtî hilîne8 KB(8,192byte) rûpelên qelebalix ên tê de henePageHeaderData(pd_lower,pd_upper,pd_special). Bikaranînpg_filedumpanpglazarus/pduji bo ku herêmên dîskê yên nehatine veqetandin bigerin8 KBrûpelên ku bi sêwirana sêwirana stûnê ya tabloya we li hev dikin (HeapTupleHeaderData) û rêzan ji nû ve ava bikin.
Qonaxa 4: Kubernetes PVC, PV, û etcd Snapshot Recovery Awarte¶
Li Kubernetes (EKS, GKE, AKS, k3s, RKE2, kubeadm, OpenShift), bi şaşîtî jêbirina PersistentVolumeClaim (kubectl delete pvc(kubectl delete ns prod) mîmariyek pir cûda ji Docker-a serbixwe dişopîne.
Senaryo A: PVC nîşan dide Terminating (The Finalizer Lifesaver)¶
Run:
Ger kuSTATUS stûn dibêje Terminating, bêhna xwe veke: ** daneyên te hêj nehatine jêbirin **.
- Çima? Her Kubernetes PVC hatî afirandin Ji ber ku Kubernetes 1.9 bixweber tê de ye finalizers: [kubernetes.io/pvc-protection].
- Heya ku Pod hîn jî wê PVC-ê çêdike, kontrolkerê Kubernetes red dike ku jêbirina PVC temam bike û ** qet gazî ajokarê CSI nake. DeleteVolume RPC **.
- Çalakiya Yekser: NEK Pod-ê jêbikin an ji nû ve bidin destpêkirin, û NE dawînkarê paçe bikin. Tavilê hemî daneyan ji Pod-a xebitandinê li makîneya xweya herêmî an kelekek S3 kopî bikin:
# 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
Senaryoya B: PVC hat jêbirin, û kubectl get pv PersistentVolume tê de nîşan dide Released dewlet (ReclaimPolicy: Retain)¶
Run:
Ger Voluma weya Persistent (pv-prod-postgres) hê jî bi lîsteyê ye STATUS: Released (ji ber ku StorageClass wê bikar anî reclaimPolicy: Retain), ** ji sedî 100 ê daneyên we hîn jî li ser dîska bingehîn bêdestûr rûniştin **. Lêbelê, Kubernetes red dike ku destûr bide PVC-ya nû bi a Released PV ji ber ku PV hîn jî a spec.claimRef îşaret bi PVC-yên kevn ên jêbirin UID.
Çawa çêbikin a Released PV Available dîsa di 10 çirkeyan de bi windabûna daneya sifir:
1. Tişta PersistentVolume biguherînin û jêbirin spec.claimRef asteng:
kubectl get pv dîsa: statû yekser ji Released to Available.
3. Xwe ji nû ve ava bikin PersistentVolumeClaim (tê diyarkirin volumeName: <your-pv-name> û kapasîteya lihevhatî / hilanînêClassName). Ew ê bi hemî pelên saxlem re tavilê bi PV-ya heyî ve girêbide.
Senaryoya C: Vegerandina rewşek koma Kubernetes a paqijkirî ji an etcd wêneyek (etcdctl snapshot restore)¶
Çi eger kesek bezî kubectl delete namespace prod an helm uninstall û 200 manîfestoyên Kubernetes, Veşartî, ConfigMaps, û pênaseyên PV li ser xwe-rêveberî ji holê rakirin. kubeadm, k3s, an RKE2 balafira kontrolê?
- ** Herî dawîn xwe bibînin
etcdwêneyek** (ji hêla xwerû ve tê/var/lib/rancher/k3s/server/db/snapshots/,/var/lib/rancher/rke2/server/db/snapshots/, an plansaziya we/var/backups/etcd/snapshot.db). - ** Berî ku dest bi komika zindî bike yekitiya wêneyê verast bikin **:
- ** Raweste
kube-apiserverûetcdli ser girê(yên) balafira kontrolê**: - Li ser
kubeadm(pûtên statîk): Livîn/etc/kubernetes/manifests/kube-apiserver.yamlû/etc/kubernetes/manifests/etcd.yamldemkî ji bo/root/manifests_hold/sokubeletherdu konteyneran bi paqijî disekine, dûv re vedigere/var/lib/etcdto/var/lib/etcd.bak. - Li ser
k3s: Birevinsudo systemctl stop k3sûsudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshot. - ** Vegerînin
etcdpelrêça daneyan li serkubeadm**: - Move
etcd.yamlûkube-apiserver.yamlvegere nav/etc/kubernetes/manifests/. Di nav 30 çirkeyan de,kube-apiserverji nû ve bi vegerandin ve tê girêdanetcdhilanîn û her tiştê ku jêbirin Namespace, Secret, ConfigMap, û PersistentVolume ji nû ve xuya dike.
Qonaxa 5: Zehfkirina cildên Docker û Kubernetes li dijî jêbirina qezayî¶
Gava ku databasa hilberîna we were nûve kirin, van çar parêzvanên mîmarî bicîh bînin da ku yek tîpek CLI nikaribe careke din cildek zindî jê bibe:
- ** Her hilberîna Kubernetes biguherînin
StorageClassjireclaimPolicy: DeletetoreclaimPolicy: Retain**: Ji hêla xwerû, Klasên Storage cloud-ê yên çêkirî (gp2,gp3,standard-rwo) default toreclaimPolicy: Delete, tê wateya jêbirina PVC-ê dîska ewr hilweşîne. AfirandinStorageClassbireclaimPolicy: Retain(an jî PV-yên heyî pêve bikinkubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}') Ji ber vê yekê jêbirina PVC an Navê cîhê tu carî volga bloka bingehîn jê nake. - ** AWS EBS Recycle Bin / Bernameyên Snapshot GCP / Velero bi CSI Snapshots çalak bikin **: Çalakkirina AWS EBS Recycle Bin ji 7 heta 30 rojan her cildê EBS-ê jêbirin digire jî heke ajokarê CSI bang bike.
DeleteVolume. - Tu carî bikar neynin
docker system prune --volumesdi skrîptên paqijkirina otomatîkî de an jî rêvekerên CI/CD-ê: Ger konteynirek databasa hilberînê bi kurtî têk bibe (Exited (1)) tam di wê kêlîkê de karekî kron dimeşedocker system prune -a --volumes -f, Docker cildên xwe yên nenas "nebikaranîn" dihesibîne û wan bi domdarî jê dike. Strip--volumesji hemî nivîsarên paqijkirinê. - ** Mountên girêdana mêvandar ên eşkere bikar bînin (
/srv/prod_data/postgres:/var/lib/postgresql/data) an databasên birêvebir ên derveyî ji bo barkêşên hilberîna dewletî **: Berevajî/var/lib/docker/volumes/, mazûvaniya derhênerên bind-mount li derve/var/lib/docker/bi tu carî dest nedandocker compose down -v,docker volume rm, andocker system prune --volumes.
Hejmarên awarte yên herêmî û protokolên ajansê¶
Dema ku konteynerek an jêbirina hilanîna Kubernetes bandorê li operasyonên klînîkî yên nexweşxaneyê, şandina ewlehiya giştî, an daneyên kesane yên birêkûpêk dike, tavilê zêde dibin:
- ** Dewletên Yekbûyî û Kanada **: Dial
911heke têkçûna koma konteyneran çavdêriya klînîkî ya nexweş, pergalên EHR, an şandina acîl asteng bike. Paqijkirina binesaziya konteynera xerab an bûyerên sîber ji CISA re rapor bikin (1-844-Say-CISA/cisa.gov/report) an Navenda Kanadayî ya Ewlekariya Sîber (1-833-CYBER-88). - ** Keyaniya Yekbûyî **: Dial
999ji bo metirsiyên li ser jiyanê an binesaziya NHS ya krîtîk. Li gorî GDPR-ya Keyaniya Yekbûyî, hilweşandina daîmî an windabûna hebûna daneyên kesane bêyî paşvekêşana ku were vegerandin hewce dike ku 72-saetê agahdariyek binpêkirinê binirxîne ICO (0303 123 1113). - Yekîtiya Ewropî: Dial
112li hemî welatên endamên Yekîtiya Ewropî. Saziyên di bin Rêbernameya NIS2 de divê di nav 24 demjimêran de ji qutbûnek giran a karûbarê hişyariyek zû ji CSIRT-a xwe ya neteweyî re bişînin, û windabûna daneya kesane ya daîmî di nav 72 demjimêran de raporkirina GDPR-Benda 33 radigihîne. - Australya û Zelanda Nû: Dial
000li Avusturalya an111li Zelanda Nû; bûyerên binesaziyê yên krîtîk ji ACSC re rapor bikin (1300 CYBER1). - ** Hindistan û Asya-Pasîfîk **: Dial
112li Hindistanê ji bo bersiva acîl; bûyerên ewlekariya ewr an konteynerê ji CERT-In (incident@cert-in.org.in) di pencereya mecbûrî ya 6 saetan de.
Pirsên pir caran têne pirsîn¶
Dike docker compose down -v mountên girêdanê yên mêvandar jêbirin (./data:/var/lib/mysql) an tenê cildên Named û Anonîm Docker?¶
`docker compose down -v` TENÊ cildên bi navkirî yên ku di nav de hatine ragihandin jêbirin `volumes:` beşa `docker-compose.yml` û cildên Anonîm bi konteyniran ve hatine girêdan; ew qet pelên di hundurê mountek girêdana mêvandar de jêdibe (wek mînak `- /opt/mysql_data:/var/lib/mysql` an `- ./postgres_data:/var/lib/postgresql/data`). Ger pela berhevoka we rêyek mêvandar bikar anî ku bi dest pê dike `/` an `./`, wê peldanka li ser mêvandarê rastê kontrol bikin: pelên we hîn ji sedî 100 saxlem in.
Çima kir docker system prune --volumes Gava ku min tenê 2 hûrdeman konteynir rawestand da ku guhêrbarek jîngehê nûve bike, hêjmara databasa xwe jê bibe?¶
Bi baldarî li ferqa di navbera xwe de bisekinin `docker stop` û `docker rm`: heke konteynir bi tenê be `Stopped / Exited` (tê dîtin `docker ps -a`), `docker system prune --volumes` dike ne cildên wê jêbirin ji ber ku konteynera rawestandin hîn jî wan referans dike. Lêbelê, heke hûn bezîn `docker rm
Ma ez dikarim di hundurê Docker Desktop-ê de li ser Mac-ê cildek Docker-ê jêbirin vegerim (Apple Silicon / Intel) an Windows (WSL2)?¶
Erê, heke hûn tavilê dev ji Docker Desktop berdin da ku makîneya virtual raweste `fstrim` li dijî dîska virtual. Li ser macOS, Docker hemî cildên Linux di hundurê xwe de hilîne `-/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw`; li ser Windows WSL2, hundur `%LocalAppData%\Docker\wsl\disk\docker_data.vhdx`. Wê kopî bikin `.raw` an `.vhdx` pelê tavilê li SSD-ya derveyî, wê di Linux-ê de tenê-xwendewarî ve girêbide (bikaranîna `losetup -Pr` ji bo `.raw` an `qemu-nbd -r` ji bo `.vhdx`), û birevin `ext4magic` an `PhotoRec` dijî virtual `ext4` dabeşkirina hundir.
Heke min bi Kubernetes StatefulSet jêbirin kubectl delete statefulset postgres? Ma wê PVCyên min jî jêbirin?¶
No. Bi xwerû di Kubernetes de (heke `persistentVolumeClaimRetentionPolicy.whenDeleted: Delete` bi eşkereyî li ser Kubernetes 1.27+ hate mîheng kirin), dimeşîne `kubectl delete statefulset` kontrolker StatefulSet û Podên wê jê dike, hemû hiştin `PersistentVolumeClaims` (`data-postgres-0`, `data-postgres-1`) û daneyên wan ên bingehîn ji sedî 100 saxlem in. Tenê xwe ji nû ve bicîh bikin `StatefulSet` YAML bi heman navî û `volumeClaimTemplates`, û Podên nû dê bixweber bi ya heyî ve ji nû ve werin girêdan `data-postgres-0` PVCs.
Ez çawa xwe bigihînim pelên hundurê Docker overlay2 pelrêça dema ku konteynir dest pê nake (CrashLoopBackOff / Exited (1))?¶
Konteynirê têkçûyî jê nekin. Heya ku konteynera rawestandin hîn jî tê de heye `docker ps -a`, tebeqeya wê ya binivîsandî û çiqilên wê bi tevahî li ser dîskê saxlem in. Hûn dikarin pelan rasterast ji konteynera rawestandî bi kar bînin kopî bikin `docker cp
Ger kesek Kubernetes jêbirin çi dibe Namespace (kubectl delete ns prod) û hemî PVC hebûn reclaimPolicy: Delete li ser AWS EBS an GCP?¶
Ger ajokera CSI ya ewr (`ebs.csi.aws.com` an `pd.csi.storage.gke.io`) jixwe hatine bicihkirin `DeleteVolume` ji ber ku `reclaimPolicy` bû `Delete`, sê tevnên ewlehiyê yên asta ewr tavilê kontrol bikin: (1) **AWS Recycle Bin ji bo Volumên EBS** di konsolê AWS EC2 de kontrol bikin (heke qaîdeyek ragirtinê li ser hesab/etîketan çalak bû, volga EBS-a jêbirin li Recycle Bin rûniştiye û dikare bi 1 klîk ve were sererast kirin); (2) ** AWS Backup / DLM / GCP Snapshot Schedules ** ji bo wêneya herî dawî ya cildê ya otomatîkî kontrol bikin; û (3) kontrol bikin ka databasa we weşana WAL/binlogan bû (`WAL-G`, `pgBackRest`, `Litestream`) ji kelek S3/GCS re.
rêberên Related¶
- Dîska serverê 100% tije (0 bytes belaş): databasa têketina têketinê ya WAL, dara B ya xerabûyî, û vegerandina cîhê sifir
- Li Linux, macOS, an Windows-ê "rm -rf" an "Shift+Delete" ya tesadufî: ji nû ve rakirina yekser-tenê xwendinê û qutkirina inode
- Makîneya virtual VMDK, VHDX, û qcow2 zencîra wêneya berteng û rizgarkirina hîpervisor
- Kombûna Git-ya Tesadufî ya bişkokên AWS, pelê
.env, an mifteya SSH ya taybet ji bo depoya GitHub ya giştî - Krîza mêvandariya malperê, koçberî, û sererastkirina hilanînê
- Piştgiriya komputerê, stratejiya 3-2-1, û başkirina karesatê
- Hejmarên awarte li gorî welat
Çavkanî û rêbernameya fermî¶
- Belgekirina Fermî ya Kubernetes (
kubernetes.io/ Cloud Native Computing Weqfa): Tişta hilanînê di Parastinê de (kubernetes.io/pvc-protectionFinalizers), Vegerandina Volumên Persistent (Retainvs.Delete), û OperatingetcdKomên ji bo Kubernetes (etcdctl snapshot restore). - Docker Inc.
docs.docker.com): * Daneyên di Docker de bi rêve bibin: Volume, Bind Mounts,overlay2Storage Driver Architecture, and Prune Reference*. - Rêxistina Kernel Linux (
kernel.org): * The/procPergala Pelan (procfsBi navgîniya Vegerandina Danasîna Pelê vekin/proc/<pid>/fd/) û Specification Journal Ext4 *. ext4magicBelgekirina Projeyê (ext4magic.sourceforge.net): * Li ser Pergalên Pelê Ext3/Ext4 Vegerandina Danûstandina Inode û Rojnamegerî *.- Enstîtuya Neteweyî ya Standard û Teknolojiyê (
NIST) (Dewletên Yekbûyî): Weşana Taybet 800-190: Rêbernameya Ewlekariya Konteynirê ya Serlêdanê & Vegerandina Bûyerê.