#! /usr/bin/ruby
# Will quit in case some corrupt blocks are found and will print which position (from the offset) was a corrupt block found.
# First arg -- the block device.
require "securerandom"
require 'digest'
# Block size -- no. of Bytes to write at a time. Script will consume this much memory.
Bs = 9*1024*1024
Multiplyer = 6
# Returns random data of size bs. multiplyer specifies over how much interval to repeat the random data. The data drawn from the random no. generator will be bs/multiplyer
def getRandom(multiplyer, bs)
randomDataUnit = (bs.to_f/multiplyer.to_f).ceil
randomData = SecureRandom.random_bytes(randomDataUnit)
randomData *= multiplyer
if randomData.bytesize > bs
randomData = randomData.byteslice(0, bs)
end
return randomData
end
# Open device
devwio = IO.new(IO.sysopen(ARGV[0], File::WRONLY|File::BINARY|File::SYNC))
devrio = IO.new(IO.sysopen(ARGV[0], File::RDONLY|File::BINARY|File::RSYNC))
devrio.sync = true
devwio.sync = true
# Calculate no. of blocks to write
devsize = `blockdev --getsize64 #{ARGV[0]}`.to_i
writeBlocks = (devsize.to_f/Bs.to_f).floor
# Write those blocks while testing
writeBlocks.times {
data = getRandom(Multiplyer, Bs)
devwio.write(data)
# TODO -- Move if to seperate function
if (Digest::SHA1.digest data) != (Digest::SHA1.digest devrio.read(Bs))
puts "\nData verification failed from #{devrio.pos-Bs} to #{devrio.pos}"
else
100.times {
print "\x8"
}
print "Progress -- #{devrio.pos/1024/1024}MB"
end
}
# Handel remaining blocks.
data = getRandom(1, devsize-(writeBlocks*Bs))
devwio.write(data)
# TODO -- Move if to seperate function
if (Digest::SHA1.digest data) != (Digest::SHA1.digest devrio.read)
puts "\nData verification failed from #{devrio.pos-Bs} to #{devrio.pos}"
else
100.times {
print "\x8"
}
print "Last #{devrio.pos/1024/1024}MB"
end
puts
devwio.close
devrio.close
My blog will mostly talk about Desktop Linux & it's administration, general philosophy and software politics.
Sunday, February 5, 2017
Block device tester
I made this script to test block devices. First argument is the block device to test.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment