Previous Topへ Next

Terminalを実用に使う/Using Terminal

Terminalを活用する


anchor

起動ディスクのアクセス権を修復するTerminalコマンド〜diskutilコマンドがいろいろ使えて便利

この項目とっくにどこかに書いたと思いこんでいたが、どこにも書いていなかったので今更ではあるけど改めて書く。

Disk Utilityでディスクの修復なんかをメンテナンスでよくやると思う。
システムがなんとなく調子悪くなった時に、長期間これをやっていないのであればこれでその不調が治ることがある。
またそうした不調を避けるために定期的にやっておくべきメンテナンスだと思う。
私の場合月一程度の頻度ではこれを実施している。

今操作しているMacのローカルドライブの場合はそれでいいのだが、サーバーなどにsshのみで接続している場合はどうするか?
画面共有、VNCなどでリモートをとってDisk Utilityで修復…という方法でももちろんいいのだが、サーバーの場合できるだけリモートをとったりGUIの操作をしたりを避けてOSへの負荷を減らしたい。

だからsshで接続しているわけだが、その場合はコマンドを使って同じことができる。
sudo diskutil repairPermissions /

このdiskutilコマンドには他にもいろいろ便利なオプションがある。
例えばボリュームマウント、エジェクトなどの機能。
外付けハードディスクのボリュームアンマウントができなくなった時にコマンドからも試すことができる。

MUTAという名称のUSBメモリ、USB外付けハードディスクなどをアンマウントするコマンド
diskutil unmount /Volumes/MUTA

MUTAというデバイスを探してボリュームをマウントするコマンド
diskutil mount MUTA

MUTAというデバイスをエジェクトするコマンド
diskutil eject MUTA

エジェクトとアンマウントの違いはアンマウントはボリュームへのアクセスを切ってデバイスを取り出す準備をした状態で、エジェクトはアンマウントとデバイス取り出し両方をやってしまうコマンドになる。
USB接続の場合、一度エジェクトでデバイスを削除するとmountコマンドでは再マウントできなくなる。

Mavericks以降Finderからのアンマウント、デバイス取り出しがいまいち不確実で、何度か「不正なボリューム取り出し」の警告を受けてヒヤリとしているのでアンマウント、エジェクトはコマンドでやるという習慣にするといいかもしれない。

これも今更なTipsだけど今まで書いたことがなかったので…





ディスクのアクセス権を修復するコマンド
起動ボリュームの修復はsudo diskutil repairPermissions /でEnter
パスワードを求められる




リムーバブルディスク、外付けハードディスク、USBメモリなどのボリュームをアンマウントするコマンド
MUTAという名称のボリュームならパス記述してdiskutil unmount /Volumes/MUTAでEnter
Fnderでやるより確実のような気がする




アンマウントしたボリュームを再びマウントしたい場合はmountコマンドを使う
デバイス名を直接記述してdiskutil mount MUTAでEnter
デバイスごと取り出したい場合はejectコマンドを使って取り出す
これもデバイス名で記述でdiskutil eject MUTAでEnter
エジェクトが成功するとmountコマンドは効かなくなるので
またマウントしたい時は一度メディアを抜いて接続しなおせばいい



2015年4月25日







anchor

Terminalの履歴をリセットする〜キャッシュを削除する、履歴を復元する〜.bash_historyを削除するhistryコマンドの使用法

Terminalの履歴キャッシュをリセットする方法を探していたら、こちらの記事を見つけた。
コマンド履歴の達人を目指してみる-ザリガニが見ていた...。

ザリガニさんの解説では起動中のTerminalのセッションの間のキャッシュだけを削除できるコマンドがこちら。
history -c

まさにこれを探していたので喜び勇んで実行したところ、キャッシュだけでなく過去の履歴が全部消えてしまった。
そのままTerminalを終了すると削除されたキャッシュで履歴ファイルを上書きしてしまうらしい。
そう書いてあるかw

Terminalの履歴の実体はユーザフォルダの最初の階層の中にある不可視ファイル
~/.bash_history
がその実体だから、これをTime Machineなどのバックアップから復元すれば元の履歴を復元できる。

上書きされても履歴が残るようにするには
history -n
のコマンドを2回実行すればいい。
なぜ2回なのかはよくわからないが、とにかく履歴を残して今のセッションのキャッシュだけを削除できる。





bashのTerminalはカーソルキーの上キーを叩くだけで過去のコマンドを呼び出せる
この機能がめちゃくちゃ便利なのだが最近困ったことがあった
最近ファイル転送でcpコマンドを使って200とか300とかいう数の
ファイルを一気にコピーするコマンドをよく使うようになった
履歴にこれが残ってしまうとそれより前のコマンドが正常に呼び出せない




このTerminalのコマンド履歴の実体はここにある
ユーザフォルダの最初の階層にある不可視ファイル、
.bash_historyに履歴はテキストスタイルで保存されている




これをテキストエディタで開いてこの300のファイルをアップロードするcpコマンドを削除すればいい
いいのだがもうちょっとスマートな方法はないのかなと思っていた
それで最近の履歴を削除するコマンドを探していた




サリガニさんのブログの記事を見て喜び勇んでhistory -cコマンドを試してみた
現在のセッションで実行したキャッシュだけが消えるということだ
ただしこのままTerminalを終了すると削除されたキャッシュで
履歴ファイルが上書きされてしまいすべての履歴が消えてしまう




.bash_historyファイルを見るとサイズが0バイトになって中は完全に真っ白になってしまった




.bash_historyをデスクトップかどこかにコピーしてこうなったら上書きすればいい
不可視ファイルだから普段は不可視ファイルが見えないデフォルト設定にしておけば邪魔にもならない
テキストエディタで編集するよりさらに簡単だがやっぱり泥臭い方法だなぁ…




history -n.bash_historyを再読み込みするということだったので試してみたが
最近のコマンドだけしか読み込まない




もう一回-nのオプションのコマンドを実行したら全部の履歴を読み込んだ
なんでこうなるのかよくわからないけどとりあえず動いた
すっきりと解決とは言えないかもしれないが
とりあえずコマンドだけで履歴のリセット・復元はできた



2015年6月22日







anchor

rsyncコマンドを使ってフォルダごと同期させてバックアップを作りたい…シェルコマンド標準のrsyncコマンドはやはりできる子(追記あり)

外付けバックディスクを集積してRAIDで大容量ボリュームを作ってここにiTunesライブラリをバックアップしている。
その詳細はこちらに書いた。
たくさん転がってるサイズが小さい外付けハードディスクを有効活用する〜ボリュームをひとつにまとめるRAID連結の活用法

それで前々から気になっていたことなのだが、そのバックアップボリュームにiTunesライブラリのコピーを取るのにCarbon Copy Clonerを使っていたのだが、これの定時バックアップの表示がそろそろうざくなっていた。
このアプリ自体は大変優れたアプリで、スケジュールを組めば定時で差分のバックアップも取ってくれるのでフォルダ同期で消えてしまったファイルも復元できる可能性がある。

Time Machineとリダンダンシーを組めば最強のバックアップになるだろう。

でも私のメイン機はMacBook Proなので、指定の時刻にRAIDボリュームを刺していないことも多い。
そうすると「ボリュームが見当たらないためにバックアップに失敗した」「バックアップを開始するか延期するか?」とか何回も聞いてきて、そこが丁寧なのだけど最近ちょっと煩わしくなってきた。

自動じゃなくて手動でバックアップを取るなら愛用のSyncTwoFoldersを使えばいい。

しかしiTunesライブラリともなると大容量だしファイル数も非常に多い。
ならば前から気になっていたrsyncコマンドを使ってみてはどうだろうとふと思い立った。

rsyncは最近20年ほどのUNIXには標準でインストールされているコマンドで、もちろんMacのBSDにも標準でインストールされている。

ただMacの場合少し手間をかけないと使えないという噂を聞いていたので、本チャンテストをする前に実用テストをしてみることにした。

