Home > Latest topics

Latest topics 近況報告

たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。

萌えるふぉくす子さんだば子本制作プロジェクトの動向はもえじら組ブログで。

宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

Page 1/243: 1 2 3 4 5 6 7 8 9 »

Windows 10の環境構築 - Apr 05, 2019

会社で新しくWindows 10 PCをメイン環境として使い始めようとしていて、セットアップするのになんやかや詰まったので記録を残しておきます。

任意のホームディレクトリ名でアカウントを作る

何も考えずにMicrosoftアカウントで使い始めると、例えば shimoda.hiroshiみたいなMicrosoftアカウントだったら C:\Users\shimo みたいな適当にぶった切られた名前でホームディレクトリができてしまう。C:\Users\piro みたいに任意の名前のホームディレクトリにするためには、以下の手順を踏まないといけない。

  1. 使いたいホームディレクトリの名前でローカルアカウントを作成する
  2. そのローカルアカウントを管理者にする。
  3. そのローカルアカウントでログオンする。
  4. そのローカルアカウントからMicrosoftアカウントに切り替える。
  5. 再起動後、古いホームディレクトリ(C:\Users\shimo とか)を管理者権限で削除する。

コンピューター名を変える

コンピューター名はWindowsの通常使用だと意識する事はあまりなくて、LAN内で参照する時に使う程度だけど、WSLでホスト名として常時目にする事になる。これがランダムっぽい名前だと結構いらつくので、最初に変えておく。(以後はWSLでも勝手にこの情報を参照してくれる)

WSLの初期設定

WSLを有効化してストアからUbuntuをインストールした後にやること。

  1. Windowsのファイルシステム上でWSLのファイルのパーミッションを保存できるようにするために、 sudo vim /etc/wsl.conf で設定ファイルを開いて以下の内容を保存する。

    [automount]
    options = "metadata,umask=22,fmask=111"
    

    マウントした既存のファイルや新たに作成したファイルが全部実行権限付きで認識されるとGitを使うのに不便なので、maskを指定して実行権限がつかないようにしておく。

  2. WSLのシェルを一旦閉じて、サービス一覧から LxssManager を探し、再起動する。これで、上記の設定が反映される。
  3. ln -s /mnt/c/Users/username/Destop ~/Desktopln -s /mnt/c/Users/username/Documents ~/Documentsln -s /mnt/c/Users/username/Downloads ~/Downloadsln -s /mnt/c/Users/Public ~/Public などとして、WSLでよく使うWindowsのフォルダにシンボリックリンクを作っておく。
  4. シェルでよく使う基本の設定をする。

    1. ~/.bashrc に以下の内容を加えて、コマンド履歴の逆方向検索に Ctrl-S を使えるようにする。

      stty stop undef
      stty start undef
      
    2. ~/.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
      
    3. ~/.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'
      
  5. SSHの秘密鍵を設置して、他のホストにSSHで接続できるようにする。 基本方針として、WSLのsshクライアントから直接秘密鍵を触らずに、PuTTYのPageantに鍵を読み込ませて、必ずweasel-pageant経由で利用することにする。

    1. C:\Users\username\.ssh/mnt/c/Users/username/.ssh)を作成し、旧環境からファイルをコピーする。
    2. PuTTYをインストールする。
    3. puttygen.exeで秘密鍵のid_rsaをインポートして、PuTTY形式の秘密鍵 id_rsa.ppk として保存する。
    4. Win-Rで shell:startup を実行してスタートアップフォルダを開き、pageant.exe のショートカットを作成する。
    5. pageant.exe を起動して、先の id_rsa.ppk を読み込ませる。
    6. weasel-pageantの最新リリース版バイナリをダウンロードし、展開したファイルを C:\Program Files (x86)\wsl-pageant に置く。
    7. マウントオプションで実行権限がつかないようにしているので、chmod +x /mnt/c/Program\ Files\ \(x86\)/weasel-pageant/weasel-pageant /mnt/c/Program\ Files\ \(x86\)/weasel-pageant/helper.exe で明示的に実行権限を設定する。
    8. echo 'eval $(/mnt/c/Program\ Files\ \(x86\)/weasel-pageant/weasel-pageant -r)' >> ~/.bashrc で、weasel-pageantを自動起動するようにする。(weasel-pageantにどのようなオプションを設定するべきかについては、必ず最新の解説を参照すること。)
    9. mkdir ~/.ssh; chmod 700 ~/.ssh で、設定ファイル等の置き場所を用意する。 ln -s /mnt/c/Users/username/.ssh ~/.ssh でシンボリックリンクとして作成してしまうと、次項の設定をしてもSSH接続を受け付けられなくなってしまう(~/.ssh のパーミッションを適切に設定できなくなる)ので、必ずここは普通のディレクトリとして作成しておく
    10. ほかのホストにログインできることを確認する。
  6. 他のホストからSSHで接続できるようにする。 常時使うわけではないが、必要な時はできるようにしておく。WSLのUbuntuにはopenssh-serverが最初から入っているので、後は必要な設定をするだけで使える。
    1. 前項で /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 にコピーする。
    2. chmod 600 ~/.ssh/authorized_keys として、パーミッションを適切に設定する。
    3. sudo service ssh start してsshdを起動する。
    4. ssh localhost でログインできることを確認する。
    5. Windows Defenderのファイアウォールの詳細設定で、「受信の規則」で以下の内容の規則を作成する。
      • 種類:ポート
      • プロトコル:TCP
      • ポート:22
      • プロファイル:「ドメイン」と「プライベート」だけ残して、「パブリック」はチェックを外す(怖いので)。
      • 名前:ssh
    6. 他のホストからログインできることを確認する。
    7. sudo service ssh stop してsshdを停止する。(以後は、必要な時にだけ起動する)
  7. pecoを使えるようにする。
    1. mkdir -p ~/local/bin で、ユーザー固有のバイナリ置き場を用意する。
    2. echo 'export PATH="~/local/bin:$PATH"' >> ~/.bashrc してパスを通しておく。
    3. pecoの最新リリース版から適切なバイナリをダウンロードする(今回は peco_linux_amd64.tar.gz を使った)。
    4. unar peco_linux_amd64.tar.gz でファイルを展開する。
    5. 取り出されたファイル群に含まれる peco~/local/bin/ に移動し、chmod +x ~/local/bin/peck で実行権限を設定する。
    6. 私的によく使う設定のまとめをraw形式でダウンロードし、echo 'source ~/peco-commands.sh' >> ~/.bashrc で自動的に読み込むように設定する。
  8. bash-git-promptを使うようにする。

    1. cd ~/ して git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1 で必要なファイルをローカルに用意する。
    2. 以下の内容を ~/.bashrc に追加して、機能を有効化する。

      GIT_PROMPT_ONLY_IN_REPO=1
      source ~/.bash-git-prompt/gitprompt.sh
      GIT_PROMPT_THEME=Single_line_Ubuntu
      
    3. 時刻表示の部分が余計なので、以下のように編集する。

      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_START_USER="_LAST_COMMAND_INDICATOR_ ${Cyan}${PathShort}${ResetColor}"
         GIT_PROMPT_END_USER="${ResetColor} $ "
         GIT_PROMPT_END_ROOT="${BoldRed} # "
      
  9. sudo update-alternatives --config editor でデフォルトのエディタをvim.basicに切り替えておく。

