Ich habe mehrere TB mit sehr wertvollen persönlichen Daten in einem Zpool, auf die ich aufgrund von Datenkorruption nicht zugreifen kann. Der Pool wurde ursprünglich im Jahr 2009 auf einem FreeBSD 7.2-System eingerichtet, das in einer virtuellen VMWare-Maschine auf einem Ubuntu 8.04-System ausgeführt wird. Die FreeBSD-VM ist noch verfügbar und läuft einwandfrei, nur das Host-Betriebssystem wurde auf Debian 6 geändert. Die Festplatten werden der Gast-VM über generische VMWare-SCSI-Geräte zugänglich gemacht (insgesamt 12).
Es gibt 2 Pools:
- zpool01: 2x 4x 500 GB
- zpool02: 1x 4x 160 GB
Das, was funktioniert, ist leer, das kaputte enthält alle wichtigen Daten:
[user@host~]$ uname -a
FreeBSD host.domain 7.2-RELEASE FreeBSD 7.2-RELEASE #0: \
Fri May 1 07:18:07 UTC 2009 \
root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
[user@host ~]$ dmesg | grep ZFS
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6
[user@host ~]$ sudo zpool status
pool: zpool01
state: UNAVAIL
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zpool01 UNAVAIL 0 0 0 insufficient replicas
raidz1 UNAVAIL 0 0 0 corrupted data
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
da7 ONLINE 0 0 0
da8 ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0
pool: zpool02
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zpool02 ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da9 ONLINE 0 0 0
da10 ONLINE 0 0 0
da11 ONLINE 0 0 0
da12 ONLINE 0 0 0
errors: No known data errors
Ich konnte vor ein paar Wochen auf den Pool zugreifen. Seitdem musste ich fast die gesamte Hardware des Host-Rechners austauschen und mehrere Host-Betriebssysteme installieren.
Mein Verdacht ist, dass eine dieser Betriebssysteminstallationen einen Bootloader (oder was auch immer) auf ein (das erste?) Der 500-GB-Laufwerke geschrieben und einige Zpool-Metadaten (oder was auch immer) zerstört hat - "oder was auch immer", was bedeutet, dass dies nur eine sehr vage Idee ist und dieses Thema ist nicht gerade meine starke Seite ...
Es gibt viele Websites, Blogs, Mailinglisten usw. über ZFS. Ich poste diese Frage hier in der Hoffnung, dass ich genug Informationen für einen vernünftigen, strukturierten, kontrollierten, informierten und sachkundigen Ansatz sammle, um meine Daten wiederzugewinnen - und hoffentlich jemand anderem da draußen in der gleichen Situation zu helfen.
Das erste Suchergebnis, wenn Sie nach 'zfs recover' googeln, ist das Kapitel zur ZFS-Fehlerbehebung und Datenwiederherstellung im Solaris ZFS-Administrationshandbuch. Im ersten ZFS Fehler - Möglichkeits- Abschnitt, heißt es in den ‚Verdorbene ZFS - Daten‘ Absatz:
Datenkorruption ist immer dauerhaft und erfordert besondere Berücksichtigung bei der Reparatur. Selbst wenn die zugrunde liegenden Geräte repariert oder ersetzt werden, gehen die ursprünglichen Daten für immer verloren.
Etwas entmutigend.
Das zweite Google-Suchergebnis ist jedoch das Weblog von Max Bruning, und darin habe ich gelesen
Vor kurzem wurde mir eine E-Mail von jemandem gesendet, der 15 Jahre lang Videos und Musik in einem 10-TB-ZFS-Pool gespeichert hatte, der nach einem Stromausfall defekt wurde. Er hatte leider kein Backup. Er benutzte ZFS Version 6 unter FreeBSD 7 [...] Nachdem ich etwa eine Woche lang die Daten auf der Festplatte untersucht hatte, konnte ich im Grunde alles wiederherstellen.
und
Ich bezweifle, dass ZFS Ihre Daten verliert. Ich vermute, dass Ihre Daten vorhanden sind, aber Sie müssen den richtigen Weg finden, um darauf zuzugreifen.
(Das klingt so viel eher wie etwas, das ich hören möchte ...)
Erster Schritt : Was genau ist das Problem?
Wie kann ich diagnostizieren, warum genau der Zpool als beschädigt gemeldet wird? Ich sehe, dass es ZDB gibt, die von Sun oder Oracle an keiner Stelle im Web offiziell dokumentiert zu sein scheint. Von seiner Manpage:
NAME
zdb - ZFS debugger
SYNOPSIS
zdb pool
DESCRIPTION
The zdb command is used by support engineers to diagnose failures and
gather statistics. Since the ZFS file system is always consistent on
disk and is self-repairing, zdb should only be run under the direction
by a support engineer.
If no arguments are specified, zdb, performs basic consistency checks
on the pool and associated datasets, and report any problems detected.
Any options supported by this command are internal to Sun and subject
to change at any time.
Außerdem hat Ben Rockwood einen ausführlichen Artikel gepostet und es gibt ein Video von Max Bruning, der auf der Open Solaris Developer Conference am 28. Juni 2008 in Prag darüber spricht.
Wenn Sie zdb als root auf dem kaputten zpool ausführen, erhalten Sie die folgende Ausgabe:
[user@host ~]$ sudo zdb zpool01
version=6
name='zpool01'
state=0
txg=83216
pool_guid=16471197341102820829
hostid=3885370542
hostname='host.domain'
vdev_tree
type='root'
id=0
guid=16471197341102820829
children[0]
type='raidz'
id=0
guid=48739167677596410
nparity=1
metaslab_array=14
metaslab_shift=34
ashift=9
asize=2000412475392
children[0]
type='disk'
id=0
guid=4795262086800816238
path='/dev/da5'
whole_disk=0
DTL=202
children[1]
type='disk'
id=1
guid=16218262712375173260
path='/dev/da6'
whole_disk=0
DTL=201
children[2]
type='disk'
id=2
guid=15597847700365748450
path='/dev/da7'
whole_disk=0
DTL=200
children[3]
type='disk'
id=3
guid=9839399967725049819
path='/dev/da8'
whole_disk=0
DTL=199
children[1]
type='raidz'
id=1
guid=8910308849729789724
nparity=1
metaslab_array=119
metaslab_shift=34
ashift=9
asize=2000412475392
children[0]
type='disk'
id=0
guid=5438331695267373463
path='/dev/da1'
whole_disk=0
DTL=198
children[1]
type='disk'
id=1
guid=2722163893739409369
path='/dev/da2'
whole_disk=0
DTL=197
children[2]
type='disk'
id=2
guid=11729319950433483953
path='/dev/da3'
whole_disk=0
DTL=196
children[3]
type='disk'
id=3
guid=7885201945644860203
path='/dev/da4'
whole_disk=0
DTL=195
zdb: can't open zpool01: Invalid argument
Ich nehme an, dass der Fehler "ungültiges Argument" am Ende auftritt, weil das zpool01 nicht wirklich existiert: Es tritt nicht auf dem funktionierenden zpool02 auf, aber es scheint auch keine weitere Ausgabe zu geben ...
OK, zu diesem Zeitpunkt ist es wahrscheinlich besser, dies zu posten, bevor der Artikel zu lang wird.
Vielleicht kann mir jemand einen Rat geben, wie ich von hier aus weitermachen kann. Während ich auf eine Antwort warte, schaue ich mir das Video an, gehe die Details der obigen ZDB-Ausgabe durch, lese den Artikel von Bens und versuche herauszufinden, was passiert Was...
20110806-1600 + 1000
Update 01:
Ich glaube, ich habe die Ursache gefunden: Max Bruning war so freundlich, sehr schnell auf eine E-Mail von mir zu antworten und nach der Ausgabe von zu fragen zdb -lll
. Auf jeder der 4 Festplatten in der "guten" raidz1-Hälfte des Pools ist die Ausgabe ähnlich wie oben. Doch auf die ersten 3 der 4 - Laufwerke in der ‚kaputt‘ Hälfte, zdb
Berichte failed to unpack label
für Etikett 2 und 3. Die vierte Laufwerk im Pool scheint OK, zdb
zeigt alle Etiketten.
Wenn Sie diese Fehlermeldung googeln, wird dieser Beitrag angezeigt . Von der ersten Antwort auf diesen Beitrag:
Bei ZFS sind das 4 identische Bezeichnungen auf jedem physischen vdev, in diesem Fall eine einzelne Festplatte. L0 / L1 am Anfang des vdev und L2 / L3 am Ende des vdev.
Alle 8 Laufwerke im Pool haben das gleiche Modell, Seagate Barracuda 500 GB . Ich erinnere mich jedoch, dass ich den Pool mit 4 Laufwerken gestartet habe, dann starb eines von ihnen und wurde im Rahmen der Garantie von Seagate ersetzt. Später habe ich weitere 4 Laufwerke hinzugefügt. Aus diesem Grund unterscheiden sich die Laufwerks- und Firmware-IDs:
[user@host ~]$ dmesg | egrep '^da.*?: <'
da0: <VMware, VMware Virtual S 1.0> Fixed Direct Access SCSI-2 device
da1: <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device
da2: <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device
da3: <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device
da4: <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device
da5: <ATA ST3500320AS SD15> Fixed Direct Access SCSI-5 device
da6: <ATA ST3500320AS SD15> Fixed Direct Access SCSI-5 device
da7: <ATA ST3500320AS SD15> Fixed Direct Access SCSI-5 device
da8: <ATA ST3500418AS CC35> Fixed Direct Access SCSI-5 device
da9: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device
da10: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device
da11: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device
da12: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device
Ich erinnere mich jedoch, dass alle Laufwerke die gleiche Größe hatten. Betrachtet man nun die Laufwerke, so zeigt sich, dass sich die Größe für drei von ihnen geändert hat, sie sind um 2 MB geschrumpft:
[user@host ~]$ dmesg | egrep '^da.*?: .*?MB '
da0: 10240MB (20971520 512 byte sectors: 255H 63S/T 1305C)
da1: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da2: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da3: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da4: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da5: 476938MB (976771055 512 byte sectors: 255H 63S/T 60801C) <--
da6: 476938MB (976771055 512 byte sectors: 255H 63S/T 60801C) <--
da7: 476938MB (976771055 512 byte sectors: 255H 63S/T 60801C) <--
da8: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da9: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da10: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da11: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da12: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
So wie es aussieht, war es nicht eine der Betriebssysteminstallationen, die 'einen Bootloader auf eines der Laufwerke geschrieben hat' (wie ich vorher angenommen hatte), sondern das neue Motherboard (ein ASUS P8P67 LE ), das einen 2 MB- Host erstellt hat geschützter Bereich am Ende von drei Laufwerken, die meine ZFS-Metadaten durcheinander gebracht haben.
Warum wurde nicht auf allen Laufwerken ein HPA erstellt? Ich glaube, das liegt daran, dass die HPA-Erstellung nur auf älteren Laufwerken mit einem Fehler durchgeführt wird, der später durch ein Seagate-Festplatten-BIOS-Update behoben wurde: Als dieser gesamte Vorfall vor einigen Wochen begann, habe ich SeaTools von Seagate ausgeführt , um zu überprüfen, ob es ihn gibt Irgendetwas ist physikalisch mit den Laufwerken nicht in Ordnung (immer noch auf der alten Hardware) und ich erhalte die Meldung, dass einige meiner Laufwerke ein BIOS-Update benötigen. Da ich jetzt versuche, die genauen Details dieser Meldung und den Link zum Firmware-Update-Download zu reproduzieren, scheinen beide SeaTools-DOS-Versionen, seit das Motherboard den HPA erstellt hat, die fraglichen Festplatten nicht zu erkennen - eine schnelle invalid partition
oder ähnliche blinkt, wenn sie anfangen, das wars. Ironischerweise finden sie jedoch eine Reihe von Samsung-Laufwerken.
(Ich habe auf die schmerzhaften, zeitaufwendigen und letztendlich vergeblichen Details des Herumschraubens einer FreeDOS-Shell auf einem nicht vernetzten System verzichtet.) Schließlich habe ich Windows 7 auf einem separaten Computer installiert, um SeaTools Windows auszuführen Version 1.2.0.5. Noch eine letzte Bemerkung zu DOS SeaTools: Versuchen Sie nicht, sie eigenständig zu booten. Nehmen Sie sich stattdessen ein paar Minuten Zeit und erstellen Sie einen bootfähigen USB-Stick mit der großartigen Ultimate Boot-CD. Abgesehen von DOS SeaTools erhalten Sie auch wirklich viele andere Nützliche Hilfsmittel.
Beim Start von SeaTools für Windows wird folgender Dialog angezeigt:
Die Links führen zum Serial Number Checker (der aus irgendeinem Grund durch ein Captcha - Mine "Invasive Users" geschützt ist) und einem Knowledge Base - Artikel über das Firmware - Update. Es gibt wahrscheinlich weitere Links speziell für das Festplattenmodell und einige Downloads und was nicht, aber ich werde diesen Pfad im Moment nicht befolgen:
Ich werde nicht gleich die Firmware von drei Laufwerken aktualisieren, die Partitionen abgeschnitten haben und Teil eines defekten Speicherpools sind. Das bittet um Ärger. Für den Anfang kann das Firmware-Update höchstwahrscheinlich nicht rückgängig gemacht werden - und das kann meine Chancen, meine Daten wiederzugewinnen, unwiderruflich ruinieren.
Daher werde ich als erstes ein Image der Laufwerke erstellen und mit den Kopien arbeiten, sodass Sie auf ein Original zurückgreifen können, wenn etwas schief geht. Dies kann eine zusätzliche Komplexität mit sich bringen, da ZFS wahrscheinlich feststellen wird, dass Laufwerke ausgetauscht wurden (anhand der Seriennummer des Laufwerks oder einer weiteren UUID oder was auch immer), obwohl es sich um bitgenaue dd-Kopien auf dasselbe Festplattenmodell handelt. Darüber hinaus ist der Zpool nicht einmal live. Junge, das könnte schwierig werden.
Die andere Möglichkeit wäre jedoch, mit den Originalen zu arbeiten und die gespiegelten Laufwerke als Backup zu behalten, aber dann werde ich wahrscheinlich auf die oben genannte Komplexität stoßen, wenn mit den Originalen etwas schief gelaufen ist. Naa, nicht gut.
Um die drei Festplatten auszuräumen, die als Ersatz für die drei Laufwerke mit dem fehlerhaften BIOS im defekten Pool dienen sollen, muss ich Speicherplatz für das Material schaffen, das jetzt dort vorhanden ist die Hardware-Box und stellen einen temporären Zpool aus einigen alten Laufwerken zusammen - mit dem ich auch testen kann, wie ZFS mit dem Auslagern von dd'd-Laufwerken umgeht.
Dies kann eine Weile dauern ...
20111213-1930 + 1100
Update 02:
Das hat in der Tat eine Weile gedauert. Ich habe Monate mit mehreren offenen Computergehäusen auf meinem Schreibtisch verbracht, in denen verschiedene Mengen an Festplattenstapeln heraushingen, und auch ein paar Nächte mit Ohrstöpseln geschlafen, weil ich die Maschine vor dem Zubettgehen nicht ausschalten konnte, da sie einige langwierige kritische Vorgänge durchführte . Ich habe mich aber endlich durchgesetzt! :-) Ich habe dabei auch viel gelernt und möchte dieses Wissen hier für jeden, der sich in einer ähnlichen Situation befindet, weitergeben.
Dieser Artikel ist bereits viel länger als jeder andere, bei dem ein ZFS-Dateiserver außer Betrieb ist. Daher werde ich hier auf Details eingehen und eine Antwort mit den wesentlichen Ergebnissen erstellen, die weiter unten aufgeführt sind.
Ich grub mich tief in die veraltete Hardware-Box, um genügend Speicherplatz zu schaffen, um das Zeug von den einzelnen 500-GB-Laufwerken zu entfernen, auf die die defekten Laufwerke gespiegelt wurden. Ich musste auch ein paar Festplatten aus ihren USB-Gehäusen herausreißen, damit ich sie direkt über SATA anschließen konnte. Es gab noch einige andere Probleme, die nichts damit zu tun hatten, und einige der alten Laufwerke fielen aus, als ich sie wieder in Betrieb nahm und einen Zpool-Austausch erforderte, aber ich werde darauf verzichten.
Tipp: Irgendwann waren insgesamt rund 30 Festplatten daran beteiligt. Bei so viel Hardware ist es eine enorme Hilfe, sie richtig zu stapeln. Kabel, die sich lösen oder die Festplatte, die vom Schreibtisch fällt, helfen dabei sicherlich nicht und können die Datenintegrität weiter beeinträchtigen.
Ich habe ein paar Minuten damit verbracht, ein paar Geräte aus Pappkarton zu entwickeln, die wirklich dazu beigetragen haben, die Dinge in Ordnung zu halten:
Ironischerweise stellte ich beim ersten Anschließen der alten Laufwerke fest, dass ein alter Zpool vorhanden ist, den ich zum Testen mit einer älteren Version einiger, aber nicht aller fehlenden personenbezogenen Daten erstellt haben musste, während der Datenverlust stattfand etwas reduziert bedeutete dies ein zusätzliches Hin- und Herschieben von Dateien.
Schließlich habe ich die problematischen Laufwerke auf Sicherungslaufwerke gespiegelt, diese für den Zpool verwendet und die ursprünglichen Laufwerke nicht angeschlossen. Die Backup-Laufwerke haben eine neuere Firmware. Zumindest SeaTools meldet keine erforderlichen Firmware-Updates. Ich habe die Spiegelung mit einem einfachen dd von einem Gerät zum anderen gemacht, z
sudo dd if=/dev/sda of=/dev/sde
Ich glaube, ZFS bemerkt die Hardware-Änderung (durch eine Festplatten-UUID oder was auch immer), scheint sich aber nicht darum zu kümmern.
Der zpool befand sich jedoch noch im selben Zustand, unzureichende Replikate / beschädigte Daten.
Wie in dem bereits erwähnten HPA-Wikipedia-Artikel erwähnt, wird das Vorhandensein eines Host-geschützten Bereichs beim Booten von Linux gemeldet und kann mithilfe von hdparm untersucht werden . Soweit ich weiß, gibt es unter FreeBSD kein HDParm-Tool, aber zu diesem Zeitpunkt hatte ich trotzdem FreeBSD 8.2 und Debian 6.0 als Dual-Boot-System installiert, also habe ich Linux gebootet:
user@host:~$ for i in {a..l}; do sudo hdparm -N /dev/sd$i; done
...
/dev/sdd:
max sectors = 976773168/976773168, HPA is disabled
/dev/sde:
max sectors = 976771055/976773168, HPA is enabled
/dev/sdf:
max sectors = 976771055/976773168, HPA is enabled
/dev/sdg:
max sectors = 976771055/976773168, HPA is enabled
/dev/sdh:
max sectors = 976773168/976773168, HPA is disabled
...
Das Problem war also offensichtlich, dass das neue Motherboard am Ende des Laufwerks einen HPA von ein paar Megabyte erstellt hat, der die oberen beiden ZFS-Labels „versteckte“, dh verhinderte, dass ZFS sie sehen konnte.
Sich mit der HPA zu beschäftigen, scheint eine gefährliche Angelegenheit zu sein. In der hdparm-Manpage lautet der Parameter -N:
Get/set max visible number of sectors, also known as the Host Protected Area setting.
...
To change the current max (VERY DANGEROUS, DATA LOSS IS EXTREMELY LIKELY), a new value
should be provided (in base10) immediately following the -N option.
This value is specified as a count of sectors, rather than the "max sector address"
of the drive. Drives have the concept of a temporary (volatile) setting which is lost on
the next hardware reset, as well as a more permanent (non-volatile) value which survives
resets and power cycles. By default, -N affects only the temporary (volatile) setting.
To change the permanent (non-volatile) value, prepend a leading p character immediately
before the first digit of the value. Drives are supposed to allow only a single permanent
change per session. A hardware reset (or power cycle) is required before another
permanent -N operation can succeed.
...
In meinem Fall wird die HPA folgendermaßen entfernt:
user@host:~$ sudo hdparm -Np976773168 /dev/sde
/dev/sde:
setting max visible sectors to 976773168 (permanent)
max sectors = 976773168/976773168, HPA is disabled
und auf die gleiche Weise für die anderen Laufwerke mit einem HPA. Wenn Sie das falsche Laufwerk erhalten oder etwas über den von Ihnen angegebenen Größenparameter nicht plausibel ist, ist hdparm klug genug, um Folgendes herauszufinden:
user@host:~$ sudo hdparm -Np976773168 /dev/sdx
/dev/sdx:
setting max visible sectors to 976773168 (permanent)
Use of -Nnnnnn is VERY DANGEROUS.
You have requested reducing the apparent size of the drive.
This is a BAD idea, and can easily destroy all of the drive's contents.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.
Danach habe ich die virtuelle FreeBSD 7.2-Maschine neu gestartet, auf der der Zpool ursprünglich erstellt worden war, und der Zpool-Status hat erneut einen funktionierenden Pool gemeldet. YAY! :-)
Ich habe den Pool auf dem virtuellen System exportiert und auf dem Host-FreeBSD-8.2-System erneut importiert.
Einige weitere wichtige Hardware-Upgrades, ein weiterer Motherboard-Swap, ein ZFS-Pool-Update auf ZFS 4/15, ein gründliches Scrubbing und jetzt besteht mein Zpool aus 8x1 TB plus 8x500 GB RAIDZ2-Teilen:
[user@host ~]$ sudo zpool status
pool: zpool
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zpool ONLINE 0 0 0
raidz2 ONLINE 0 0 0
ad0 ONLINE 0 0 0
ad1 ONLINE 0 0 0
ad2 ONLINE 0 0 0
ad3 ONLINE 0 0 0
ad8 ONLINE 0 0 0
ad10 ONLINE 0 0 0
ad14 ONLINE 0 0 0
ad16 ONLINE 0 0 0
raidz2 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
da7 ONLINE 0 0 0
errors: No known data errors
[user@host ~]$ df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/label/root 29G 13G 14G 49% /
devfs 1.0K 1.0K 0B 100% /dev
zpool 8.0T 3.6T 4.5T 44% /mnt/zpool
Als letztes Wort scheint es mir, dass ZFS-Pools sehr, sehr schwer zu töten sind. Die Jungs von Sun, die dieses System erstellt haben, haben allen Grund, es als das letzte Wort in Dateisystemen zu bezeichnen. Respekt!