rsyncコマンドの主要なオプションは以下の通り。

-a コピー元のディレクトリを再帰的にオーナー・グループ・パーミッション・タイムスタンプをそのままコピー -l シンボリックリンクをそのまま(ターゲットの指定を変えずに)コピーします。
-o オーナーをそのままコピーします。
-p パーミッションをそのままコピーします。
-r ディレクトリ内を再帰的にコピーします。
-t タイムスタンプをそのままコピーします。
-u コピー元とコピー先を比較し、追加・更新されたファイル・ディレクトリのみをコピーします。
-v コピーしているファイル名やバイト数などの情報を表示します。
-z 通信を圧縮します。
--delete コピー元にない(削除された)ファイルをコピー先で削除します。コピー元とコピー先を同期します。
(参考にしたページ:Linuxコマンド【 rsync 】高速なファイル同期(バックアップ) - Linux入門


このうち重要なのは、タイムスタンプ、グループ、パーミッションなどをすべて元の状態のままコピーしてくれる、他のオプションをほとんど内合したaオプションと、元のディレクトリで削除されているファイルを残さない--deleteオプションで、この二つを組み合わせることで二つのフォルダを完全同期させることができそうだ。

以前に紹介したcpコマンドを使わないのは、rsyncならすべてのファイル・フォルダを毎回上書きするのではなく差分のファイル、ディレクトリだけを上書き削除するので同期が高速だということ、sshに対応しているのでローカルだけでなくネットワーク内の別のリモートホストの共有ボリュームにも同期をかけることができるというメリットのためだ。
さらにシンボリックリンクを使って差分はハードリンクで表示する手製Time MachineTime Capsuleのようなこともできるので将来試してみたいとも思っている。

コマンドはこんな感じ

rsync -av --delete ソースのパス ターゲットのパス
例えばデスクトップのFolderAの中身を同じでストップのFolderBの中に同期したい時には以下のコマンドを打つ。

rsync -av --delete ~/Desktop/FolderA/ ~/Desktop/FolderB

この時にソースのパスの最後に必ず「/」を入れることを忘れないこと。
キャプチャでも説明しているが、このスラッシュを忘れるとFolderBの中に「FolderAのコピー」を作ってしまうことになる。

-aオプションは再帰的に同期ができるはずなのでそのテストも実施。
さらにあちこちで「Macのrsyncコマンドは日本語の扱いに問題がある」との情報を見かけたのでそのテストも実施。

結論からいうと大変良好な結果だったので、早速今晩からCCCを外してコマンドでバックアップする設定に変えようと思っている。





デスクトップにFolderAとFolderBというディレクトリを作って
FolderAの中にtest.txtというテストファイルを作っておく




このFolderAとFolderBというディレクトリを同期させるコマンド
rsync -av --delete ~/Desktop/FolderA ~/Desktop/FolderBを打ってみた




するとFolderBの中にFolderAができるという情けない結果になった
ソースのパスの最後にスラッシュを入れないとこのように
フォルダごとコピーという意味になってしまう




気を取り直してrsync -av --delete ~/Desktop/FolderA/ ~/Desktop/FolderB と打ってみた
-aオプションは元のままに再帰的にコピーすること、-vオプションはそのプロセスを表示すると
--deleteオプションはソースで削除されたファイルはターゲットでも削除するという意味




こうしてちゃんとターゲット内にファイルが作成され
ファイルの中身もちゃんと同じになっている




次に「再帰的に」というのを試すためにソースフォルダの中に
さらにフォルダを作ってその中のファイルもコピーされるかテストした
コマンドは通常カレントディレクトリ内でしか有効でないため
カレントディレクトリ内にあるフォルダの中も同じように(再帰的に)
コピーを実行するのがこのオプションの意味




同じコマンドを打った結果ちゃんとターゲットディレクトリにも
同じフォルダができてその中身もコピーされた




今度は--deleteオプションのテスト
ソースディレクトリで削除されているファイルがどうなるかを見てみると…




この通りターゲットでも削除された




-vオプションはコマンドを実行すると何をやったかをシェルに表示する
この場合ファイルリストを構築したあと、削除されたtest.txt、test2.txtをdeleteしたという記録が残っている
困ったことに.DS_Storeファイルまでコピーしているがこれは別途フィルタリングできるオプションがある
今日は省略するがいずれ後日解説する




ここまでは問題ないのは知っていたのだが問題はここからだ
日本語の扱いを確認するために日本語のファイル、中身も日本語のテキストを作成する




-vオプションで表示されたコピーファイルは
エスケープされた日本語ではなく文字コードで表示されている




これが文字化けしてうまくいかないのでは…という予想に反して
実際にはファイルも問題なくコピーされ中身もちゃんと日本語を保っている




そこで今度はUTF-Mac問題の元凶の「渡邊さん」の文字と
濁点を含んだファイル名と内容にしてみたがやはり問題なくコピー




そこで今度はフォルダ名称に「渡邊さん」と濁点を使用してファイル名も内容も同様にした




この通り文字コードをたくさん吐き出して文字化けしているように見えるのだが…




やっぱりちゃんとコピーした
評判ではMacのrsyncコマンドはバージョンが古いため日本語の扱いに問題があるという噂だったが
少なくともMacのローカルまたはリモートホスト間のコピーに関しては問題はなさそうだ




いっそソース・ターゲットのフォルダ名も日本語にしてしまうと
パスの記述も日本語になるがそれでもうまくいくのか試してみた




コマンドはrsync -av --delete ~/Desktop/フォルダ元/ ~/Desktop/フォルダ先のようなことになる




これも予想に反して問題なく同期した
OS Xのrsyncが改善されたということなのだろうか…
それともMacに日本語をしゃべらせるテストなど色々したせいで
私の環境だけこうなのか確認中だがどうもこれは関係なさそう
Macでもできるということらしい




となると実戦テストに移行する
iTunesライブラリの中にあるiTunesで作成したmp3、aiff、
mp4、movなどのうち日本語ファイル名のものを同期してみる




rsyncはとにかくコピーの速さに驚かされる
そしてもうプロセス表示は何が何だかわからない…




…のだがこの通りちゃんとファイルはコピーされ音楽ファイルは再生もできるだけでなく
この通りID3タグなどのメタデータもしっかり保持している
ウワサと違う理由はよくわからないがちゃんとできるということが判明した
rsyncコマンドの最大のメリットは何よりも同期が高速だということだから
これから大いに大容量フォルダの同期に活用したい



<追記>

リモートホストのサーバーにインターネット越しにフォルダ同期する実験にも成功した。
弊サイトは自宅サーバーを立てて
http://nmuta.dip.jp/
にもミラーリングしてバックアップにしているが、サイトを外で更新した時にこれにVPN経由で接続して更新するのが今までかなり困難だった。
もちろんVPNなのでファイル操作はできるのだが、出先ではほぼWiMAXからの接続になるので回線が低速なのは仕方がない。

サイトの更新を反映するためにSyncTwoFoldersを使うと下手すると更新完了に数時間かかる。
ところが今しがたrsyncコマンドを使ったところ、なんと10分で更新が完了してしまった。
さすがsshを使って圧縮した通信で差分同期するコマンドだけのことはある。

コマンドはまずVPN接続、相手先ボリュームをマウントしておいて以下のように打つ
rsync -avz --delete ~/Desktop/FolderA/ 相手先アカウント名@相手先ホスト名(またはIPアドレス):~/Desktop/FolderB

例えば相手先アカウント名がhiiragiでIPアドレスが10.0.1.2なら
rsync -avz --delete ~/Desktop/FolderA/ hiiragi@10.0.1.2:~/Desktop/FolderB
となる。

これで手元のデスクトップのFolderAと相手のデスクトップのFolderBをインターネット越しに同期できる。
オプションのzは通信を圧縮するという意味。
VPN自体が秘匿された通信で、その中でさらにsshで圧縮された通信を実行しているので安全で軽快な通信になる。





今回はWebサーバーの更新なのでパスは/Library/WebServer/Documentsとなる
相手のIPは10.0.1.205でルートマッピングしてあるのでコマンドは
rsync -avz --delete ~/Sites/ hiiragi2@10.0.1.205:/Library/WebServer/Documentsとなる
接続に成功したらsshのパスワードを要求される
タイムスタンプのセットはなぜかアクセス権がないと拒否されるがそれ以外は問題ない




出先からの更新が困難だった自鯖のミラーリングサイトも10分程度で更新できるようになった
rsync強力だ




更新に伴い差分だけを追加したり削除したりのプロセスも確認できた



2016年8月11日







anchor

Macの起動時の画面をデバッグ用に変える〜verboseモードを設定するコマンド・解除コマンド・ステータス表示コマンド

Macの起動時にはグレーのリンゴのマークが表示されて、ギヤアイコンがぐるぐる回る。

Macは昔からユーザにはバックグラウンドのコードの動きを悟らせず、視覚的な効果でプログレスを理解させるというUIの考え方がある。

しかしつとに知られていることだが、MacはOS Xから独自カーネルを捨ててBSD UNIXのカーネルに積み替えた。
BSDに限らずUNIXやLinuxなどのPOSIX互換のOSはみんな起動時にCUI画面で「今何をしているのか」をリアルタイムで表示するのが普通だ。
Macだけがリンゴのマークですべてを隠しているのはとても変わっているというべきだ。

MacもBSDがベースである以上、他のUNIXと同じようにCUIの起動画面を表示することができる。

何がいいかというと、起動時のトラブルシューティングの時に何が異常かがわかりやすい。
ギヤアイコンをぐるぐると回したまま止まられるよりも、CUIで何の読み込みに失敗したとかエラーを表示してくれる方がトラブルの原因に早く到達できる。

このCUI画面で起動するのをverboseモードというが、臨時的にverboseモードで起動したい時には
コマンド+Vキー
を押しながら起動すればいい。
文字画面が出たらキーを離して、あとは起動時のプロセスを見ることができる。

verboseモードが例えば何の役に立つのかはこんな時…
MavericksになってからOSの終了/再起動に失敗する問題に対応(できたかな?)〜はたしてdaemonのタイムアウト値を変更して改善するか!?<加筆あり>


それで慣れてくるとむしろMacデフォルトのリンゴマーク+ギヤアイコンぐるぐるを見ていると逆に不安になってくる。
それよりは今は何をやっているのか、ちゃんと読み込みは進んでいるのかを表示してくれた方が安心だ。
だからパーマネントにverboseモードに設定したい。
Deeperで設定することができることは以前にも書いたが、リモートだったりバージョンの問題でこれを入れることができない場合は、Terminalのコマンドでモードを有効にすることもできる。

verboseモードを有効にするコマンドは
sudo nvram boot-args="-v"

無効にするコマンドは
sudo nvram boot-args=""

またはNVRAMをリセットするためにPRAMクリアまたは
NVRAMクリアの手順を実施する。

モードが有効になったかどうかはこのコマンドで確認できる。
nvram -p





NVRAMのパラメーターを書き換えるnvramコマンドは
root権限が必要なのでsudoまたはsuでrootになって実行する
sudo nvram boot-args="-v"でEnterするとrootのパスワードを求められる




モードが有効になったかどうかはnvram -pで確認できる
最後の行にboot-argsのオプションに-vと表示されたら有効になっている
すると何もキーを押さなくても起動画面が口絵のようなCUI画面になる




この設定はDeeperのような専用アプリを使用しても変更できる
これが使用できない事情がある場合は上記コマンドが役に立つ




家中のMac、Macで立てているサーバーすべてverboseモードにしようとしたが
TigerのiBookG4、Mac miniG4ではDeeperがバージョン的に動かない
こういう時にこのコマンドはこの古いMacでも動く



2016年9月14日














Previous Topへ Next





site statistics
青木さやか