ファイルの移行

ここまででWSL上のrsyncが使えるようになっているので、旧環境から rsync -a xxx.xxx.xxx.xxx:~/path/to/directory/ ~/Public/ みたいにしてパーミッションの情報込みでファイルを持ってこれる。 (シンボリックリンクまで勝手に辿らせると大変なことになりかねないので、シンボリックリンクの先は個別に辿るのがよい気がする。)

今回は移行元がハードウェア上にインストールされたUbuntuだったけれども、移行元がWindows 10マシンの場合も上記の要領であらかじめsshdを起動しておけば、同様にrsyncでファイルを持ってこれる。

Firefoxのビルド環境を整える

最近のMozillaBuildとmozilla-centralはよくできてて、だいたい一発で環境ができあがる。以下、前半は会社のブログに書いた手順の通り。

  1. MozillaBuildの最新版リリースをダウンロードし、インストールする。一般的にはc:\mozilla-buildにインストールする。
  2. C:\mozilla-sourceの位置にフォルダを作る。Firefoxのソースコード一式はこの配下に置く事になる。
  3. c:\mozilla-build\start-shell.batを実行して、MozillaBuildのシェル(Bash)を起動する。
  4. echo 'export PATH=$PATH:~/.cargo/bin' >> ~/.bash_profile を実行して、MozillaBuildのシェルを一旦終了し、c:\mozilla-build\start-shell.batで起動し直す。
  5. cd /c/mozilla-source して、 hg clone https://hg.mozilla.org/mozilla-central でmozilla-centralをcloneする。
  6. cd mozilla-central してリポジトリに入り、./mach bootstrap を実行する。これにより、Visual StudioやRustなどのビルドに必要なソフトウェア群が自動インストールされる。
  7. ./mach build して、ビルドできる事を確認する。
  8. ./mach run して、ビルドしたFirefoxを起動できる事を確認する。
  9. 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
    
  10. Mozillaのサーバーに認証を求める時のユーザー名指定を省略できるようにするために、~/.ssh/configに以下を追記する。

    Host hg.mozilla.org
      User yuki@clear-code.com
    
  11. ssh hg.mozilla.org してみて、認証できるかを確認する。(シェルには入れないでそのまま接続が切れるが、それでOK。)

  12. tryserverを使うために、~/.hgrcに以下を追記する。

    [paths]
    try = ssh://hg.mozilla.org/try
    
  13. ./mach try empty で空のリクエストを送れるかどうか確認する。

  14. Phabricatorを使うための準備をする
  15. hg grepfileでワーキングコピーのファイルを対象に検索できるようにするために、hg-grepfileをインストールする。ただし2019年4月16日現在のバージョンは最新のMercurialで動かないため、修正のプルリクエストがマージされるまでの間は独自の修正版を使う必要がある。

