Windowsでのディスクの仮想化はVHDXファイルを作ればできるのだが、これを外付けUSBハードディスクに入れておくとUSBのちょっとした不調(負荷がかかってリセットされてしばらくして再認識やスリープしてしまう等)があるとVHDXのマウントが外れてしまって不便。
あと、VHDXへのアクセスがないと外れてしまう気もするので、安定稼働させようすると何かしら一定期間で書き込み続ける必要も気がする。
なので、簡単なRubyスクリプトを書いた。
diskpartで自動再マウント。タスクスケジューラーに設定しておけば使える。
(2017.9.28 追記)
UTF-8だとdiskpartが非ASCIIなパスを認識しないのでCP932(SJIS)で。
auto_mount.rb
require 'tempfile'
target_aa = [['U:/', 'C:\mnt\test.vhdx']]
target_aa.each do |target_a|
unless FileTest.directory?(target_a[0])
puts "#{target_a[0]} - Disconnected."
arg_txt = <<"EOS"
select vdisk file="#{target_a[1]}"
attach vdisk
EOS
tf = Tempfile.new(['auto_mount', '.txt'])
begin
tf.write arg_txt
tf.close
winpath = tf.path.gsub(/\//, '\\')
p system('diskpart -s "' + winpath + '"')
ensure
tf.unlink
end
else
puts "#{target_a[0]} - Connected."
end
end
exit
一定間隔でファイルを書き込み続ける。実行して最小化しておく。
loop_writefile.rb
require 'date'
logfilename = 'datetime.log'
sleeptime = 30
a = ['U:/']
loop do
t = DateTime.now
puts t
a.each do |p|
begin
File.open(p + logfilename, 'w') do |f|
f.write(t.to_s)
f.fsync
end
File.open(p + logfilename, 'r') do |f|
if f.read != t.to_s
puts 'Read Error! - ' + p + logfilename
end
end
rescue Exception => e
p e
end
end
puts 'Completed!'
sleep sleeptime
end
exit