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: