社内SE、ラズパイ4を買う。パート3（メインPCをWake On Lanしてバックアップ処理をする）

・前回

https://qiita.com/ra_risu/items/b2fe52fe759647a10f4e

・今回やりたいこと
①ラズパイからメインPC(Windows10)を定時起動する。
②メインPCでバックアップを動作させる。**（ただし、①の時点で電源が入っている場合は行わない）**
③メインPCをシャットダウンする。**（ただし、①の時点で電源が入っている場合は行わない）**

・背景
立派なバックアップ用HDD(16TB)を買ったのはいいが、
現実問題として帰宅時間もPCつけてる時間もバラバラなわけで
実際は全然バックアップできていないという課題がある。
かといって、毎日パソコンをつけっぱなしにしているとうるさいし光るしで寝れたもんじゃないし、
電気代も無駄になる。
よって、平日昼間にバックアップを自動で取りたい。
ただし、太字で強調している通り、平日昼間でもPCを起動している場合は勝手にシャットダウンされては困る。
例えば有休とか、お盆とか正月とかGWとかでゲーム三昧している時に勝手にシャットダウンされるとかなりストレスフルだろう。
だから、電源が入っているかどうかで動作を分岐させたいんですね。
出来るかな……？
まあ要は常時つけっぱなしのサーバーを定時バックアップ取るのとはちと話が違うわけだ。

・仮説
電源をつけるだけならWake On Lanで簡単そう
その後の流れは要はWindows側のファイルを実行できればpowerShellなりバッチなりでなんとかなりそう

・順番にやっていく

①ラズパイからwindows10PCを起動する。
Windows10PCのほうのMACアドレスはipconfig /allで確認しておく。

https://zenn.dev/murachi/articles/cf0be8cb206e15f631ac

よし、MACアドレスもメモったし、いったんWindowsPCを閉じてラズパイからWake On LANするぞ！
……あれ？
ラズパイに繋いだ画面が映らない！
昨日は映ってたのに！

調べるとHDMI接続していない状態でラズパイを起動するとHDMI出力が無効になることがわかった。なぜ？

https://raspida.com/rpi4b-config-hdmi

まあ、でも簡単に解決できそうで良かったな。要はConfigファイルをいじって強制的にHDMIモードにすればいいんだろ？
#を消して保存っと……
あれ？
「権限がありません？」
あーなるほどね、なるほど。
設定ファイルはうっかり弄ると危険だから管理者権限じゃないと編集できないってわけね。そういうパターンは知ってるぞ。
右クリックして「管理者権限で開く」
……
…………

ない……
まさかこれもsudoうんたらでCLI操作しないといけないの？

と思ったらGUIで操作する方法があって助かった。

https://kimama-na-tomo-no.blog.ss-blog.jp/2020-05-23

これでようやくPCを閉じてもラズパイ画面がモニターに出る。
満を持して！
[wakeonlan (MACアドレス)]
 **is not a hardware address and I could not resolve it as to an IP address.**
というエラーが出た。なんでだよおおおおおおお
あ、MACアドレスは:で区切らないといけないのね……
それでもだめ！
BIOSからWake On LANを有効にするの忘れてた！
有効にしてもダメ！
**高速スタートアップを無効にしてPCの電源切ったらラズパイまで落ちた！**
どうも高速スタートアップのために給電していた電気がなくなったためにラズパイが落ちたようだ。
BIOSの「USB POWER Delivery in Sort OFF state (S5)という項目を有効化したら給電が再開した。
デバイスマネージャから「Wake ON Magic Packet」も有効にした。
それでもやはりWake ON LANは実行できません。
大きなかぶが抜けないおじいさんの気分になってきた。

そもそも本当にWake On Lanの通信がWindowsPCに届いてるのか？
ということでWiresharkをインストールしてパケット確認。

https://pcvogel.sarakura.net/2021/12/13/33720

……うん、マジックパケット自体は届いてることが確認できた。
そうなるとやっぱり受ける側のPCの問題だな。
パケットが届いてるということは、
仮説：必要なパーツに電源が供給されていないから起動しない？
検証：WindowsPCをスリープ状態にしてラズパイ側でWakeOnLANコマンドを実行してみた。
結果：無事に起動した。

やっぱりどこかBIOSかソフト側の設定がおかしくて電源供給されていないんだ。
問題はそれがどこか片っ端から試すしかないことだけど。
いろいろ弄り回したあげく、
　BIOSの「PCIeデバイス電源オン」設定をオンにして、
　デバイスマネージャーでネットワークデバイスの「PMEをオンにする」を設定したら成功しました！

**ここまで3時間かかってます！**
Wake On Lanだけで3時間かかるなんて……聞いてねえよこんなこと……

②　①のプログラムを定時実行するように準備する。
③Wake ON Lanで電源を入れた時にはバックアップとシャットダウンは行わない。

ラズパイでプログラムを定時実行する方法は以下のリンク先の方法で行う。

http://make.bcde.jp/raspberry-pi/%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%9F%E6%99%82%E9%96%93%E3%81%AB%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B/

