I have many hard drives circulating among my servers for testing purpose. For example, I took a hard drive from one server and put it on a different server. After doing this for many times, I’ve noticed that the ZFS has put many header information / meta data left on my hard drive. While it does not do anything harmful to the normal ZFS operation, I think it is not a good idea to have some outdated information living on my hard drive.
Here is an example:
#sudo zpool import pool: storage id: 4394681882400895515 state: UNAVAIL status: The pool was last accessed by another system. action: The pool cannot be imported due to damaged devices or data. see: http://www.sun.com/msg/ZFS-8000-EY config: storage UNAVAIL insufficient replicas raidz1-0 UNAVAIL insufficient replicas 12688516256739208392 UNAVAIL cannot open ada3 ONLINE 4218969245912188584 UNAVAIL cannot open 1537006695366032450 UNAVAIL cannot open 8194123525800888894 UNAVAIL cannot open 13778624724471040977 UNAVAIL cannot open pool: storage id: 12159013771499288095 state: FAULTED status: One or more devices contains corrupted data. action: The pool cannot be imported due to damaged devices or data. The pool may be active on another system, but can be imported using the '-f' flag. see: http://www.sun.com/msg/ZFS-8000-5E config: storage FAULTED corrupted data 6113585248511400089 UNAVAIL corrupted data
Although ZFS provides a way (zpool labelclear) to remove this information, it only works if the hard drive is still attached to the server. If the hard drive is missing, there is nothing you can do. For example, the following command will be failed:
#sudo zpool labelclear -f ada3
I googled for solutions and I found many idea. Unfortunately, none of them works.
Anyway, I came up a solution that is quick, easy and simple. Since ZFS stores the header information in the first and last sector of the hard drive, all I need to do is to wipe out the first and the last sector. That’s it.
How To Remove ZFS Meta Data – Linux
#replace /dev/sdXX with that actual ID of your hard drive dd if=/dev/zero of=/dev/sdXX bs=512 count=10 dd if=/dev/zero of=/dev/sdXX bs=512 seek=$(( $(blockdev --getsz /dev/sdXX) - 4096 )) count=1M
That’s it for Linux. Below is the FreeBSD version.
How To Remove ZFS Meta Data – FreeBSD
First, you will need to identify which hard drive you want to clean up. The easiest way is to use dmesg
#dmesg or #dmesg | grep ada | grep MB | grep -v 'MB/s' which will return something like this: ada0: 381554MB (781422768 512 byte sectors: 16H 63S/T 16383C) ada1: 1430799MB (2930277168 512 byte sectors: 16H 63S/T 16383C) ada2: 953869MB (1953525168 512 byte sectors: 16H 63S/T 16383C) ada3: 953869MB (1953525168 512 byte sectors: 16H 63S/T 16383C) ada4: 1430799MB (2930277168 512 byte sectors: 16H 63S/T 16383C)
Next, I need to know which one is the system hard drive, something I don’t want to touch.
#df /dev/ada0p2 362G 3.6G 329G 1% / devfs 1.0k 1.0k 0B 100% /dev
In this example, my goal is very clear. I need to wipe clear ada1, ada2, ada3 and ada4, and leave ada0 untouched.
Next, I need to clear the first sector:
#sudo dd if=/dev/zero of=/dev/ada1 count=1 bs=512k repeat this for the other hard drives
Next, I need to clear the last sector. You can use the sector information from dmesg (if available), or you can use the following command to find the location of the last sector:
#sudo diskinfo -c /dev/ada1 which will return something like the following: /dev/ada1 512 # sectorsize 1500301910016 # mediasize in bytes (1.4T) 2930277168 # mediasize in sectors 0 # stripesize 0 # stripeoffset 2907021 # Cylinders according to firmware. 16 # Heads according to firmware. 63 # Sectors according to firmware. S1Y6J1KS710613 # Disk ident. I/O command overhead: time to read 10MB block 0.091942 sec = 0.004 msec/sector time to read 20480 sectors 1.945038 sec = 0.095 msec/sector calculated command overhead = 0.090 msec/sector
In this example, the total number of sector is 2930277168 (mediasize in sectors).
To keep things simple, I am going to wipe out the hard drive from 2930270000 to the end (Replace the last four digits of the sector size to zero).
#sudo dd if=/dev/zero of=/dev/ada1 oseek=293027000
Now, repeat the same thing for each hard drive. Keep in mind that the sector size of each hard drive may not be the same. So it is better to run the command and get the sector information first.
After running these commands, the ZFS meta information should be removed. You can verify your work by doing this:
#sudo zfs import which should output nothing.
That’s it. Enjoy building a new ZFS!
–Derrick
Our sponsors:
Should it not be 2930270000 instead of 293027000 ? (one more 0)
“To keep things simple, I am going to wipe out the hard drive from 293027000 to the end (Replace the last four digits of the sector size to zero).”
Worked great! In Ubuntu I had to change:
sudo dd if=/dev/zero of=/dev/ada1 oseek=293027000
to
sudo dd if=/dev/zero of=/dev/sdb seek=7814030000
to wipe the zfs data from the tail end of my 4Tb drive but it worked like a charm (notice that I had to change “oseek” to just “seek,” as their is no oseek in Linux – as well as the drive and sector info).
Thanks!