タスクビューをすぐに出せるようにする(仮想デスクトップをすぐに切り替えられるようにする)

最近までWindows 10標準で仮想デスクトップ機能があるということを把握してませんでした。今回調べて初めて知りました。

Ubuntuではメインの作業画面とThunderbirdを使う(メールを読み書きする)画面とを分けていて、画面の端にカーソルでちょいっと触れると仮想デスクトップ切り替えの画面が出てくるようになってたんだけど、そういう事をできるようにするにはユーティリティが必要。タスクビューの切り替え画面を出すこと自体は、Windowsキー+Tabでできるので、任意のジェスチャでこのキー操作を代替すればよい。

マウスジェスチャーソフトの「MouseGestureL.ahk」でマウスホイールにWindows10の「タスクビュー」を割り当てる | PC ウェブログという記事を参考に、以下のようにした。

  1. MouseGestureL.ahkをダウンロードする。
  2. zipを展開してC:\Program Files配下あたりに適当に置く。
  3. Setup.vbsを実行する。
  4. インストールされて設定画面が開かれる。
  5. 「ジェスチャー」タブに切り替えて、以下のジェスチャーを追加する。
    • 名称:screen-edge
    • ジェスチャ-1:CRB_(画面右下角に接触)
    • ジェスチャー2:CLB_(画面左下角に接触)
  6. 「メイン」タブに切り替えて、「デフォルト」の割り当て済みジェスチャーをscreen-edge以外すべて削除する。
  7. screen-edgeのアクションスクリプトを以下の通りに書く。

    ;キー操作を発生させる
    Send, #{TAB down}{TAB up}
    
  8. 「その他」タブに切り替えて、「スタートアップに登録」で自動起動するようにする。

これで、画面の端に触れるだけで仮想デスクトップを切り替えられるようになる。

Selection Clipboard的なこと(文字列を選択するだけでコピー)を実現する……のは諦めた

Ubuntuではテキストを選択すると通常のクリップボードとは別の専用のバッファにテキストが格納されてミドルクリックで貼り付けるという動作になってた(これ自体はXの機能とのこと)んだけど、GNOME Terminal(端末)でコピー&ペーストのキーバインドが他のGUIアプリと違っていたこともあって自分でも驚くくらいに意外と多用していて、Windows環境でWSLを使っているとそのときの感覚が抜けなくてつい戸惑ってしまう。

代わりになりそうなものを探してみたらいくつか情報が見つかったんだけど、どれも今使うにはちょっと厳しい感じだった。

  • copipex:32bitアプリだからなのか、64bit版Firefoxや秀丸エディタでは反応してくれなかった。作者の方によると、64bit版作成の予定は無いとのこと。
  • True X-Mouse Gizmo:Xのマウス関連操作を再現することを意識しているらしく、Selection Clipboard以外の余計な機能が多くて辛い。特に、mouseoverでフォーカスを切り替える機能のせいでタスクバーがまともに使えなくなるのが致命的。
  • AutoCopyX:なんかWindows Defenderでマルウェア判定されるので怖い。

もうちょっと悪あがきしてみようと思って「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が送信されるので、Windowsのエラー音がその度に鳴ってうざい
  • WSLのウィンドウをタイトルバーのドラッグで移動したりリサイズしたりすると、Ctrl-Cが送信されてSIGINTになって実行中のプロセスが終了してしまう(致命的)

Ctrl-Cでクリップボードへのコピーを試行するのが元凶なので、それ無しで選択範囲のテキストを取得できる方法があればいいんだけど、それはエディットコントロールに対してのみ動作する関数しか用意されてなくて、オフィシャルのサンプルの時点で「標準のエディットコントロール以外でも使えるのはCtrl-Cを使う方法だ」と紹介されてるレベルだったので、AutoHotKeyの制限事項としてどうにもならないというのが結論のようです。残念。