まずmain_backup.shファイルを作成して、そこに「wakeonlan (MACアドレス)」と入れて保存する。
あとはcrontab -eでcronの設定画面を開いて

![cron.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/566034d0-11ff-92a4-d9bc-5b8cfd9b0055.png)
30 8 * * 1-5 sudo sh /home/(ユーザー名)/main_backup.sh
っと……
これで多分平日8時30分にWaka On lanが起動するはず……

③については発想を逆転して、Wake On LanでPCを起動した場合はログインまでは行われないので、ログインしていない状態であればバックアップを取るようにタスクスケジューラで定時スケジュールする。

下記リンクを参考にログインユーザーを変数で取得して分岐する。

https://bonjiri-blog.com/powershell/get-osuser-variable/

WindowsPC側の設定
〇実行するPs1ファイル

if ($UserName = "（windowsユーザー名）")
    {}
else
{wbadmin start backup -backuptarget:"H:\" -include:"C:\,D:\,E:\" -vsscopy -allCritical -quiet
    shutdown /s /t 0}
※自分がログインしていたら何もせず、ログインしていなければwbadminでバックアップを実行した後にシャットダウン。
〇タスクスケジューラ側の設定
![メイン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/dea34349-be21-8a33-1f4b-dbabba3d75d1.png)
![実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/c04dc580-8e72-860c-9975-d6a65c6ab6dd.png)
![スケジュール.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/c411191d-99c4-2873-0fad-974b497e0c3c.png)

とりあえずここまで設定して終わり……疲れた……。
これで明日帰宅してバックアップ取れてるか確認ですね……（不安しかないけど）
（ここまで一日目、19時ごろから23時ごろまで4時間近くかけてます）

（帰宅）
パソコンの電源が落ちている。
ということは、
①バックアップに成功して、バックアップ処理の後PCをシャットダウンした
②そもそもラズパイからのWake ON LANに成功していない

結論から言うと、2でした。
バックアップ取れていないし、イベントビューワを見てもPCが起動していません。
手動でコマンド叩いた時はWake On LAN成功しているので、つまり自動実行、Crontabの設定をどこか間違えているということですね。

crontab -lで自分の登録したcrontabを確認してみる。
**no crontab for (ユーザー名)**

いやなんでやねん！
昨日確かに設定したの確かめてから寝たで！
えーっと、後はChmodとかいうコマンドで実行権限を与えないと実行できないのか。
それはしてなかったな。
chmod 777 /home/(ユーザー名)/main_backup.shっと……（使うの私だけだし、セキュリティに影響しそうなプログラムでもないから全権限付与でええか……）
保存場所がデフォルトで/tmp/crontab.xxRcXE/crontabになっており、
デフォルトなのでとうぜんそこがCrontabの保存先になっていると思っていたのだが、
実のところそうではないらしい。

