1個前の記事で書いたSSDの速度回復スクリプトについて少しだけ説明したいとおもいます。
SteadyWorX SSDの速度回復。 で簡単な説明をしてくれてますが、私の方でも補足しておきます。
このスクリプトを使う際に設定するのは、スクリプト先頭部分の以下の部分となります。
ここで、作業対象のドライブ設定、書込むビット列などを定義しています。
#-------------- 初期設定 -------------- # 作業対象のドライブレターを指定 # 作業対象のSSDドライブを指定してください。 DRV = "C:" # 領域埋めに使うデータの指定 # SLCは \x00 MLCは \xFF らしいですが詳細は不明です。 # 変更しない方が良いかもしれません。 # 0 Fillする場合は \x00 # 1 Fillする場合は \xFF CODE = "\x00" # 書き込み単位(KBytes) # 通常は変更する必要はありません。 B_SIZE = 256
ここから先のコードがスクリプト本体となります。
ちょっとだけ説明を補足しておきます。
#-------------- 本体 --------------
require 'tempfile'
# ランダムな文字列を生成する関数
# デフォルトでは16文字の文字列を生成します。
def getRandomString (length = 16)
a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
key = Array.new(length){a[rand(a.size)]}.join
return key
end
# 作業ディレクトリ名の生成
# 既存ディレクトリと重複する可能性の低いランダム文字列を使用
# 作業ディレクトリは既存のディレクトリと重複しない専用のディレクトリが欲しいため
# ランダム文字列を使用してディレクトリ名を定義します。
temp_dir = DRV + "/" + getRandomString
# データブロックを生成
# 初期設定部分で定義したビット列を使用して B_SIZE Kbytesの
# データブロックを用意します。
block = CODE * (B_SIZE * 1024)
# ここからメイン処理なので例外を補足できるようにします。
begin
# 作業ディレクトリを作成
# ディレクトリが既に存在する場合は Errno::EEXIST が発生します。
Dir::mkdir(temp_dir)
# 作業用ファイルの作成
# tempfileライブラリを使って一時ファイルを作成します。
temp = Tempfile::new("tmp",temp_dir)
# 空き容量が尽きるまでファイルを追記していく
# 上の処理で作成した一時ファイルにデータブロックを追記します。
# 無限ループで追記するので空き容量が無くなるまで処理が行われます。
# 空き容量が無くなると例外が発生するので、無限ループから抜けます。
while 1
temp.write(block)
end
rescue Errno::EEXIST
# 作業ディレクトリと同じ名前のディレクトリが存在した場合は、ここに飛んできます。
# テンポラリ領域が存在した場合は作業中断
# エラーメッセージを表示してスクリプトを終了します。
puts("#{temp_dir} exists!")
exit()
rescue
# その他の例外が発生した場合はここに飛んできます。
# ディスクフル以外で例外が発生することは無いはず。
# 作業に使ったファイルとディレクトリを削除します。
temp.close(true)
Dir::rmdir(temp_dir)
end
こんな感じで、空き容量に対して0 Fill(または1 Fill)を行っています。
怪しいことは行ってないので危険性はほとんど無いのではないかと思います。