なんで自動化してないの

そんなに頻繁にやるわけじゃなくて、数年に1回やる程度なので、

  • そのためだけにPowerShell覚える気になれない。一生懸命覚えてもLinuxとかBSDとかmacOSとかで使えないし。→と思ってたら他のプラットフォームでも動かせるという指摘を頂きました
  • 数年に1回の実行ペースでは、下手に自動化してると、前回実行時から色々前提が変わっていて途中でこけてドツボにはまりそうで怖い(実際今回もweasel-pageantの推奨設定が以前調べた時と変わっていた)。

という風に思ってます。

毎月やるとか、まとめて10台くらいやるとか、そういう前提が出てきたら重い腰を上げてPowerShell覚えるかもしれないですね。

 

まだ後から書き足しそう。

SSDの残り寿命の計算 - Feb 12, 2019

今や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で表示される数字からの計算が面倒だったので、フォームを埋めるだけで計算してくれるような物を用意してみました。

    SH-M03でSDカードを内部ストレージの代わりに使うように設定した - Jun 09, 2017

    手厚いサポートの恩恵をほとんど受けてないのでSoftbank MobileをやめてMVNOにしよう、ということで数ヶ月前から準備を進めてて、まずSIMロックのかかってない端末に機種変更した。そこそこ性能が良くてモバイルSuicaが使えること、を条件に検討した結果AQUOSブランドのSH-M03にした(既にこの次のモデルが出てたけど、次のモデルはコストダウンの方に舵を切った結果スペックが落ちてたので……)。

    ……んだけど、これが本体の内蔵ストレージがめっちゃ少なくて、この前に使ってた203SHは32GBあったのにこれは16GBだからアプリの自動更新が何度か降ってきたらもうそれだけでパンパン。microSDを外部ストレージとして使うようにはもちろんしてたんだけど、それでも全然追っつかない。Kindleのようにデータを自分の領域に保存するアプリはそもそも外部ストレージがいくらあっても使っちゃくれないし。

    検索したら、Android 6以降だとSDカードを内部ストレージの追加領域にできるみたいな話が出てきたのでやってみた。結論としては、今まで外部ストレージだったmicroSDがそっくりそのまま内部ストレージになる感じになった。

    以下、やったこと。

    1. 準備。
      1. Androidのバージョンを確認する。SH-M03はAndroid 6.0.1で、6以上という条件を満たしてるので問題なし。
      2. microSDの内容をPCに退避する。一旦フォーマットする必要があるという説明を見たので。
      3. 設定→ストレージとUSB でmicroSDをタップし、右上のメニューボタンをタップして出てくるメニューからフォーマットを選択する。 この時、SDカードを内部ストレージとして使う機能を解放してる機種で、且つmicroSDの性能が充分にあると「内部ストレージとしてフォーマット」という項目がメニューに表示されて、それを選択すればいいようなんだけど、SH-M03はこの機能が封印されてるのか、使ってるmicroSDのせいなのか、自分の環境では「外部ストレージとしてフォーマット」しか表示されなかった。ので、とりあえずそれを選択してフォーマットし直した。
    2. 外部ストレージとしてしか認識されないmicroSDを強制的に内部ストレージにする。(前の手順で内部ストレージとしてフォーマットできてるなら、多分この手順は不要)

      1. 作業用PCにAndroid Studioをインストールする。
      2. コマンドプロンプトから開発ツールを使えるようにするために、環境変数PathC:\Users\(ユーザー名)\AppData\Local\Android\Sdk\platform-toolsを加える。
      3. Android端末側で、設定→端末情報→ビルド番号 を連打して開発者向けの機能を使えるようにする。
      4. Android端末で設定→開発者向けオプションを開いて機能を有効化し、「USBデバッグ」をONにする。
      5. USBケーブルでPCとAndroid端末を接続する。
      6. コマンドプロンプトを開き、adb shellを実行してAndroid端末に接続する。 USBデバッグ接続を許可するかどうかの確認がAndroid端末の画面に出るので、許可する。
        • この時、2つ以上のAndroid端末がPCに接続されているとどこに繋ぎに行けばいいのか分からないということでerror: more than one device/emulatorというエラーメッセージが出て接続できない(自分の環境ではCintiq Companion Hybridが繋がっててこれにハマった)ので、関係無いAndroid端末は外しておく。
      7. 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がそれにあたる。

      8. sm partition (microSDの識別子) privateを実行する。

        shell@SH-M03:/ $ sm partition disk:179,64 private
        shell@SH-M03:/ $
        

        しばらく待たされて処理が完了する。

        • この時、privateと指定するとmicroSDの領域全体が内部ストレージとして使えるようになるんだけど、文献によっては「全体を内部ストレージにするとおかしくなるのでmixed 50のように指定すること」のように案内してたりする。が、自分の環境で試した限りではmixedを指定しても期待したような効果を得られず、むしろprivateにした方が想定通りの結果を得られた。
      9. Android端末を再起動する。
    3. 内部ストレージとしてフォーマットされたmicroSDに、データを移行する。
      1. 設定→ストレージとUSBを開くとmicroSDが「外部ストレージ」と括られずに「内部ストレージ」のすぐ下に表示されているので、これをタップする。
      2. 右上のメニューボタンをタップして出てくるメニューから「データを移行」を選択する。
      3. 確認の後、本体内蔵のメモリからmicroSDに諸々のデータやアプリが移動される。

    この状態でファイルマネージャの類のアプリを起動してみると、以前は内部ストレージとSDカード(外部ストレージ)の2つが見えていたのが、内部ストレージが見えなくなってSDカードだけ表示されるようになっていた。 また、Android端末をPCに接続しても、microSDの分の領域だけが見えるようになっていた。

    最初に退避しておいたmicroSDの中身を書き戻すというかマージすれば、移行作業は完了。逆に、microSDを切り離して元の状態に戻したい時は、設定→ストレージとUSB で内部ストレージの項目をタップして、右上のメニューボタンをタップして出てくるメニューから「データを移行」を選択すればいいんだと思う。やる前にmicroSDの中に保存されてるデータを消して内部ストレージに収まる状態にしておかないと、多分、失敗するか警告されて処理を実行できないんじゃないかなあ。

    Ubuntu 16.04でduplicityを使おうとしたらPythonのエラーが出る件 - May 22, 2017

    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触りたくない度合いがまた増してしまった。

    Windows 10移行時の環境設定でエクスプローラのアイコンのオーバーレイ表示が効かない奴に遭遇した - May 08, 2017

    TortoiseGitのステータス表示が出なくてなんでや、と思って検索したらStack Overflowのスレとか日本語の解説とかがヒットした。要するに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers以下のキーの文字コード順の並びで上位11個に入ってないやつは反映されないと……んでDropboxもTortoiseGitも登録しすぎと……そのうえOneDriveとかも入ってきてもうすっちゃかめっちゃかや。そういやTwitterのタイムラインでそんな話題が流れてたのを見た記憶がある。

    とりあえずどっちが致命的かというとTortoiseGitの方なので、そっちが上に来るようにキー名を編集してみたところ、無事アイコンオーバーレイが有効になった。それにしても上位の取り合いのために名前の前にスペースを入れるとか、今は本当に2017年なんですか?って気分だ。

    Windows 7からWindows 10への移行 - May 08, 2017

    • 自宅のマシンの動作が最近ちょっと怪しくて、スリープから復帰しないみたいな事が発生する頻度が高くなってきた気がしてた。調べてみたら新調してから5年くらい経っていたので、寿命が近付いているのかもしれない。
    • 会社で新調したマシンでWindows 10 on SSDを体験したらあまりに爆速だった。

    という理由から、作業途中に突然死して慌てるくらいなら先んじて移行しておいた方がいいだろうと思って自宅マシンを買い換えた。パソコン工房のマンガ描きたい人向けモデルをベースに、メインを500GB SSDにしてサブは250GB SSDというSSDオンリー構成で発注し、届いた後で旧マシンからSATAのHDDを移植した(旧マシンには3台のHDDがあったんだけど、ベイが足りないので容量が一番小さかった1台はドロップアウトした。まだ動くので、USB接続で使うかもしれない)。

    元々、2画面+Cintiq Companion Hybridという計3画面の構成で使っていて、旧マシンでは3画面同時出力にビデオカードが必要だったのでそれも移植したんだけど、実際繋いでみたら新マシンはオンボードグラフィックだけで3画面いけた。追加のビデオカード、ただの電熱器になってもうた……

    自分がよくやるWindowsの環境移行は、半分くらい真面目に移行して半分くらいは横着するというパターンで、こんな感じの方針でやった。

    1. アプリケーションは、関連付け等きちんと初期化されないとまずいので、全部インストーラーから入れ直す。
    2. 旧マシンから移植したHDDから、以下の位置にあるデータの中でよく使うアプリに関係する物を新環境の対応するパスにコピーする。(※ユーザの内部IDが変わっているので、コピーの前に、新環境のユーザにフルコントロールの権限を付与しておく必要がある)
      • *:\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にコピーしようとすれば、フォントファイルはフォントとしてインストールして、そうでないファイルは警告が出るという感じでフォントだけ引き継げる)
    3. レジストリハイブをロードする方法を使って旧環境のレジストリの内容を以下の要領で読み込む。
      • *:\Users\(username)\NTUSER.DATHKEY_USERS\old-(username)にロード
      • *:\Windows\system32\config\SOFTWAREHKEY_USERS\old-softwareにロード
    4. 以下の位置にあるレジストリキーの中から、新環境に引き継ぎたいアプリの設定をエクスポートする。
      • HKEY_USERS\old-(username)\Software
      • HKEY_USERS\old-software
      • HKEY_USERS\old-software\WOW6432Node
    5. エクスポートした.regファイルをテキストエディタで開き、以下のように置換する。
      • HKEY_USERS\old-(username)HKEY_CURRENT_USER
      • HKEY_USERS\old-softwareHKEY_LOCAL_MACHINE\Software
    6. .regファイルをダブルクリックしてインポートする。

    他にもエロゲーとかC:\Program Files (x86)以下やC:\以下にデータを保存するお行儀の悪いアプリがあるので、それらも適宜いい感じに移行してあげるとよいでしょう。僕はこの方法で少なくとも以下のアプリの設定を引き継げています。

    こういう引き継ぎ方をしやすいように、ここ2〜3世代くらいは以下のことに普段から気をつけてる。

    • アプリのインストール先は基本的に変えない。
    • データの置き場所も変えない。ユーザーのホーム以下か、C:\Users\Public 以下に置く。
    • ユーティリティの類はなるべく使わない。OSの環境自体のカスタマイズはなるべくしない。

    中学高校の頃に中二病こじらせてアプリのインストール先(起動ドライブは空きを多くとりたい→なら別のドライブにインストール!)やらデータの置き場所(起動ドライブは空きを以下略)やら壁紙やらテーマやらカスタマイズしすぎた結果、移行の度にやれあれができなくなっただのこの設定がなくなっただのとイライラする羽目になったので、「できない事をしようとしない。靴に足を合わせる。自分でこうしたいと思って変えたものは、再現できないとストレスがものすごいが、唯々諾々と受け入れて慣れただけのものは、思い入れが無いから楽に忘れられる。」というデフォルト設定順応派にすっかり改宗してしまったのです。

    でもそもそもの話、こういう乱暴な移行の仕方を真似するのはおすすめしません。非正規の方法を取って起こるあらゆるトラブルよりも、正規の手順でアプリの設定やデータをちまちま引き継ぐ手間の方が死ぬほど辛い、起こるトラブルは気合いで解決する、という本末転倒な事に陥っても構わない僕のような近視眼的な人以外は、真面目に普通に設定を移行した方がいいと思います。僕も、再設定が面倒でなかった以下の物は普通に入れ直して設定もやり直しました。

    • Git for Windows
    • TortoiseGit
    • Dropbox

    ラズパイに繋いでたディスクが死んだようです - Feb 28, 2017

    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のログイン画面まで辿り着けました。でもこれだけ復活しても、記憶を全部なくした抜け殻みたいなもんだからあんまり意味無い……

    Ubuntu 14.04LTSからUbuntu 16.04LTSにアップグレードした時にやったこと - Aug 31, 2016

    Let's note CF-SX3をUbuntu 14.04LTSで使ってたんだけど、16.04LTSへのアップグレードではこういう所で詰まりましたという話。

    /var/run の修正

    ATOK X3を使っていたUbuntu 14.04LTSから16.04LTSにアップグレードしたら、ネットワークに繋がらなくなった。 これは、Ubuntu 16.04でATOK X3を使うに記載がある「ATOK X3のインストールスクリプトが/var/runを壊す」という問題がこのバージョンで表面化したせいだった。

    リンク先の記事では正常な環境で新規にATOK X3をインストールする場合について書かれてるけど、既に過去のバージョンでATOK X3をインストールしていた場合 /var/run が既に壊れた状態になっていて、しかもロックがかかっていてそのままでは手の施しようがない。なのでリカバリモードで強制的に修正する。

    1. Ubuntuを再起動する。
    2. GRUBのメニューで「Advanced options for Ubuntu」を選択して、Ubuntuの詳細な起動オプション一覧を出す。
    3. 「(recovery mode)」と末尾に記載されている項目を選択して実行、起動する。
    4. しばらく待つとリカバリモードのメニューが表示される。自分の環境では文字化けしてメニューを読めなかったが、「root」という項目を選択してEnterするとrootでログインできるので、そうする。
    5. ls /var/runls /runを実行し、それぞれの結果を比較する。両者が同一なら問題ないが、内容が異なっている場合、その環境は壊れているので次のステップに進む。
    6. 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を消す。

    7. ln -s /run /var/runを実行し、/var/runを/runへのシンボリックリンクにする。
    8. exitでログアウトする。
    9. Ctrl-Shift-Deleteで再起動する。

    以上の手順で、壊れた/var/runを正常な状態に戻す事ができた。 ATOK X3を使っていなかった環境ではこの作業は不要です。

    ATOK X3の導入(64bit)

    Ubuntu 16.04でATOK X3を使うという記事に色々情報がある。ただ、環境の違いのせいか、自分の環境ではそのままではうまくいかなかった。また、一部の手順はUbuntu 14.04 LTSをインストールした直後に行う設定という別のページを参照するように書いてある。全部転記すると余計に訳が分からなくなりそうなので、適宜リンク先を参照する前提で手順をまとめる。

    1. 必要なパッケージをインストールする。リンク先の記事でも同様の手順があるが、そこに書かれていないパッケージが必要になるので先に入れておく。

      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」というエラーが出ていて、このメッセージを検索した所、同様のエラーで詰まっている事例複数見つかったので、それらの事例で解決策として紹介されていた手順に従った。

    2. Ubuntu 14.04 LTSをインストールした直後に行う設定の手順に従ってATOK X3と修正パッチ群をインストールする。ただし、この時以下の手順だけは飛ばす
      • 手順の中での再起動。ATOK X3のインストールスクリプトが環境を壊すため、そのまま再起動するとネットワークに繋がらなくなるなど色々問題が起こる。再起動はこの後最後に1回だけやれば十分なので、ここでは再起動せずに続ける。
      • 「そのままだと起動にやや問題があるので〜」という箇所で作成するように書かれている「~/.config/autostart/atok.desktop」は作成しない。
      • IIIMFステータス非表示ツールの設定手順の中で「/etc/X11/xinit/xinput.d/iiimf」の末尾に/opt/atokx3/sample/iiimf_status_hideと追記する手順があるが、これも飛ばす。(ここに書いても期待通りの結果は得られなかった)
    3. Ubuntu 16.04でATOK X3を使うの「変更点1」「変更点2」「変更点3」に書かれている手順を実施する。特に「変更点1」は忘れるとネットワークに繋がらなくなるので絶対に忘れないように。
    4. 上記「変更点3」で作成したファイル「~/.xinputrc」の末尾に、さらに以下の2行を書き足す。

      /opt/atokx3/bin/atokx3start.sh
      /opt/atokx3/sample/iiimf_status_hide
      

      これをやっておかないと、ウィンドウの左下のインジケータがいつまでも出るとか、ATOK X3が起動せずATOKパネルが表示されないとかの問題が起こる。

    5. GNOMEの既定の配色でツールチップが黒背景・白文字になっているが、この状態だとATOK X3の補完候補のツールチップ等が「黒背景・濃いグレーの文字」になって読みにくいため、以下のファイルを管理者権限で編集して配色を変える。

      • /usr/share/themes/Ambiance/gtk-2.0/gtkrc
        • tooltip_bg_color:#000000tooltip_bg_color:#f5f5b5 にする
        • tooltip_bg_color:#fffffftooltip_fg_color:#000000 にする
      • /usr/share/themes/Ambiance/gtk-3.0/settings.ini
        • tooltip_bg_color:#000000tooltip_bg_color:#f5f5b5 にする
        • tooltip_bg_color:#fffffftooltip_fg_color:#000000 にする
      • /usr/share/themes/Ambiance/gtk-3.0/gtk-main.css
        • 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"
      
    6. システムを再起動する。

    以上の手順で、Firefoxやgeditなどでは問題なく日本語入力できるようになった。

    ただ、Linux版SkypeのようなQtアプリや、Wine上で動かしてるWindowsアプリでは、日本語入力ができなくなってしまった(以前はibus-mozcで一応は入力できる状態だった)。 これは解決の方法が無いっぽくてお手上げです……

    ホットキーで画面の明るさを変えられるようにする

    ホットキー(Fn+ファンクションキー)でというか、そもそもUbuntu上で画面の輝度を変えられなくなっていた。Ubuntuの画面の明るさの調整を有効にする - ’s blogによると、これはGRUBの設定を変更すればいいようだった。 リンク先のページの後半にある通りにやったらホットキーが機能するようになった。

    1. sudo vim /etc/default/grub のようにしてファイルを開く。
    2. GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"とある箇所をGRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_backlight=vendor acpi_osi="に書き換える。
    3. 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に詳しい情報がある。

    何かあったらまた追記するかも。

    ラズパイにCPUパワー使う処理はやらせるもんじゃない(バックアップの試みの失敗について) - Aug 13, 2015

    Raspberry Piと外付けHDDでNASっぽい運用をしようとしてた件だけど、使い回そうとしてたバルクのHDD(SATA→USBの変換アダプタで外付け化した)が壊れたのか元から初期不良だったのか全然安定しなくて、結局、バッファロー製の外付けHDDとして売られてる製品(バックアップ領域用に使ってるのと同じ3TBのモデル)を買い足してそっちをメインに使う事にした。バルクのHDDはWindowsに繋いでもOS巻き込んで落ちる惨状なので、全く使えない。1万円強を無駄にしてしまった……落ち込むわ……

    ともかく、やっと安定して動くようになってきたので満を持して duplicityを使って差分バックアップをやってみたんだけど、1TB未満のフルバックアップで5788分……丸4日、その直後の差分バックアップでも3411分……2日半ほどかかってしまった。duplicityは何やら色々凝ったことをしているっぽく、ただのI/O待ちのせいというわけでもないようで、ほんとにCPU時間がそれだけかかってた。Raspberry Piは低消費電力が売りのCPUでその分計算能力はそれほど高いわけではないっぽいというのはぼんやりと把握してたけど、ここまでかかるとは正直想像してなかった。これでは毎日の自動バックアップには使えない。

    というわけで、どうしたものかと悩んでいる。rsyncでもミラーリング先をローテーションすれば最大2世代のバックアップは取っておけそうなんだけど。メインのHDDの使用率が50%を超えてしまったら複数世代バックアップはできなくなるなあ……と思うと、それで行こう!と割り切れずにいる。

    duplicityを使ったバックアップを支援するスクリプト(実験中) - Jul 05, 2015

    差分バックアップをやりたくて、でも自分であれこれ考えて作るのしんどいわって思って、UbuntuデフォルトのバックアップツールのDeja Dupを試してみてたんだけど、こいつはデスクトップ環境にログインしてないと動かないという制限がある。

    Deja Dup自体はduplicityというコマンドラインツールのフロントエンドに過ぎないのでそっちを直接実行すればいいらしい、という事までは知ってたんだけど、なんかオプションがめっちゃ多くてやる気萎える感じだったので、諦めてしまってた。

    ラズパイを使ったファイルサーバーでも、バックアップ態勢を確立するにあたってまたDeja Dup頼みかなあと思いながら試してみてたんだけど、なにげなくtopの画面眺めてたらduplicityのコマンド列(Deja Dupがいい感じにオプション指定を組み立てた状態の物)が出ていて、なんだこれコピペすればいいんじゃん!と思って、それを足がかりにして簡単なスクリプトを書いてみた。

    #!/bin/bash
    
    # バックアップの保存先
    destination=/mnt/backup-external/backup
    # バックアップに含める物、含めない物
    includes="/root /etc /mnt/main-external"
    excludes="/root/.cache /mnt/main-external/home/piro/.cache"
    
    # アクセス権がらみのトラブルを避けるために、root以外での実行は禁止する
    if [ "$EUID" != "0" ]; then
      echo "You must run this script as the root."
      exit 1
    fi
    
    # root直下でバックアップ対象以外のディレクトリはバックアップ対象から除外
    for dir in /*
    do
      if echo " $includes " | grep -v " $dir "
      then
        excludes="$excludes $dir"
      fi
    done
    
    echo "includes: $includes"
    echo "excludes: $excludes"
    
    mkdir -p $destination/archive
    mkdir -p $destination/data
    
    # duplicityのオプションを組み立てる
    
    include_options=""
    for include_target in $includes
    do
      include_options="$include_options --include=$include_target"
    done
    
    exclude_options=""
    for exclude_target in $excludes
    do
      exclude_options="$exclude_options --exclude=$exclude_target"
    done
    
    other_options="--gio --volsize=50 --no-encryption --verbosity=9 --gpg-options=--no-use-agent --tempdir=/tmp \
      --archive-dir=$destination/archive \
      / file://$destination/data"
    
    # 差分実行
    time duplicity incremental $include_options $exclude_options $other_options
    
    # 失敗したら、フルバックアップにフォールバック
    if [ $? != 0 ]
    then
      time duplicity full $include_options $exclude_options $other_options
    fi
    

    うまくいったら、rootのcronjobに指定しておこうと思う。

    Page 1/243: 1 2 3 4 5 6 7 8 9 »

    Powered by blosxom 2.0 + starter kit
    Home

    カテゴリ一覧

    過去の記事

    1999.2~2005.8

    最近のつぶやき