たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
業務でWindowsネイティブのアプリケーションに関わることになって、Visual Studio用のプロジェクトになってるリポジトリをcloneしてきてビルドしようとしたら、fatal error C1083: コンパイラの中間生成物 ファイルを開けません。(ファイルパス):No such file or directory
とエラーが出てビルドできなくて、ドハマリしてた。Windowsのエクスプローラで見ても確かにその位置にファイルはあるのに。何故?
他の人を巻き込んで調査に協力してもらって最終的に分かったことは、ファイルシステムがNTFSのパーティションでもパスの大文字小文字が区別される状態になっていることがあり、エラーメッセージに現れていたパス(すべて小文字)では実際のファイル(大文字小文字混在)にアクセスできなかったのが原因だということだった。パスの大文字小文字を区別しない状態に設定を修正したら、問題は解決した。
何故そんな状態が発生していたかというと、今使っている作業環境(Windows 10)に引っ越すにあたり、旧環境から必要なファイルをまとめて持ってくるために、WSL1上のrsyncを使ったのが原因だったようだ。Per-directory case sensitivity and WSL | Windows Command Lineという記事によると、This option controls which directories are treated as case sensitive, and whether new directories created with WSL will have the flag set.
((DevFsのcaseオプションは)ディレクトリー名の大文字小文字の区別を制御し、WSLで新たに作られたディレクトリーは大文字小文字を区別するフラグがセットされた状態となる)とあった。PowerShellで当該フォルダに cd
して fsutil.exe file queryCaseSensitiveInfo .
と実行してみると、確かに問題のcloneされたリポジトリのディレクトリーはパスの大文字小文字が区別される状態になっていた。
この状態は fsutil.exe
というコマンドを使って、fsutil.exe file setcasesensitiveinfo . disable
とすれば解除できるそうなのだけれど、残念ながらこの fsutil.exe
は再帰的な実行に対応していないため、問題を解決しようと思うと、cloneしたリポジトリ配下のファイルやディレクトリーすべてにこのコマンド列を実行しなくてはならない。それはあまりにかったるいしヒューマンエラーも起こりそうだったので、既存の質問に寄せられていた回答に倣って、PowerShellで以下のようなコマンド列を実行して再帰的にディレクトリーの設定を修正することにした。
(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ disable}
普段はファイル名に大文字小文字を混在させないようになるべく意識しているせいで、この状態が発生している事に気付いてなかった。メモ帳や秀丸エディタなどのWindowsアプリケーションでエラーメッセージに現れていたパスのファイルを開こうとして、確かにファイルはあるのにファイルが見つからないと言われる、という現象が調査の過程で発生して、それでやっと気が付いたんだった。自分で知らないうちに掘っていた落とし穴に、掘ったことにも気付かず自分でハマってしまった。
という学びを得た話をWSLアドベントカレンダー2020に書けばよかったんだけど、もうすべて埋まってたので、記録のためにここに放流しておく。
結論:Windowsをもう1回再起動してください。
Windows 10 1909からWindows 10 20H2に更新した後でWindows Terminalを起動しようとしたら、「指定されたユーザーには有効なプロファイルがありません」と言われて起動できなくなってしまった。Preview版の頃に入れてそのまま使っていたのがまずかったのか?と思って1回消してストアから入れ直してみたけど、症状は変わらなかった。
エラーメッセージで検索すると、どうもこれはストアアプリで共通して起こる問題らしく、他にはiTunesやSkypeやWordやExcelでも発生した事例があるようだった。ただ、検索上位に出てくる情報は役に立たない情報ばかり(何々というアプリが原因かもという的外れなリプライしか付いてなかったり、Wordのバージョンを書いて下さいというリプライに質問者が無反応で放置してたり)だった。
そんな中に1つ、Stack Overflowとかの情報を機械翻訳してる系のスパムサイトか?と思える文面のページがあって、そこには「更新後にもう一度再起動するで問題を解決できます」と書かれていた。更新の後に再起動かかった直後なのに、そんなので本当に効くのか? と、機械翻訳くささに半信半疑になりつつも実際試してみたら、これが当たりだった。本当に2回目の再起動で状況が改善して、Windows Terminalが起動できる状態に戻った。1回アンインストールしたので、設定が吹っ飛んでしまったけど……
(教えてもらって気が付きましたが、ページ内に小さくリンクがありました。元記事はHow to fix broken Windows user profile after latest Win10 pro upgrade? - Super Userだそうです。)
次にググる人が少しでも優位な情報に辿り着きやすいように、ここに記録を残しておく事にする。
会社で新しくWindows 10 PCをメイン環境として使い始めようとしていて、セットアップするのになんやかや詰まったので記録を残しておきます。
何も考えずにMicrosoftアカウントで使い始めると、例えば shimoda.hiroshi
みたいなMicrosoftアカウントだったら C:\Users\shimo
みたいな適当にぶった切られた名前でホームディレクトリができてしまう。C:\Users\piro
みたいに任意の名前のホームディレクトリにするためには、以下の手順を踏まないといけない。
C:\Users\shimo
とか)を管理者権限で削除する。コンピューター名はWindowsの通常使用だと意識する事はあまりなくて、LAN内で参照する時に使う程度だけど、WSLでホスト名として常時目にする事になる。これがランダムっぽい名前だと結構いらつくので、最初に変えておく。(以後はWSLでも勝手にこの情報を参照してくれる)
WSLを有効化してストアからUbuntuをインストールした後にやること。
Windowsのファイルシステム上でWSLのファイルのパーミッションを保存できるようにするために、 sudo vim /etc/wsl.conf
で設定ファイルを開いて以下の内容を保存する。
[automount]
options = "metadata,umask=22,fmask=111"
マウントした既存のファイルや新たに作成したファイルが全部実行権限付きで認識されるとGitを使うのに不便なので、maskを指定して実行権限がつかないようにしておく。
LxssManager
を探し、再起動する。これで、上記の設定が反映される。ln -s /mnt/c/Users/username/Destop ~/Desktop
、ln -s /mnt/c/Users/username/Documents ~/Documents
、ln -s /mnt/c/Users/username/Downloads ~/Downloads
、ln -s /mnt/c/Users/Public ~/Public
などとして、WSLでよく使うWindowsのフォルダにシンボリックリンクを作っておく。シェルでよく使う基本の設定をする。
~/.bashrc
に以下の内容を加えて、コマンド履歴の逆方向検索に Ctrl-S を使えるようにする。
stty stop undef
stty start undef
~/.bashrc
に以下の内容を加えて、複数のシェルでコマンド履歴を共有するようにする。
function share_history {
history -a
tac ~/.bash_history | awk '!a[$0]++' | tac > ~/.bash_history.tmp
[ -f ~/.bash_history.tmp ] && mv ~/.bash_history{.tmp,} && history -c && history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=99999
~/.bashrc
に以下の内容を加えて、よく使うエイリアスを使えるようにする。
export LESS='--no-init --RAW-CONTROL-CHARS --LONG-PROMPT --shift 4'
alias grep!='grep --color=always'
alias jq!='jq --color-output'
alias cd='pushd > /dev/null'
SSHの秘密鍵を設置して、他のホストにSSHで接続できるようにする。 基本方針として、WSLのsshクライアントから直接秘密鍵を触らずに、Windows 10に最初から入ってるOpenSSHのssh-agentに鍵を読み込ませて、必ずrupor-github/wsl-ssh-agent経由で利用することにする。
C:\Program Files (x86)\wsl-ssh-agent\
あたりに置く。wsl-ssh-agent-gui.exe
へのショートカットを C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
(全ユーザー向けの場合)か、%AppData%\Microsoft\Windows\Start Menu\Programs\Startup
(自分のみの場合。Win-Rで shell:startup
を実行して開かれるスタートアップフォルダ)に作る。-socket "%temp%\ssh-agent.sock"
と起動オプションを付け足す。これで、毎回起動時にssh-agentのためのソケットが作られるようになる。wsl-ssh-agent-gui.exe
が起動していないので、ショートカットをダブルクリックして起動する。~/.bashrc
に export SSH_AUTH_SOCK=/mnt/c/Users/$USER/AppData/Local/Temp/ssh-agent.sock
という行を足す。これで、WSLの環境に入ると自動的にWindows側のssh-agentと繋がるようになる。source ~/.bashrc
を実行して設定を反映する。~/.ssh
(秘密鍵、公開鍵、設定ファイル)を持ってくる。chmod 700 ~/.ssh
で、ディレクトリのパーミッションを他のユーザーから参照不可能なようにする。ssh-add ~/.ssh/(秘密鍵)
を実行し、秘密鍵を ssh-agent に読み込ませる。(以下は、Windows 10のOpenSSHを使うようになるまで使ってた、PuTTYのPageantに鍵を読み込ませて、必ずweasel-pageant経由で利用する場合の手順。歴史的資料として残す。
C:\Users\username\.ssh
(/mnt/c/Users/username/.ssh
)を作成し、旧環境からファイルをコピーする。puttygen.exe
で秘密鍵のid_rsa
をインポートして、PuTTY形式の秘密鍵 id_rsa.ppk
として保存する。shell:startup
を実行してスタートアップフォルダを開き、pageant.exe
のショートカットを作成する。pageant.exe
を起動して、先の id_rsa.ppk
を読み込ませる。C:\Program Files (x86)\wsl-pageant
に置く。chmod +x /mnt/c/Program\ Files\ \(x86\)/weasel-pageant/weasel-pageant /mnt/c/Program\ Files\ \(x86\)/weasel-pageant/helper.exe
で明示的に実行権限を設定する。echo 'eval $(/mnt/c/Program\ Files\ \(x86\)/weasel-pageant/weasel-pageant -r)' >> ~/.bashrc
で、weasel-pageantを自動起動するようにする。(weasel-pageantにどのようなオプションを設定するべきかについては、必ず最新の解説を参照すること。)mkdir ~/.ssh; chmod 700 ~/.ssh
で、設定ファイル等の置き場所を用意する。
ln -s /mnt/c/Users/username/.ssh ~/.ssh
でシンボリックリンクとして作成してしまうと、次項の設定をしてもSSH接続を受け付けられなくなってしまう(~/.ssh
のパーミッションを適切に設定できなくなる)ので、必ずここは普通のディレクトリとして作成しておく。)
openssh-server
が最初から入っているので、後は必要な設定をするだけで使える。
/mnt/c/Users/username/.ssh/
以下に公開鍵等もコピーできているはずなので、/mnt/c/Users/username/.ssh/authorized_keys
があるのであれば ~/.ssh/authorized_keys
にコピーする。なければ、/mnt/c/Users/username/.ssh/id_rsa.pub
を ~/.ssh/authorized_keys
にコピーする。chmod 600 ~/.ssh/authorized_keys
として、パーミッションを適切に設定する。sudo service ssh start
してsshdを起動する。ssh localhost
でログインできることを確認する。sudo service ssh stop
してsshdを停止する。(以後は、必要な時にだけ起動する)mkdir -p ~/local/bin
で、ユーザー固有のバイナリ置き場を用意する。echo 'export PATH="~/local/bin:$PATH"' >> ~/.bashrc
してパスを通しておく。peco_linux_amd64.tar.gz
を使った)。unar peco_linux_amd64.tar.gz
でファイルを展開する。peco
を ~/local/bin/
に移動し、chmod +x ~/local/bin/peck
で実行権限を設定する。echo 'source ~/peco-commands.sh' >> ~/.bashrc
で自動的に読み込むように設定する。bash-git-promptを使うようにする。
cd ~/
して git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1
で必要なファイルをローカルに用意する。以下の内容を ~/.bashrc
に追加して、機能を有効化する。
GIT_PROMPT_ONLY_IN_REPO=1
source ~/.bash-git-prompt/gitprompt.sh
GIT_PROMPT_THEME=Single_line_Ubuntu
時刻表示の部分が余計なので、以下のように編集する。
diff --git a/themes/Single_line_Ubuntu.bgptheme b/themes/Single_line_Ubuntu.bgptheme
index 7dd3a4f..542b259 100644
--- a/themes/Single_line_Ubuntu.bgptheme
+++ b/themes/Single_line_Ubuntu.bgptheme
@@ -15,7 +15,7 @@ override_git_prompt_colors() {
GIT_PROMPT_COMMAND_OK="${Green}✔ "
GIT_PROMPT_COMMAND_FAIL="${Red}✘ "
- GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${White}${Time12a}${ResetColor} ${Cyan}${PathShort}${ResetColor}"
- GIT_PROMPT_END_USER="${ResetColor} $ "
- GIT_PROMPT_END_ROOT="${BoldRed} # "
+ GIT_PROMPT_START_USER="${Cyan}${PathShort}${ResetColor}"
+ GIT_PROMPT_END_USER="${ResetColor}\$ "
+ GIT_PROMPT_END_ROOT="${BoldRed}# "
sudo update-alternatives --config editor
でデフォルトのエディタをvim.basic
に切り替えておく。ここまででWSL上のrsyncが使えるようになっているので、旧環境から rsync -a xxx.xxx.xxx.xxx:~/path/to/directory/ ~/Public/
みたいにしてパーミッションの情報込みでファイルを持ってこれる。
(シンボリックリンクまで勝手に辿らせると大変なことになりかねないので、シンボリックリンクの先は個別に辿るのがよい気がする。)
今回は移行元がハードウェア上にインストールされたUbuntuだったけれども、移行元がWindows 10マシンの場合も上記の要領であらかじめsshdを起動しておけば、同様にrsyncでファイルを持ってこれる。
最近のMozillaBuildとmozilla-centralはよくできてて、だいたい一発で環境ができあがる。以下、前半は会社のブログに書いた手順の通り。
c:\mozilla-build
にインストールする。C:\mozilla-source
の位置にフォルダを作る。Firefoxのソースコード一式はこの配下に置く事になる。c:\mozilla-build\start-shell.bat
を実行して、MozillaBuildのシェル(Bash)を起動する。echo 'export PATH=$PATH:~/.cargo/bin' >> ~/.bash_profile
を実行して、MozillaBuildのシェルを一旦終了し、c:\mozilla-build\start-shell.bat
で起動し直す。cd /c/mozilla-source
して、 hg clone https://hg.mozilla.org/mozilla-central
でmozilla-centralをcloneする。cd mozilla-central
してリポジトリに入り、./mach bootstrap
を実行する。これにより、Visual StudioやRustなどのビルドに必要なソフトウェア群が自動インストールされる。./mach build
して、ビルドできる事を確認する。./mach run
して、ビルドしたFirefoxを起動できる事を確認する。WSLとホームを共用してない関係でBashの設定が素のままなので、~/.bash_profile
に以下を追記する。
# Ctrl-Sで履歴を逆検索できるようにする
stty stop undef
stty start undef
# MozillaBuildの環境にはtacが無いので、関数で代用する
function tac {
exec sed '1!G;h;$!d' ${@+"$@"}
}
# 複数のシェルで履歴を共有する
function share_history {
history -a
tac ~/.bash_history | awk '!a[$0]++' | tac > ~/.bash_history.tmp
[ -f ~/.bash_history.tmp ] && mv ~/.bash_history{.tmp,} && history -c && history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=99999
Mozillaのサーバーに認証を求める時のユーザー名指定を省略できるようにするために、~/.ssh/config
に以下を追記する。
Host hg.mozilla.org
User yuki@clear-code.com
ssh hg.mozilla.org
してみて、認証できるかを確認する。(シェルには入れないでそのまま接続が切れるが、それでOK。)
tryserverを使うために、~/.hgrc
に以下を追記する。
[paths]
try = ssh://hg.mozilla.org/try
./mach try empty
で空のリクエストを送れるかどうか確認する。
hg grepfile
でワーキングコピーのファイルを対象に検索できるようにするために、hg-grepfileをインストールする。最近までWindows 10標準で仮想デスクトップ機能があるということを把握してませんでした。今回調べて初めて知りました。
Ubuntuではメインの作業画面とThunderbirdを使う(メールを読み書きする)画面とを分けていて、画面の端にカーソルでちょいっと触れると仮想デスクトップ切り替えの画面が出てくるようになってたんだけど、そういう事をできるようにするにはユーティリティが必要。タスクビューの切り替え画面を出すこと自体は、Windowsキー+Tabでできるので、任意のジェスチャでこのキー操作を代替すればよい。
マウスジェスチャーソフトの「MouseGestureL.ahk」でマウスホイールにWindows10の「タスクビュー」を割り当てる | PC ウェブログという記事を参考に、以下のようにした。
C:\Program Files
配下あたりに適当に置く。Setup.vbs
を実行する。screen-edge
CRB_
(画面右下角に接触)CLB_
(画面左下角に接触)screen-edge
以外すべて削除する。screen-edge
のアクションスクリプトを以下の通りに書く。
;キー操作を発生させる
Send, #{TAB down}{TAB up}
「その他」タブに切り替えて、「スタートアップに登録」で自動起動するようにする。
これで、画面の端に触れるだけで仮想デスクトップを切り替えられるようになる。
2020年5月1日追記。初期設定ではRB
(右ボタン)で始まるジェスチャがいくつか定義されてるんだけど、これがあると、Windows全体で右ボタンの動作に影響が及んでしまう。具体的には、window.addEventListener('mousedown', ...)
みたいな方法でマウスのボタンが押し下げられたことを検知しようとしても、右ボタンだけmousedownが取れなくなる(ボタンを放したときに初めてmousedownが発火するようになる)。自分はscreen-edge
をトリガーにした操作しか使わないので、RB
で始まるジェスチャは全部削除した。
Ubuntuではテキストを選択すると通常のクリップボードとは別の専用のバッファにテキストが格納されてミドルクリックで貼り付けるという動作になってた(これ自体はXの機能とのこと)んだけど、GNOME Terminal(端末)でコピー&ペーストのキーバインドが他のGUIアプリと違っていたこともあって自分でも驚くくらいに意外と多用していて、Windows環境でWSLを使っているとそのときの感覚が抜けなくてつい戸惑ってしまう。
代わりになりそうなものを探してみたらいくつか情報が見つかったんだけど、どれも今使うにはちょっと厳しい感じだった。
もうちょっと悪あがきしてみようと思って「Windows selection auto copy」という感じのキーワードで検索してみたら、AutoHotKey用のスクリプトの例が出てきた。自分は結局AutoHotKeyは入れずにMouseGestureL.ahkだけで使ってるんだけど、これの実態がほぼ同じ物のようで、MouseGestureL.ahkのインストール先にあるMG_User.ahk
のユーザー定義サブルーチンの所に以下のスクリプトを追加してMouseGestureL.ahkを再起動したら普通に使えた。
ただ、Ubuntuの時と違って専用のバッファが使われる訳ではないから、選択→Ctrl-Cでコピー→貼り付けたい箇所にある邪魔なテキストを選択→Ctrl-V という事をしようとすると、貼り付け先の邪魔なテキストの方がクリップボードに入ってしまうという難点があった。なので解説を見ながら試行錯誤して、クリップボードとは別のバッファを持つようなスクリプトを作ってみた。MouseGestureL.ahk単体版ではなくAutoHotKeyの方を使う場合は、上記の内容をSelectionClipboard.ahk
という名前で保存し、ファイル名を指定して実行→shell:startup
で開かれるスタートアップフォルダの中に置けばいいみたい。
で、しばらく試してみてたんだけど、以下の問題をどうしても解決できなかった。
Ctrl-Cでクリップボードへのコピーを試行するのが元凶なので、それ無しで選択範囲のテキストを取得できる方法があればいいんだけど、それはエディットコントロールに対してのみ動作する関数しか用意されてなくて、オフィシャルのサンプルの時点で「標準のエディットコントロール以外でも使えるのはCtrl-Cを使う方法だ」と紹介されてるレベルだったので、AutoHotKeyの制限事項としてどうにもならないというのが結論のようです。残念。
これ機能として欲しくなることが無くてまず誤爆で困るばかりなんですけど?
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
にDisallowShaking
というDWORDの値を作ってデータを1
にすると、この機能が無効化されるそうです。
そんなに頻繁にやるわけじゃなくて、数年に1回やる程度なので、
という風に思ってます。
毎月やるとか、まとめて10台くらいやるとか、そういう前提が出てきたら重い腰を上げてPowerShell覚えるかもしれないですね。
まだ後から書き足しそう。
今やHDDより頑丈な「SSDの寿命」と耐久性の凄さ | ちもろぐを読んで「TBW」という指標の存在を初めて知り、自分が今使っている機材の寿命を知りたくなったので計算してみた。
現行機材にはSSDが2つマウントされてる。1つはシステムとデータが両方入ってるSamsung SSD 930 EVO 500GBで、公称値は200TBW。もう1つは仮想マシン置き場にしているSamsung SSD 680 EVO 250GBで、公称値は150TBW。CrystalDiskInfoで総書き込み量と使用時間を調べて計算したら、前者はだいたい残り2年9ヵ月の命、後者は使用頻度が低いせいで残り654年の命と出た。後者はともかく前者は機材更新に備えておかないといけない……
メーカー公称値のTBWとCrystalDiskInfoで表示される数字からの計算が面倒だったので、フォームを埋めるだけで計算してくれるような物を用意してみました。
手厚いサポートの恩恵をほとんど受けてないのでSoftbank MobileをやめてMVNOにしよう、ということで数ヶ月前から準備を進めてて、まずSIMロックのかかってない端末に機種変更した。そこそこ性能が良くてモバイルSuicaが使えること、を条件に検討した結果AQUOSブランドのSH-M03にした(既にこの次のモデルが出てたけど、次のモデルはコストダウンの方に舵を切った結果スペックが落ちてたので……)。
……んだけど、これが本体の内蔵ストレージがめっちゃ少なくて、この前に使ってた203SHは32GBあったのにこれは16GBだからアプリの自動更新が何度か降ってきたらもうそれだけでパンパン。microSDを外部ストレージとして使うようにはもちろんしてたんだけど、それでも全然追っつかない。Kindleのようにデータを自分の領域に保存するアプリはそもそも外部ストレージがいくらあっても使っちゃくれないし。
検索したら、Android 6以降だとSDカードを内部ストレージの追加領域にできるみたいな話が出てきたのでやってみた。結論としては、今まで外部ストレージだったmicroSDがそっくりそのまま内部ストレージになる感じになった。
以下、やったこと。
外部ストレージとしてしか認識されないmicroSDを強制的に内部ストレージにする。(前の手順で内部ストレージとしてフォーマットできてるなら、多分この手順は不要)
Path
にC:\Users\(ユーザー名)\AppData\Local\Android\Sdk\platform-tools
を加える。adb shell
を実行してAndroid端末に接続する。
USBデバッグ接続を許可するかどうかの確認がAndroid端末の画面に出るので、許可する。
error: more than one device/emulator
というエラーメッセージが出て接続できない(自分の環境ではCintiq Companion Hybridが繋がっててこれにハマった)ので、関係無いAndroid端末は外しておく。adb shell
で無事端末に接続できたら、sm disk-list
を実行する。すると、以下のような感じで認識されてるmicroSDの識別子が表示される。
C:\Users\piro>adb shell
shell@SH-M03:/ $ sm list-disks
disk:179,64
shell@SH-M03:/ $
ここではdisk:179,64
がそれにあたる。
sm partition (microSDの識別子) private
を実行する。
shell@SH-M03:/ $ sm partition disk:179,64 private
shell@SH-M03:/ $
しばらく待たされて処理が完了する。
private
と指定するとmicroSDの領域全体が内部ストレージとして使えるようになるんだけど、文献によっては「全体を内部ストレージにするとおかしくなるのでmixed 50
のように指定すること」のように案内してたりする。が、自分の環境で試した限りではmixed
を指定しても期待したような効果を得られず、むしろprivate
にした方が想定通りの結果を得られた。この状態でファイルマネージャの類のアプリを起動してみると、以前は内部ストレージとSDカード(外部ストレージ)の2つが見えていたのが、内部ストレージが見えなくなってSDカードだけ表示されるようになっていた。 また、Android端末をPCに接続しても、microSDの分の領域だけが見えるようになっていた。
最初に退避しておいたmicroSDの中身を書き戻すというかマージすれば、移行作業は完了。逆に、microSDを切り離して元の状態に戻したい時は、設定→ストレージとUSB で内部ストレージの項目をタップして、右上のメニューボタンをタップして出てくるメニューから「データを移行」を選択すればいいんだと思う。やる前にmicroSDの中に保存されてるデータを消して内部ストレージに収まる状態にしておかないと、多分、失敗するか警告されて処理を実行できないんじゃないかなあ。
Ubuntuのバックアップユーティリティはバックエンドにduplicityというツールを使ってるんだけど、ユーティリティ越しだと大雑把な操作しかできないので、個別にファイルを復元したいみたいな時はduplicityコマンドを直接使う必要がある。それでduplicityを使おうとしたらこんなエラーが出て詰んだ。
$ duplicity --version
Traceback (most recent call last):
File "/usr/bin/duplicity", line 45, in <module>
from lockfile import LockFile as FileLock
ImportError: No module named lockfile
エラーメッセージで検索すると英語の情報しか見つからなかったんだけど、どうも、Pythonの複数バージョン使い分けのためにpyenvを入れていると、duplicityがシステムのPythonではなくpyenvのPythonの方を見に行ってしまうのが原因だったようだ。
そういえばGroonga関係のドキュメントを書くのにSphinxを使わないといけなくて、Sphinxが要求するPythonのバージョンがシステムのPythonのバージョンより新しかったからpyenvで乗り切ったような記憶がある。そのせいか。
PythonのことはさっぱりなのでどうやればpyenvとシステムのPythonを共存できるのかやり方を誰か教えて!と社内で聞いたら、デフォルトではシステムにインストールされたバージョンのPythonを使うようにして、特定のディレクトリ配下でだけ必要なバージョンを使うようにすれば良いと教えて貰えた
$ pyenv global system
$ duplicity --version
duplicity 0.7.06
でも同時に、Pythonコミュニティ的にはpyenvを使って欲しくない流れになっているみたいな事も聞いたので、自分の中でのPython触りたくない度合いがまた増してしまった。
TortoiseGitのステータス表示が出なくてなんでや、と思って検索したらStack Overflowのスレとか日本語の解説とかがヒットした。要するに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
以下のキーの文字コード順の並びで上位11個に入ってないやつは反映されないと……んでDropboxもTortoiseGitも登録しすぎと……そのうえOneDriveとかも入ってきてもうすっちゃかめっちゃかや。そういやTwitterのタイムラインでそんな話題が流れてたのを見た記憶がある。
とりあえずどっちが致命的かというとTortoiseGitの方なので、そっちが上に来るようにキー名を編集してみたところ、無事アイコンオーバーレイが有効になった。それにしても上位の取り合いのために名前の前にスペースを入れるとか、今は本当に2017年なんですか?って気分だ。
という理由から、作業途中に突然死して慌てるくらいなら先んじて移行しておいた方がいいだろうと思って自宅マシンを買い換えた。パソコン工房のマンガ描きたい人向けモデルをベースに、メインを500GB SSDにしてサブは250GB SSDというSSDオンリー構成で発注し、届いた後で旧マシンからSATAのHDDを移植した(旧マシンには3台のHDDがあったんだけど、ベイが足りないので容量が一番小さかった1台はドロップアウトした。まだ動くので、USB接続で使うかもしれない)。
元々、2画面+Cintiq Companion Hybridという計3画面の構成で使っていて、旧マシンでは3画面同時出力にビデオカードが必要だったのでそれも移植したんだけど、実際繋いでみたら新マシンはオンボードグラフィックだけで3画面いけた。追加のビデオカード、ただの電熱器になってもうた……
自分がよくやるWindowsの環境移行は、半分くらい真面目に移行して半分くらいは横着するというパターンで、こんな感じの方針でやった。
*:\Users\(username)\AppData\Roaming
(大抵のアプリのユーザ設定はここだけ移行すれば引き継げる)*:\Users\(username)\Documents
(ComicStudioとか、ここに設定を保存してる物がある)*:\Users\(username)\Music
(iTunesのライブラリはここにある)*:\Users\(username)\.*
(GIMPなど、UNIX・Linux系由来のアプリはホーム直下の.
で始まる名前のフォルダに設定を保存しがち)*:\ProgramData
(作りの古いアプリがここに設定を保存している場合があるのと、比較的最近のアプリもユーザに依らない設定はここに保存してるっぽい)*:\Program Files (x86)\JustSystems\ATOK
(ATOKのバージョンに依らない広辞苑とかの辞書はここにある)*:\Windows\Fonts
(フォント。ファイルを全選択して新環境のC:\Windows\Fonts
にコピーしようとすれば、フォントファイルはフォントとしてインストールして、そうでないファイルは警告が出るという感じでフォントだけ引き継げる)*:\Users\(username)\NTUSER.DAT
→HKEY_USERS\old-(username)
にロード*:\Windows\system32\config\SOFTWARE
→HKEY_USERS\old-software
にロードHKEY_USERS\old-(username)\Software
HKEY_USERS\old-software
HKEY_USERS\old-software\WOW6432Node
.reg
ファイルをテキストエディタで開き、以下のように置換する。
HKEY_USERS\old-(username)
→HKEY_CURRENT_USER
HKEY_USERS\old-software
→HKEY_LOCAL_MACHINE\Software
.reg
ファイルをダブルクリックしてインポートする。他にもエロゲーとかC:\Program Files (x86)
以下やC:\
以下にデータを保存するお行儀の悪いアプリがあるので、それらも適宜いい感じに移行してあげるとよいでしょう。僕はこの方法で少なくとも以下のアプリの設定を引き継げています。
こういう引き継ぎ方をしやすいように、ここ2〜3世代くらいは以下のことに普段から気をつけてる。
C:\Users\Public
以下に置く。中学高校の頃に中二病こじらせてアプリのインストール先(起動ドライブは空きを多くとりたい→なら別のドライブにインストール!)やらデータの置き場所(起動ドライブは空きを以下略)やら壁紙やらテーマやらカスタマイズしすぎた結果、移行の度にやれあれができなくなっただのこの設定がなくなっただのとイライラする羽目になったので、「できない事をしようとしない。靴に足を合わせる。自分でこうしたいと思って変えたものは、再現できないとストレスがものすごいが、唯々諾々と受け入れて慣れただけのものは、思い入れが無いから楽に忘れられる。」というデフォルト設定順応派にすっかり改宗してしまったのです。
でもそもそもの話、こういう乱暴な移行の仕方を真似するのはおすすめしません。非正規の方法を取って起こるあらゆるトラブルよりも、正規の手順でアプリの設定やデータをちまちま引き継ぐ手間の方が死ぬほど辛い、起こるトラブルは気合いで解決する、という本末転倒な事に陥っても構わない僕のような近視眼的な人以外は、真面目に普通に設定を移行した方がいいと思います。僕も、再設定が面倒でなかった以下の物は普通に入れ直して設定もやり直しました。
Raspberry Pi 2にUbuntu(Lubuntu)を入れて、その後USB接続の外付けHDDを使うようにしたRaspberry Piの自宅サーバですが、ディスクがお亡くなりになったようです……
当該サーバに相乗りしていたみんとちゃんbotが2月24日16時半頃の自動ツイートを最後に停止していた。帰宅後普段使いのユーザ=みんとちゃんbotを動作させているユーザでsshでログインしようとするが、鍵がないと言われて蹴られる(そんな馬鹿な!)。管理作業用に用意してあった別のユーザではログインできた。
普段使いのユーザのhomeは外付けHDDにあり、管理作業用のユーザのhomeはラズパイ本体のMicroSDにあったので、この時点でもう外付けHDD自体がアクセス不能になっていたようだ。
その後再起動してみるもUbuntu自体が起動せず(起動プロセスの途中で止まってしまう)。
Ext4を扱える作業用PCを用意してMicroSDからとりあえず/logと/etcを取り出した後、メインとバックアップの外付けHDDをそれぞれUSBケーブルで作業PCに接続するも、以下のようなメッセージが/var/log/kern.log(dmesgでも可)に出て先に進まない。
Feb 27 23:54:22 hostname kernel: [ 482.750854] usb 2-2: new high-speed USB device number 4 using xhci_hcd
Feb 27 23:54:23 hostname kernel: [ 482.881646] usb 2-2: New USB device found, idVendor=0411, idProduct=024f
Feb 27 23:54:23 hostname kernel: [ 482.881649] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Feb 27 23:54:23 hostname kernel: [ 482.881651] usb 2-2: Product: HD-LBVU3
Feb 27 23:54:23 hostname kernel: [ 482.881652] usb 2-2: Manufacturer: BUFFALO
Feb 27 23:54:23 hostname kernel: [ 482.881653] usb 2-2: SerialNumber: 000000270000F09E
Feb 27 23:54:23 hostname kernel: [ 483.068504] usb-storage 2-2:1.0: USB Mass Storage device detected
Feb 27 23:54:23 hostname kernel: [ 483.068580] scsi host4: usb-storage 2-2:1.0
Feb 27 23:54:23 hostname kernel: [ 483.068679] usbcore: registered new interface driver usb-storage
Feb 27 23:54:23 hostname kernel: [ 483.146849] usbcore: registered new interface driver uas
Feb 27 23:54:24 hostname kernel: [ 484.067523] scsi 4:0:0:0: Direct-Access BUFFALO External HDD 0000 PQ: 0 ANSI: 3
Feb 27 23:54:24 hostname kernel: [ 484.067952] sd 4:0:0:0: Attached scsi generic sg2 type 0
Feb 27 23:54:55 hostname kernel: [ 514.996705] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:55:26 hostname kernel: [ 546.102442] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:55:57 hostname kernel: [ 577.080222] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:56:28 hostname kernel: [ 608.058034] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:56:28 hostname kernel: [ 608.187252] sd 4:0:0:0: [sdb] Read Capacity(10) failed: Result: hostbyte=DID_TIME_OUT driverbyte=DRIVER_OK
Feb 27 23:56:28 hostname kernel: [ 608.187256] sd 4:0:0:0: [sdb] Sense not available.
Feb 27 23:56:59 hostname kernel: [ 639.100029] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:56:59 hostname kernel: [ 639.229451] sd 4:0:0:0: [sdb] Write Protect is off
Feb 27 23:56:59 hostname kernel: [ 639.229457] sd 4:0:0:0: [sdb] Mode Sense: 00 00 00 00
Feb 27 23:57:30 hostname kernel: [ 670.081799] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:57:30 hostname kernel: [ 670.211139] sd 4:0:0:0: [sdb] Asking for cache data failed
Feb 27 23:57:30 hostname kernel: [ 670.211156] sd 4:0:0:0: [sdb] Assuming drive cache: write through
Feb 27 23:58:01 hostname kernel: [ 701.119601] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:58:32 hostname kernel: [ 732.097607] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:59:03 hostname kernel: [ 763.075505] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 27 23:59:34 hostname kernel: [ 794.053339] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:00:05 hostname kernel: [ 825.031343] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:00:36 hostname kernel: [ 856.137236] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:00:36 hostname kernel: [ 856.266439] sd 4:0:0:0: [sdb] Read Capacity(10) failed: Result: hostbyte=DID_TIME_OUT driverbyte=DRIVER_OK
Feb 28 00:00:36 hostname kernel: [ 856.266447] sd 4:0:0:0: [sdb] Sense not available.
Feb 28 00:01:07 hostname kernel: [ 887.115166] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:01:38 hostname kernel: [ 918.093122] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:02:09 hostname kernel: [ 949.071135] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:02:40 hostname kernel: [ 980.113167] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:02:40 hostname kernel: [ 980.242580] sd 4:0:0:0: [sdb] Attached SCSI disk
Feb 28 00:03:11 hostname kernel: [ 1011.155150] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:03:42 hostname kernel: [ 1042.133159] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:04:13 hostname kernel: [ 1073.111069] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:04:44 hostname kernel: [ 1104.089034] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:05:15 hostname kernel: [ 1135.071017] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:05:46 hostname kernel: [ 1166.108960] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
Feb 28 00:06:17 hostname kernel: [ 1197.151034] usb 2-2: reset high-speed USB device number 4 using xhci_hcd
取り出してあったラズパイのログを見てみると、/var/log/kern.log(kern.log.4.gz)に1月下旬からエラーが出ていた。
Jan 23 07:42:11 hostname kernel: [6895164.358213] sd 1:0:0:0: rejecting I/O to offline device
Jan 23 07:42:11 hostname kernel: [6895164.358268] sd 1:0:0:0: rejecting I/O to offline device
Jan 23 07:42:11 hostname kernel: [6895164.376947] sd 1:0:0:0: rejecting I/O to offline device
Jan 23 08:48:38 hostname kernel: [6899151.391096] EXT4-fs (sdb1): error count since last fsck: 1815
Jan 23 08:48:38 hostname kernel: [6899151.391146] EXT4-fs (sdb1): initial error at time 1482879680: __ext4_get_inode_loc:3798: inode 129499236: block 517996582
Jan 23 08:48:38 hostname kernel: [6899151.391172] EXT4-fs (sdb1): last error at time 1485039158: ext4_find_entry:1289: inode 128602714
Jan 24 05:00:01 hostname kernel: [6971834.191579] sd 1:0:0:0: rejecting I/O to offline device
Jan 24 07:55:57 hostname kernel: [6982390.836437] sd 1:0:0:0: rejecting I/O to offline device
Jan 24 07:55:57 hostname kernel: [6982390.836522] EXT4-fs warning: 43 callbacks suppressed
Jan 24 07:55:57 hostname kernel: [6982390.836538] EXT4-fs warning (device sdb1): __ext4_read_dirblock:674: error -5 reading directory block (ino 128199902, block 0)
Jan 24 07:55:57 hostname kernel: [6982390.836599] sd 1:0:0:0: rejecting I/O to offline device
Jan 24 07:55:57 hostname kernel: [6982390.836632] EXT4-fs warning (device sdb1): __ext4_read_dirblock:674: error -5 reading directory block (ino 128199902, block 0)
ログローテートされていない最新の/var/log/kern.logは295MBあって(ローテートされた方は300KBもない)、そちらはこんな感じ。
Feb 24 09:45:59 hostname kernel: [9667395.780613] EXT4-fs (sdb1): error count since last fsck: 2139
Feb 24 09:45:59 hostname kernel: [9667395.780665] EXT4-fs (sdb1): initial error at time 1482879680: __ext4_get_inode_loc:3798: inode 129499236: block 517996582
Feb 24 09:45:59 hostname kernel: [9667395.780692] EXT4-fs (sdb1): last error at time 1485815831: ext4_find_entry:1289: inode 128602714
Feb 24 12:07:43 hostname kernel: [9675899.677825] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:09:01 hostname kernel: [9675977.758202] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:10:33 hostname kernel: [9676070.622174] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:11:05 hostname kernel: [9676101.654074] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:11:15 hostname kernel: [9676111.814096] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:11:31 hostname kernel: [9676127.974069] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:11:31 hostname kernel: [9676128.150102] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:11:41 hostname kernel: [9676138.310126] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Feb 24 12:11:41 hostname kernel: [9676138.399352] sd 0:0:0:0: Device offlined - not ready after error recovery
Feb 24 12:11:41 hostname kernel: [9676138.399399] sd 0:0:0:0: [sda]
Feb 24 12:11:41 hostname kernel: [9676138.399412] Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK
Feb 24 12:11:41 hostname kernel: [9676138.399427] sd 0:0:0:0: [sda] CDB:
Feb 24 12:11:41 hostname kernel: [9676138.399437] Write(16): 8a 00 00 00 00 00 0e 9d f4 e2 00 00 00 08 00 00
Feb 24 12:11:41 hostname kernel: [9676138.399510] blk_update_request: I/O error, dev sda, sector 245232866
Feb 24 12:11:41 hostname kernel: [9676138.399539] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 7077983 (offset 0 size 4096 starting block 30654109)
Feb 24 12:11:41 hostname kernel: [9676138.399561] Buffer I/O error on device sda1, logical block 30654104
Feb 24 12:11:41 hostname kernel: [9676138.399635] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.399658] sd 0:0:0:0: [sda] killing request
Feb 24 12:11:41 hostname kernel: [9676138.399702] sd 0:0:0:0: [sda]
Feb 24 12:11:41 hostname kernel: [9676138.399739] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
Feb 24 12:11:41 hostname kernel: [9676138.399755] sd 0:0:0:0: [sda] CDB:
Feb 24 12:11:41 hostname kernel: [9676138.399763] Write(16): 8a 00 00 00 00 00 ae 84 88 9a 00 00 00 30 00 00
Feb 24 12:11:41 hostname kernel: [9676138.399836] blk_update_request: I/O error, dev sda, sector 2927921306
Feb 24 12:11:41 hostname kernel: [9676138.401773] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.401825] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 7078075 (offset 0 size 4096 starting block 30654110)
Feb 24 12:11:41 hostname kernel: [9676138.401848] Buffer I/O error on device sda1, logical block 30654105
Feb 24 12:11:41 hostname kernel: [9676138.402111] Aborting journal on device sda1-8.
Feb 24 12:11:41 hostname kernel: [9676138.402166] EXT4-fs error (device sda1) in ext4_reserve_inode_write:4764: Journal has aborted
Feb 24 12:11:41 hostname kernel: [9676138.402233] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.402343] JBD2: Error -5 detected when updating journal superblock for sda1-8.
Feb 24 12:11:41 hostname kernel: [9676138.402376] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.402485] EXT4-fs error (device sda1): mpage_map_and_submit_extent:2129: comm bash: Failed to mark inode 7077983 dirty
Feb 24 12:11:41 hostname kernel: [9676138.402503] EXT4-fs (sda1): previous I/O error to superblock detected
Feb 24 12:11:41 hostname kernel: [9676138.402572] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.402663] EXT4-fs error (device sda1) in ext4_writepages:2420: Journal has aborted
Feb 24 12:11:41 hostname kernel: [9676138.402681] EXT4-fs (sda1): previous I/O error to superblock detected
Feb 24 12:11:41 hostname kernel: [9676138.402736] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.410089] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:11:41 hostname kernel: [9676138.410149] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 7077983 (offset 0 size 4096 starting block 30653956)
Feb 24 12:11:41 hostname kernel: [9676138.410174] Buffer I/O error on device sda1, logical block 30653951
Feb 24 12:12:42 hostname kernel: [9676199.410548] EXT4-fs (sda1): previous I/O error to superblock detected
Feb 24 12:12:42 hostname kernel: [9676199.410719] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 12:12:42 hostname kernel: [9676199.410826] EXT4-fs error (device sda1): ext4_journal_check_start:56: Detected aborted journal
Feb 24 12:12:42 hostname kernel: [9676199.410846] EXT4-fs (sda1): Remounting filesystem read-only
Feb 24 12:12:42 hostname kernel: [9676199.410856] EXT4-fs (sda1): previous I/O error to superblock detected
Feb 24 12:12:42 hostname kernel: [9676199.410890] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.720835] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.720999] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.721346] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.721443] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.722797] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.722917] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.723035] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.723109] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.723303] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.723381] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.723476] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.723542] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.723634] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.723697] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.723786] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.723850] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.723941] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.724003] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.724113] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.724177] EXT4-fs warning (device sda1): __ext4_read_dirblock:884: error -5 reading directory block (ino 7078003, block 114)
Feb 24 16:28:21 hostname kernel: [9691537.724267] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.724399] sd 0:0:0:0: rejecting I/O to offline device
Feb 24 16:28:21 hostname kernel: [9691537.724533] sd 0:0:0:0: rejecting I/O to offline device
...
(以下同じログが延々300万行ほど)
...
認識されてる順番的に、バックアップ側(/dev/sdb1)の方がまず死んで、その後メイン側(/dev/sda1)が死んだという感じでしょうか。
fstabでこれらのディスクを自動的にマウントするように書いてあったので、Raspberry Piが起動途中で止まるのはそのせいかもしれない。後でfstabを書き換えて試してみようと思う。
あと筐体を分解して中のHDDを取り出して直接接続したらデータを読めたという話もあるみたいなので、これも試してみないといけない。
仮にデータを取り出せたとして、今後どうするか。普通にメインとバックアップの2台を用意してrsyncするようにしてただけだと、今回のようにバックアップ側が先に死んだことに気がつけない。死活監視とかちゃんとやらないとなんだろうけど、結局の所「ちゃんと動いてるかどうか」って機械的にスッキリ判定できる物なのかどうかよく分からない。理想を言うと、RAID1みたいなクラスタになってるか1日おきにメインとバックアップが入れ替わるかみたいになってて、普通に使ってて「何かおかしいぞ」とすぐ気付けるようになってるといいのかなと思うんだけど、それはそれで「壊れた方をコピー元にして壊れた物を無事な物に上書きしてしまう」問題がやっぱりあるわけで。
エラー検知までしてくれるようなちゃんとしたNASの製品を買うのが一番なのかな……もういい歳なんだし金で解決できる物は金で解決するのが手っ取り早いよね。
類似モデルの分解事例を見ながら分解してみたところ、中身はSeagateのSATAのディスクでした。
これを手持ちのSATA→USB変換器に繋いでみたところ、1台はウンともスンとも言わなかったのですが、もう1台の方はシーク音らしき音がし始めてkern.logにもディスクとして認識できたっぽいメッセージが出始めたので「やった!」と思った……のもつかの間、
Error mounting /dev/sdb1 at /media/piro/buffalo-external: Command-line `mount -t "ext4" -o "uhelper=udisks2,nodev,nosuid" "/dev/sdb1" "/media/piro/buffalo-external"' exited with non-zero exit status 32: mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
てなダイアログが出て、マウントされずにそのまま無反応になってしまいました。認識されかけた時もkern.logにはEXT4-fsのエラーがぽろぽろ出ていたので、ハードウェア障害が根本にあってさっきのが最後の一息みたいなもんだったっぽいです。
もうこりゃ自分の手に負えないわと諦めて、でも思い出の写真とかこの中にしかないデータもあるので、金額次第ですが専門の業者に依頼してみようかと思ってます。「HDD データ復旧 Ext4」とかで検索したら業者がいくつか出てきたので、とりあえず見積もりから……(経費扱いで計上したら控除対象にならんかなこれ)
あ、そんな感じで肝心のHDDはさっぱりだったのですがラズパイの方はあっさり復旧できました。問題の外付けHDDを認識させるための設定を/etc/fstabに直書きしてたのをコメントアウトして、他にも外付けHDDの中のディレクトリへのシンボリックリンクになってた部分を全部普通のディレクトリに改めてみた所、無事Lubuntuのログイン画面まで辿り着けました。でもこれだけ復活しても、記憶を全部なくした抜け殻みたいなもんだからあんまり意味無い……
Let's note CF-SX3をUbuntu 14.04LTSで使ってたんだけど、16.04LTSへのアップグレードではこういう所で詰まりましたという話。
ATOK X3を使っていたUbuntu 14.04LTSから16.04LTSにアップグレードしたら、ネットワークに繋がらなくなった。 これは、Ubuntu 16.04でATOK X3を使うに記載がある「ATOK X3のインストールスクリプトが/var/runを壊す」という問題がこのバージョンで表面化したせいだった。
リンク先の記事では正常な環境で新規にATOK X3をインストールする場合について書かれてるけど、既に過去のバージョンでATOK X3をインストールしていた場合 /var/run が既に壊れた状態になっていて、しかもロックがかかっていてそのままでは手の施しようがない。なのでリカバリモードで強制的に修正する。
ls /var/run
とls /run
を実行し、それぞれの結果を比較する。両者が同一なら問題ないが、内容が異なっている場合、その環境は壊れているので次のステップに進む。rm -rf /var/run
で今ある/var/runを消す。
……と言いたい所なのだが、そのままやっても以下のようなエラーになる。
rm: cannot remove `/var/run/vmblock-fuse/dev': Function not implemented
rm: cannot remove `/var/run/vmblock-fuse/blockdir': Function not implemented
これは、/(ルートディレクトリ)以下が読み込み専用でマウントされているせい。
なのでmount -o remount,rw /
というコマンド列を実行して、読み書き可能な状態にしてから、改めてrm -rf /var/run
で今ある/var/runを消す。
ln -s /run /var/run
を実行し、/var/runを/runへのシンボリックリンクにする。exit
でログアウトする。以上の手順で、壊れた/var/runを正常な状態に戻す事ができた。 ATOK X3を使っていなかった環境ではこの作業は不要です。
Ubuntu 16.04でATOK X3を使うという記事に色々情報がある。ただ、環境の違いのせいか、自分の環境ではそのままではうまくいかなかった。また、一部の手順はUbuntu 14.04 LTSをインストールした直後に行う設定という別のページを参照するように書いてある。全部転記すると余計に訳が分からなくなりそうなので、適宜リンク先を参照する前提で手順をまとめる。
必要なパッケージをインストールする。リンク先の記事でも同様の手順があるが、そこに書かれていないパッケージが必要になるので先に入れておく。
sudo apt-get install libpangoxft-1.0-0:i386 libpangox-1.0-0:i386
自分の環境はUbuntu 16.04LTSの64bit版なんだけど、これらの32bit版パッケージが無いとATOK X3がエラーで起動しなかった。ATOK X3のインストールスクリプトの実行時点で「libpangoxft-1.0.so.0: cannot open shared object file」というエラーが出ていて、このメッセージを検索した所、同様のエラーで詰まっている事例 が複数見つかったので、それらの事例で解決策として紹介されていた手順に従った。
/opt/atokx3/sample/iiimf_status_hide
と追記する手順があるが、これも飛ばす。(ここに書いても期待通りの結果は得られなかった)上記「変更点3」で作成したファイル「~/.xinputrc」の末尾に、さらに以下の2行を書き足す。
/opt/atokx3/bin/atokx3start.sh
/opt/atokx3/sample/iiimf_status_hide
これをやっておかないと、ウィンドウの左下のインジケータがいつまでも出るとか、ATOK X3が起動せずATOKパネルが表示されないとかの問題が起こる。
GNOMEの既定の配色でツールチップが黒背景・白文字になっているが、この状態だとATOK X3の補完候補のツールチップ等が「黒背景・濃いグレーの文字」になって読みにくいため、以下のファイルを管理者権限で編集して配色を変える。
tooltip_bg_color:#000000
→ tooltip_bg_color:#f5f5b5
にするtooltip_bg_color:#ffffff
→ tooltip_fg_color:#000000
にするtooltip_bg_color:#000000
→ tooltip_bg_color:#f5f5b5
にするtooltip_bg_color:#ffffff
→ tooltip_fg_color:#000000
にするtooltip_bg_color #000000;
→ tooltip_bg_color #f5f5b5;
にするtooltip_bg_color #ffffff;
→ tooltip_fg_color #000000;
にするsedでやるなら、こう。
sudo sed -i /usr/share/themes/Ambiance/gtk-2.0/gtkrc -r -e "s/tooltip_bg_color:#[0-9a-f]+/tooltip_bg_color:#f5f5b5/i" -e "s/tooltip_fg_color:#[0-9a-f]+/tooltip_fg_color:#000000/i"
sudo sed -i /usr/share/themes/Ambiance/gtk-3.0/settings.ini -r -e "s/tooltip_bg_color:#[0-9a-f]+/tooltip_bg_color:#f5f5b5/i" -e "s/tooltip_fg_color:#[0-9a-f]+/tooltip_fg_color:#000000/i"
sudo sed -i /usr/share/themes/Ambiance/gtk-2.0/gtkrc -r -e "s/tooltip_bg_color #[0-9a-f]+/tooltip_bg_color #f5f5b5/i" -e "s/tooltip_fg_color #[0-9a-f]+/tooltip_fg_color #000000/i"
システムを再起動する。
以上の手順で、Firefoxやgeditなどでは問題なく日本語入力できるようになった。
ただ、Linux版SkypeのようなQtアプリや、Wine上で動かしてるWindowsアプリでは、日本語入力ができなくなってしまった(以前はibus-mozcで一応は入力できる状態だった)。 これは解決の方法が無いっぽくてお手上げです……
ホットキー(Fn+ファンクションキー)でというか、そもそもUbuntu上で画面の輝度を変えられなくなっていた。Ubuntuの画面の明るさの調整を有効にする - ’s blogによると、これはGRUBの設定を変更すればいいようだった。 リンク先のページの後半にある通りにやったらホットキーが機能するようになった。
sudo vim /etc/default/grub
のようにしてファイルを開く。GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
とある箇所をGRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_backlight=vendor acpi_osi="
に書き換える。sudo update-grub
でGRUBを再設定する。14.04ではgpointing-device-settingsでこの設定ができたんだけど、16.04ではパッケージが提供されなくなっている。
検索したら、設定ファイルを直接編集すればいけるという情報があった。Let's Noteのタッチパッドの回転スクロールがログアウトすると無効になってしまうのを改善した。 - ここはひとつ、当て推量で。の記述を見つつ、
sudo mkdir -p /etc/X11/xorg.conf.d/
sudo cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/50-synaptics.conf
sudo vi /etc/X11/xorg.conf.d/50-synaptics.conf
という感じで設定ファイルをテンプレートからコピーして用意した上で、
Section "InputClass"
Identifier "touchpad catchall"
というセクションの最後に
Option "CircularScrolling" "on"
Option "CircScrollTrigger" "0"
EndSection
という設定を加えてから再起動すれば、回転スクロールできるようになった。 各設定の意味はSynaptics タッチパッド - ArchWikiに詳しい情報がある。
何かあったらまた追記するかも。