タグ: QNAP

QNAP上のファイル名の文字化けを直す

文字コードをUTF8で運用しているQNAP NAS上に、文字コードがSJISの状態で日本語ファイル名のファイルがアップロードされたため、文字化けしたファイル名(フォルダ名)を修正する

準備

概要

文字化けを起こしたファイルのリネーム方法 – Qiitaに沿って修正します。

文字化け前のファイル名を知りたいため、iconvでのファイル名確認を追加しました。

  1. lsコマンドで対象ファイル(フォルダ)のinode番号を確認
  2. iconvコマンドで元のファイル名を確認
  3. findコマンドの-inumオプションで1で確認した番号でファイルを指定し、-execオプションを使いmvでリネーム

しかしQNAPのシェルでは、

  • iconvコマンドがない
  • findコマンドの-inumオプションない

という状況のため、解決法として、NASなどの組み込みデバイス向けソフトウェアリポジトリのEntwareを使い、findとiconvをインストールしそれを利用するようにします。

Entwareインストール

  1. EntwareのInstall on QNAP NASにアクセスし、this package for standard installationのリンクからQPKGファイルをダウンロード
  2. QNAPの管理画面を開く
  3. AppCenterを開き右上の歯車(設定)をクリック AppCenterを開いたとき
  4. 手動でインストールから参照を選択し、1でダウンロードしたQPKGファイルを指定する。インストールボタンを押下してインストール パッケージの手動インストール
  5. 正常にインストールするとマイアプリに表示される Entwareインストール後

findutilsとiconvをインストール

  1. QNAPにSSHで接続(文字コードはUTF-8)
  2. Entwareのパッケージ管理コマンドのopkgコマンドを使用してfindutilsとiconvをインストール
    [~] # opkg install findutils iconv
    