正直この辺はよくわかっていないが、いろいろ保存先をいじっていたら保存できた。
crontab -lでもちゃんと保存されているのを確認したので、明日(土曜日）こそ確認する。
※確認のためにcronとタスクスケジューラを実行する曜日を一時的に平日＋土曜日にしている。(1-6)

これで明日の8時30分にWindowsPCが起動して、その後にパワーシェルのバックアップ処理が実行されれば完璧だ……！

（ここまでで二日目終了）
ダメでした……
PC起動しませんでした……

色々調べてみる。
手動でsudo sh (スクリプト名)したらやはり間違いなく動く。
参考になった記事は以下

http://creatornote.blog87.fc2.com/blog-entry-24.html

上記記事を見ながら
less /var/log/syslog | grep CRON
でログを出すと、そこにはCronが動作すべき時刻に
**No MTA installed, discarding output**　の文字が。
このエラーで検索すると以下の記事が出てきた。

https://qiita.com/ha_ru_ma_ki/items/44e1976ddf82533ba73d

デフォルト状態ではCronが上手く動作しないってことか。
記事の通りに sudo apt-get install postfix っと……

これでcronが動作した！
指定した時間にwakeonlanできるようになったので、後はwindowsPC側の処理を書いていく。

って、ps1ファイルが時間になっても作動しないんだが……？
と思って調べたら、タスクスケジューラでps1ファイルを直接指定したらダメで、
powershell.exeを実行してそれの引数としてps1ファイルを渡さないといけないらしい。

妥協してwindows側の機能「バックアップと復元（win7）」で妥協しようとも思ったのだが……
時間がかかりすぎる！
USB3.0使ってるのに2TBのバックアップに8時間近くかかる！
これじゃ使いづらいことこの上ない！（っていうか、帰ってくる前に終わるのか？）
ということで、Robocopyを使ってファイルをコピーする方針に変更。
(システムイメージは気が向いた時に取ればいいでしょ。最悪クリーンインストールできるし）

①平日8時30分にラズパイからCrontabでwake-on-lanしてWindowsPCを起動。
②平日8時40分にwindowsPC側でバックアップ処理のRobocopyを実行。
robocopy終了後、ログインしていない場合のみシャットダウン。
ついでに月・水・金と火・木で別のフォルダに保存するようにしてみた。
なんでそんなめんどくさい処理をしているのかというと、
バックアップしたいフォルダの最大容量を足したものが4TB、
保存先の外付けHDDの空き容量が約11TBだから。
実際にはフルで使い切ってるわけではないので曜日ごとにバックアップしても大丈夫だと思うが、
こういうのは将来的に容量が増えてもエラーを吐かないようにするのがITエンジニアの習性ですよね。
本当は曜日ごとにバックアップが取れると美しいのですが……

ps1ファイルのコード
**2023年10月1日修正　robocopy間違えてバックアップしたのを上書きしてたので修正しました**

IF (((Get-Date).DayOfWeek = 'Monday') -OR ((Get-Date).DayOfWeek = 'Wednesday') -OR ((Get-Date).DayOfWeek = 'Friday') )
    {\\$hozonsakiC = 'H:\backup_robocopy\first\C'
     \\$hozonsakiD = 'H:\backup_robocopy\first\D'
     $hozonsakiE = 'H:\backup_robocopy\first\E'}
ELSEIF (((Get-Date).DayOfWeek = 'Tuesday') -OR ((Get-Date).DayOfWeek = 'Thursday'))
    {\\$hozonsakiC = 'H:\backup_robocopy\second\C'
    \\$hozonsakiD = 'H:\backup_robocopy\second\D'
    $hozonsakiE = 'H:\backup_robocopy\second\E'}
else {}

robocopy C:\ \\$hozonsakiC /MIR /MT:23 /R:3 /W:3 /log:H:\backup_robocopy\logC.log /NP /XD "System Volume Information" /XD "\\$RECYCLE.BIN”
robocopy D:\ \\$hozonsakiD /MIR /MT:23 /R:3 /W:3 /log:H:\backup_robocopy\logD.log /NP /XD "System Volume Information" /XD "\\$RECYCLE.BIN”
robocopy E:\ \\$hozonsakiE /MIR /MT:23 /R:3 /W:3 /log:H:\backup_robocopy\logE.log /NP /XD "System Volume Information" /XD "\\$RECYCLE.BIN”
\\$UserName = $env:UserName
if (\\$UserName = "(普段使っているユーザー名)")
    {}
else
{shutdown /s /t 0}

robocopyの速度向上については下記リンクを参考にしました。

https://qiita.com/tk_aaa/items/fd8673c106ed00a3ba00

MIRオプションで丸ごとコピーして、Rオプションで3回再試行を設定しています。
MTオプションを設定しているのは、私のPCのCPUが24スレッドあるので指定してやれば早く終わるかなと思ってつけています。どうせバックアップ時にPCは使用していない前提なので。
そして最後にログインユーザーが普段ログインに使っているユーザー名でない場合シャットダウン。
これを8時40分に起動するように設定してやる。
今回はテスト用にタスクスケジューラから実行！

これで「平日毎朝8時半にPCを起動して、8時40分にバックアップを開始して、もし私がログインしていなければ時にシャットダウンする」環境の完成！
あとは運用して毎日バックアップが取れてるか様子見するだけ！
始めてラズパイ使って課題解決したけどめっちゃ疲れた！

・教訓
①Wake On LanはBIOS依存の部分が多いため、BIOS画面を隅から隅までチェックするべき。
②Wake On Lanを有効にする場合はデバイスマネージャから「Wake on Magic packet」と「PMEをオンにする」の両方を有効にしないといけない（なんで？）
③crontabが実行できているかどうかはログを見て判断することができる。
④システムイメージのバックアップまで取るとすごく時間がかかるので、せっかく12コア24スレッドのCPUを使っているのだしROBOCOPYでマルチスレッドでバックアップ取るのが安牌。

・次にラズパイでやってみたいこと
①CO2濃度の測定
〇一人っきりでエアコンかけて部屋を閉め切っていることが多いから。
〇先駆者がたくさんおり、ネットで調べても色々と記事が出てくるのでとっつきやすそう

②ゴミ出し日のライン通知
〇これも先駆者がたくさんいてとっつきやすそう
〇ライン通知のプログラムを作っておけば色んな事に応用が効きそう

**2023年10月1日追記**

よくよく考えてみればSSD→USB3.0→外付けHDDでバックアップするのだから、
メモリやCPUよりも外付けHDDの書き込み速度がボトルネックになるのは火を見るより明らかであった。
![hdd速度.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565403/02023b21-bd0c-1a63-6d29-667214d4b7bd.png)
やっぱり外付けSSDなのかなあ……外付けSSDの4TBって高いんだろうなあ……って思ってたら今使ってる外付けHDDと同じぐらいの値段（4万円切り）でひっくり返った。
でもまあバックアップはHDDのほうが安心ではありますね（SSDは通電してないとデータ突然死があるので）

**2023年10月10日追記**

あんまりにもバックアップが遅すぎるので(帰宅までに終わりそうにない）
Cドライブの中はUsersとProgram FilesとProgram Files(86)だけバックアップすることにした。
どうせWindows関係のフォルダはクリーンインストールした時にインストールされるだろうし……