月別アーカイブ: 2016年8月

すでにGPTパーティションが作成してあるディスクの空き領域にWindows10をUEFIインストールしようとするとエラー

症状

標題の通り、GPTパーティションテーブルで、先頭にNTFSパーテーションを作成してデータ用として利用中のディスクに、Windows10をUEFI起動でクリーンインストールしようとした。
インストールディスクから起動して、空き領域にパーティションを作成しようとすると、「選択されたディスクはGPTのパーティションの形式ではありません」とのエラーで実行できず、先に進めないという現象が発生した。

とりあえずエラー文をそのまま信じる(うまくいかなかった対応)

別ディスクのWindows7で起動し、コンピュータの管理で見てみると、「MBRディスクに変換」の選択肢がグレーで表示されることから、GPTディスクだと認識されていることが分かる。
念のためWindows版GPT fdiskで確認したところ、やはりGPTパーティションテーブルが存在していた。
いったんMBRディスクにしてからGPTディスクに戻してみてはどうかとも考えたが、Windows標準の機能でやる場合はディスク全体を初期化する必要がある。今回はすでに存在しているデータ用パーティションをそのまま残したい(本来はいったん他に待避させるべきだというのは分かっているが…)ため、都合が悪い。
それならということで、EaseUS Partition MasterでいったんMBRにした後再度GPTに戻しても条件は変わらなかった。
ネット検索をすると、このエラー文の場合はdiskpart cleanしてGPTパーティションテーブルを再構築、という情報が多数ヒットしたが、これもディスク全体が初期化されてしまうので都合が悪い。

エラー文を言葉通り信じない(うまくいった対応)

ところで、WindowsをUEFIインストールしようとして空き領域にパーティションを作成する際には、ESP(EFI System Partation)や、MSR、回復パーティションといったものも同時に作成される。
このとき、いつもディスク先頭からESPとMSRが作成されていたと記憶している。
もしかして、ESPとMSRを「ディスク先頭に」作成できない場合にエラーになるのではないか、との仮説を立てた。
再度EaseUS Partition Masterに登場してもらい、ディスクの先頭を2GBほど(1GB程でいいのではないかと思ったが余裕をもたせた)あける形ですでにあるパーティションを移動させる。
参考までに、1TBの領域で半分程度使用しているものを移動させるのに、15時間ほどかかった。このとき、データのバックアップをとらずに行ったが、よい子はマネしてはいけない。

この結果、無事にWindows10のインストーラでパーティションを作成することができ(パーティションの並び順が推奨しないものになっている、との警告が出たが、無視)、インストールが完了、現在のところ問題なく動作している。

自宅のホームサーバ(NAS)を更新する(5) バックアップの設定

Arch Linuxパソコンを利用して、ファイルサーバ兼DLNAメディアサーバを作成し、既存のNASを置きかえて運用を始めた。その続き。
データのバックアップが自動で行われるように構成していたのだが、その記事は実際にバックアップが機能しているのを確認してから作成しようと思っていたら、大幅に日があいてしまった。

要件

  • 指定したディレクトリ内のファイルを物理的に独立した別HDDにバックアップする。
  • バックアップは週に1回自動で実行される。
  • バックアップは世代管理が行われるが、差分バックアップなどの方法でディスク容量を節約する。

どうやら、rsyncコマンドをsystemdでタイマー実行する、という方法で実現できそうだ。

rsyncコマンド

基本の書式は

rsync [option] SOURCE DEST

optionは、基本的なファイル同期として期待するひととおりの内容が指定できる「-a –delete」と、ログが出力される「-v」と、バックアップ対象外のファイルを指定する「–exclude=’PatternOfNoBackupFiles’」、ハードリンクを使って容量を節約しながら世代管理ができる「–link-dest=/path/to/lastupdate」あたりを知っていれば便利に扱えそうだ。
まとめると、単純にフルバックアップするなら、

rsync -av --delete (--exclude='/path/to/nexclude/files') SOURCE DEST

世代管理を行うなら

rsync -av --delete (--exclude='/path/to/nexclude/files') --link-dest=/path/to/lastupdate SOURCE DEST

となる。

rsyncコマンドを発行するperlスクリプトを作成して管理することにした。
シェルスクリプトでも実現できる機能なのだろうが、perlの方が自分にとって扱いやすい。

#!/usr/bin/perl

my $BackupDest = "/path/to/backupdir";

my($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
my $newdate = sprintf("%04d_%02d_%02d_%02d_%02d_%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);

unless(-e "/path/to/lastbackup.txt"){
        open(DATA,">/path/to/lastbackup.txt");
        close(DATA);
}

open(DATA,"+</path/to/lastbackup.txt");
seek(DATA,0,0);
truncate(DATA,0);
print DATA $newdate;
close(DATA);

my $option;
if($lastdate){
        $option = "--link-dest=$BackupDest/$lastdate";
}

`rsync -av --delete $option /path/to/buckupdir1 $BackupDest/$newdate`;
`rsync -av --delete $option --exclude='PatternOfNoBackupFiles' /path/to/buckupdir2 $BackupDest/$newdate`;

systemdでタイマー実行

rsyncコマンドをおさめたスクリプトを実行させる.serviceファイルと、それをタイマーで実行する.timerファイルを作成して、

#systemctl enable [name]

すればよさそうだ。

/etc/systemd/system/[name].service

[Unit]
Description=Backup Data   

[Service]
Type=oneshot
ExecStart=/path/to/backupscript

/etc/systemd/system/[name].timer

[Unit]
Description=Backup Data

[Timer]
OnCalendar=Sat *-*-* 4:00:00
Persistent=false

[Install]
WantedBy=timers.target