文字化け修正

  1. lsコマンドで対象ファイル(フォルダ)のinode番号を確認
        [/share/homes/sample] # ls -li
        50528266 lrwxrwxrwx    1 admin    administ        31 Jun  4 17:41 @Recycle -> /share/homes/@Recycle/sample/
        50528923 -rw-rw-rw-    1 sample   everyone       161 Jun  4 17:41 ??{??t?@?C????.txt
        

    文字化けファイル名のファイルのinode番号が50528923であることを確認

  2. iconvコマンドで元のファイル名を確認
        [/share/homes/sample] # ls -li|iconv -f SJIS -t UTF-8
        50528266 lrwxrwxrwx    1 admin    administ        31 Jun  4 17:41 @Recycle -> /share/homes/@Recycle/sample/
        50528923 -rw-rw-rw-    1 sample   everyone       161 Jun  4 17:41 日本語ファイル名.txt
        
  3. findコマンドの-inumオプションで1で確認した番号でファイルを指定し、-execオプションを使いmvでリネーム
            [/share/homes/sample] # find . -inum 50528923 -ok mv '{}' "日本語ファイル名.txt" \;
            < mv ... ./??{??t?@?C????.txt > ? y
        
  4. リネーム結果を確認
        [/share/homes/sample] # ls -li
        50528266 lrwxrwxrwx    1 admin    administ        31 Jun  4 17:41 @Recycle -> /share/homes/@Recycle/sample/
        50528923 -rw-rw-rw-    1 sample   everyone       161 Jun  4 17:41 日本語ファイル名.txt
        

リネームする対象が多いとき

  1. awkを使ってコマンド文字列を生成
    ls -il|iconv -f Shift_JIS -t UTF-8 |awk -v q=\'  '{print "yes\|find . -inum "$1" -ok mv "q"{}"q" "q$10q" \\;"}'
    

    出力結果

    yes|find . -inum 61801127 -ok mv '{}' '日本語ファイル名1.jpg' \;
    yes|find . -inum 61801128 -ok mv '{}' '日本語ファイル名2.jpg' \;
    yes|find . -inum 61801129 -ok mv '{}' '日本語ファイル名3.jpg' \;
    :
    :
    :
    :
    
  2. (生成されたコマンドに問題なければ)生成した文字列を実行していく

参考

広告

QNAP TS-469Lをmackerelを使ってモニタリングする

QNAPのNAS「TS-469L」をmackerelでモニタリングする。

TS-496Lのディスク使用推移や残量などを収集しグラフで見られるようにしたいと思い、検索したところ、mackerelを使うことにしました。

mackerelはエージェントプログラムを対象となるサーバで動作させ、情報収集し、結果をサーバに送るタイプのもので、CentOSやUbuntu、Windowsを対象にしています。→サポート動作環境

QNAPのOSはCentOSやUbuntuと同じく、Linuxですが、独自のディストリビューションになっており、dfコマンドやunameコマンドのオプションに違いがあるため、公式のエージェントプログラムはそのまま動きません。

そのため、何ら頭の手を加える必要があるのですが、すでにQNAPのNAS上でエージェントプログラムを動かしている先人がいらっしゃいました。

この記事では、VirtualBoxの仮想環境をvagrantで作成し、その上にDockerでmackerel-agentのビルド環境を構築、ビルドを行います。

0.必要なもの

  • VirtualBox … 作業PCはWindowsですが、mackerel-agentをビルドする都合上Linuxが必要なため、VirtualBoxを使用する
  • Vagrant … VirtualBoxを制御するため
  • GitもしくはSourceTreeなどのGitクライアント … mackerel-agentの取得に
  • SSHクライアント(PuTTYなど) … NAS上で作業するため
  • WinSCPなどのSSH(SCP,SFTP)で転送できるソフト … ビルドしなおしたmackerel-agentをNAS上に転送するため

1. 手順

  1. 作業用ディレクトリの作成

    mackerel-qnapという名前(※フォルダ名は任意)でフォルダを作成。

  2. Vagrantfileの作成

    $script = <<SCRIPT
    apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
    echo 'deb https://apt.dockerproject.org/repo ubuntu-trusty main' > /etc/apt/sources.list.d/docker.list
    apt-get update
    
    apt-get install -y linux-image-extra-$(uname -r)
    apt-get install -y docker-engine
    usermod -aG docker vagrant
    SCRIPT
    
    Vagrant.configure(2) do |config|
      config.vm.box = "ubuntu/trusty64"
      config.vm.provision "shell", inline: $script
    end
    
  3. mackerel-agentのダウンロード

    作業ディレクトリに mackerel-agent をGitでクローン

  4. Dockerfileの作成

    作業ディレクトリ直下にDockerfileというファイル名でファイルを作成

    FROM golang:1.5
    
    RUN mkdir -p /go/src/github.com/mackerelio
    ADD ./mackerel-agent /go/src/github.com/mackerelio/mackerel-agent
    WORKDIR /go/src/github.com/mackerelio/mackerel-agent
    RUN make deps
    CMD bash -c "GOOS=linux GOARCH=amd64 GOARM=5 CGO_ENABLED=0 make build && cp ./build/mackerel-agent /host/_mackerel-agent"
    
  5. ディレクトリ構成の確認

    この時点でのディレクトリ構成は

    mackerel-qnapnas-build/
        mackerel-agent/
        build.sh
        Dockerfile
        provision.sh
        Readme.md
        Vagrantfile
    
  6. 仮想サーバの起動

    vagrant upでサーバを起動する

  7. コンテナのビルド

    仮想サーバが起動したらvagrant sshで仮想サーバ内にログイン、コンテナを起動時ビルドを実行する

    cd /vagrant
    docker build -t mackerel-agent .
    
  8. コンテナの起動、mackerel-agentのビルド
    cd /vagrant
    docker run -v "$(pwd)":/host mackerel-agent
    

    コンテナが正常に起動すると、ビルドが始まり成果物が_mackerel-agentという名前で作業ディレクトリに生成される

2. mackerel-agentの設置と起動

  1. NASにadminでSSHログイン

  2. mackerel-agentのダウンロードや収集データ送信時でのhttps通信のために証明書を設置する

    wget http://curl.haxx.se/ca/cacert.pem
    mv cacert.pem /etc/ssl/certs/ca-certificates.crt
    
  3. mackerel-agentをダウンロード、APIキーを設定する

    バイナリファイルで直接mackerel-agentをインストールする – Mackerel ヘルプ

    1. バイナリをダウンロード
      curl -O https://mackerel.io/file/agent/tgz/mackerel-agent-latest.tar.gz
      
    2. 展開
      tar xzf mackerel-agent-latest.tar.gz
      cd mackerel-agent
      
    3. ackerel-agent.confを編集して、APIキーを設定
      vi mackerel-agent.conf
      
      # apikey = "" の行の行頭の#を削除して、apikeyの値をセットする
      
  4. 生成した_mackerel-agentを転送し、mackerel-agentと置き換える
    mv _mackerel-agent mackerel-agent
    chmod +x mackerel-agent
    
  5. mackerel-agentを起動して、ホストが登録されることを確認する
    ./mackerel-agent --conf=./mackerel-agent.conf
    

    正常に起動できていれば、makerelにNASのサーバ名でホストが表示される。

  6. バックグラウンドで動作させるため、起動ファイルを作成する

    vi mackerel-agent.sh

    #!/bin/bash
    
    DAEMON_MGR="/sbin/daemon_mgr"
    NAME=mackerel-agent
    PROG=/root/mackerel-agent/mackerel-agent
    CONF=/root/mackerel-agent/mackerel-agent.conf
    
    case "$1" in
        start)
            mypid=`/bin/pidof $NAME`
            if [ ! -z $mypid ]; then
                    exit 1
            else
                echo -n "Starting mackerel agent: "
                $DAEMON_MGR $NAME start "$PROG --conf=$CONF &amp;"
                exit 0
            fi
            ;;
        stop)
            echo -n "Stopping mackerel agent: "
            $DAEMON_MGR $NAME stop "$PROG"
            echo
            ;;
        *)
            echo "Usage: $1 start|stop"
            exit 1
            ;;
    esac
    
    exit 0
    

    ※PROG,CONFはmackerel-agentを設置しているパスに適宜変更する

    起動:mackerel-agent.sh start
    停止:mackerel-agent.sh stop

メモ

ビルド手順のファイルをまとめたものをここで公開しています。

  • TS-210対応

    TS-210のCPUはMarvell製で、TS-469LのCPUであるInterlのAtomとは違うが、ビルドオプションを変更するだけで利用できる

    変更内容:Dockerfile内のGOARCHをamd64からarmに変更する