「Linux」カテゴリーアーカイブ

Let’s Encryptから証明書を取得して常時HTTPS化

  • Let’ EncryptからHTTPS(暗号化)通信に必要な証明書を無料で発行してもらいました。
  • HTTPSが有効になるようにApacheの設定を変更して、暗号化されていることを示す鍵アイコンが表示されることを確認しました。
  • HTTPでのリクエストをHTTPSに転送して常時HTTPS化しました。
  • HTTPSの証明書には有効期限があるので、自動的に更新できるようにしました。

  • 証明書の取得
  • Apacheの設定
  • 証明書の自動更新

HTTPSはWebの通信を暗号化するために使われていると一般的には思われています。しかし実際には暗号化だけでなく、Webサイトを運営する会社・組織の身元を保証する1ためにも使われています。

そのため身元を保証してもらいたい会社・組織は審査を受ける必要が有り、時間とそれなりのお金をかけて証明書を発行してもらっていました。その結果としてユーザは安心してオンラインで買い物をしたり預金を確認できます。

一方、身元の保証は必要なく単純に安全な通信のためにHTTPSを使いたいという場合には、これまでのやり方は非常に手間がかかりハードルが高いものです。そこで誰でもHTTPSの暗号化機能を手軽に使えるようにするためLet’ Encryptプロジェクトが、Webサイトの身元は保証しないけど暗号化に使用できる証明書を機械的かつ無料で発行する実験が開始されました。

会社・組織の身元保証が無いので商業利用向きではありませんが、個人のWebサーバでも簡単にHTTPSを使って安全な通信を行えるようになりました。

ここではHTTPSに必要な証明書の取得方法からサーバの設定、証明書の更新方法について説明します。

証明書の取得

HTTPSの証明書は、専用のプログラムletsencryptを使用して取得します。

letsencryptをインストール

letsencryptは、Debianなどパッケージとして配布されている場合も有りますが、Ubuntuではまだパッケージになっていなのでgitコマンドを使ってプログラムを取得します2

$ sudo apt-get install git # gitをまずインストールする。
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt

HTTPSの証明書を取得

letsencrypt-autoコマンドを実行してHTTPSの証明書を取得します。

WebサーバにApacheを使用している場合は、次のコマンドを実行します3

ただしこのコマンドを実行するとサーバが一時的に停止します。ダウンタイムを最小にするには、--apacheの代わりに--webrootオプション(webroot mode)を使用します4

$ ./letsencrypt-auto --apache

実行すると必要なパッケージがインストールされ、証明書を取得するために必要な質問をいくつかされます。質問に答えてしばらく(1分程度)待つとHTTPS証明書が/etc/letsencrupt/live/に保存されます。

もしかすると、証明書を取得するときにHTTPSポートが開いている必要があったかもしれません。その場合は、次の「HTTPSポート(443)を公開」を参照してください。

証明書を取得するときに質問される項目は次の3つです。

  1. 現在のApacheがホストしているドメインの内で証明書に含めるドメイン名。
  2. 連絡先のメールアドレス。
  3. Let’s Encryptを使用するための決まりに同意するか。

1.で選択したドメイン名は、全て同じ証明書を使ってHTTPS通信が行えます(SAN Certificate?)。また-dオプションで事前に対象のドメイン名を指定しておくことができます。

複数のサーバ名を指定すると「複数のサーバ名はサポートしていない」というようなエラーが表示されますが、問題なく使えています。

2.と3.の質問は、それぞれ--email--agree-tosオプションで事前に指定しておけます。

オプションの詳しい説明は、

$ ./letsencrypt-auto --help all

で取得できます。説明が表示されるのが遅いので、次のようにリダイレクトを使って説明を保存しておくと後で参照しやすくなって便利だと思います。

$ ./letsencrypt-auto --help all > help.txt

--apacheオプションは、証明書の取得の他にインストールもするということですが、具体的に何をしているのか私には分かりませんでした5。Apacheの設定を変えてくれるということもありませんでしたし、インストール機能がないwebrootでも証明書は同じ場所に保存されました。

またletsencrypt-autoを実行すると、/var/log/letsencrypt/letsencrypt.logにログが記録されます。

HTTPSポート(443)を公開

HTTPSで通信するには、HTTPS用のポートに外部からアクセスできる必要が有ります。

HTTPSポートを開くためには、次のルールをiptablesの設定に追加します。既にHTTP用のルールが書かれていると思うので、その後ろあたりに追加するのが良いと思います。また二番目のようにmultiportモジュールを使ってHTTPポートとHTTPSポートをまとめてルールにすることもできます。

iptables -A INPUT -p tcp --syn -m state --state NEW --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --syn -m state --state NEW --dport 443 -j ACCEPT

# or

iptables -A INPUT -p tcp --syn -m state --state NEW -m multiport --dports 80,443 -j ACCEPT

iptablesの設定はサイトを守る上で非常に重要ですので、十分注意してください。

Apacheの設定

HTTPSの証明書を取得できたら、その証明書を使ってHTTPS通信ができるようにApacheの設定を変更します。

SSLモジュールを有効化

HTTPS通信をするには、ApacheのSSLモジュールを有効にします。

次のようにしてSSLモジュールを有効にしますが、もしかするとletsencrypt-auto --apacheが既にモジュールを有効にしているかもしれません。もちろん既にsslモジュールが有効になっているときにこのコマンドを実行してしまっても問題はありません。

$ sudo a2enmod ssl
$ sudo a2ensite default-ssl # optional

a2ensite default-ssl/etc/apache2/sites-enabledにSSL用の雛形default-sslが作成されますが、000-default.confに設定を加えても問題ありません。

Apacheの設定変更

実際にHTTPSで通信するにするには、<VirtualHost *:80/>に加えて<VirtualHost *:443/>を加えます。

例えば、私の場合はVirtualHostなので、次のような内容を設定に追加しました。

<VirtualHost *:443>
    # これまでの設定内容をコピーする。

    SSLEngine		on
    SSLProtocol		all -SSLv2 -SSLv3

    # Apache 2.4.7まで
    SSLCertificateFile    /etc/letsencrypt/live/_MY_DOMAIN_NAME_/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/_MY_DOMAIN_NAME_/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/_MY_DOMAIN_NAME_/chain.pem

    # Apache 2.4.8以降
    # SSLCertificateChainFileが廃止になった。
    #SSLCertificateFile    /etc/letsencrypt/live/_MY_DOMAIN_NAME_/fullchain.pem
    #SSLCertificateKeyFile /etc/letsencrypt/live/_MY_DOMAIN_NAME_/privkey.pem

    # 使用したSSLプロトコルと暗号化方式をログに記録することもできます。
    #CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

その他の設定オプションは、/etc/apache2/sites-available/default-ssl.confを参照して設定に追加します。

また/etc/letsencrypt/options-ssl-apache.confに書かれているようなグローバル設定は、/etc/apache2/mods-enabled/ssl.confで設定します。

設定を変更したら、次のコマンドで設定の書き方に問題がないか確認しておきます。

$ sudo apachectl configtest

SSLで接続できるか確認

Apacheの設定が終わったら、サーバを再起動してHTTPSで接続できるか確認します。

$ sudo service apache2 restart

まずApacheがHTTPSのポートを見ているか確認します。ApacheがHTTPSポートで待っている場合は、次のように表示されます。何も出力がないときはポート番号に間違いがないか設定を再確認してください。

$ ss -lnt | grep 443
LISTEN     0      128                      :::443                     :::*

次にWebブラウザからWebページを開いてみます。この時URLの頭をhttp:からhttps:に変更してページにアクセスします。

Webページを開けない時は、ファイアウォールでHTTPSのポートが閉じられていないか確認してください。

HTTPを転送して常時HTTPS化

常時HTTPS化するかはサイト毎のポリシーですので必須ではありません。

常時HTTPS化するには、HTTPで接続を求めてきたリクエストを全てHTTPSにリダイレクトします。この例ではリダイレクトステータスをR=301で恒久的な移動を示す301にしています。

<VirtualHost *:80>
    ServerName www.nosuz.jp
    LogLevel warn
    #LogLevel warn rewrite:trace8
    CustomLog ${APACHE_LOG_DIR}/access.log
    ErrorLog ${APACHE_LOG_DIR}/error.log
    RewriteEngine On
    RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

アドレスバーの鍵表示

HTTPSでアクセスすると多くのWebブラウザでは、通信が暗号化されていることを鍵アイコンが表示されます。

しかしHTTPSでアクセスしているのに鍵アイコンが表示されないことが有ります。この時は、画像やJavaScriptの読み込みなど一部にHTTPでのアクセスが使われています。

鍵アイコンを表示させるには、ページのソースを開いてhttp://となっている部分を探して、その部分をhttps://またはhtpを削除して単に//と変更します6

証明書の自動更新

Let’s Encryptが発行する証明書の有効期間は90日なので、最低三ヶ月に一度証明書を更新する必要が有ります。もちろんここも人が介在すること無く証明書の更新を自動化できます。

更新処理の自動化にはcronサービスを使用するのが簡単です。例えば次のようなエントリーをrootのcrontabに登録すると、奇数月7の15日3時21分に更新処理が行われます。

21 3 15 */2 * /_PATH_/letsencrypt-auto certonly --text --renew-by-default --webroot -w /var/www-root -d www.example.jp > /var/log/letsencrypt/renew-cert.log 2>1 && service apache2 restart

参照と脚注

  1. Webデザイナーなら知っておくべき サーバ知識相談室

  2. Quick Start Guide – Let’s Encrypt

  3. Ngixサーバの場合は、--ngixオプションが将来使えるようになる予定です。しかし現在は、--webrootオプションを使うなど他の方法で証明書を取得する必要が有ります。

  4. webroot modeを使用すると、起動中のWebサーバを使用して証明書を取得します。そのため多少時間がかかる証明書を取得する過程でもサービスを停止しないですみます。ただしHTTPSを有効にするところでWebサーバの再起動が必要になります。

  5. Plugins – Let’s Encrypt

  6. URLがいきなり//で始まる場合は、現在のプロトコールでそのリソースにアクセスします。そのため<img src='//domain/img.png'>を含むページをHTTPで開いた場合はHTTPでimg.pngを取得し、HTTPSで開いた場合はHTTPSでimg.pngを取得します。

  7. crontabの月は時間や分とスタートが異なり1-12なので、*/2は1-12/*と同じ意味です。よって2で割り切れる順番の月、すなわち0番目1月、2番目3月…と奇数月にcrontabエントリーが実行されます。偶数月ならば、21 3 15 2-12/2 * commandとなります。

Shift JIS(SJIS)をlessのようにページャー表示

lvコマンドを使用すれば、SJISやJISコードのテキストをlessコマンドのようにページャー表示できる。

長いテキストファイルを眺めるには、lessコマンドを使用します。ただしLESSCHARSETで指定した文字コード意外のテキストファイルを表示すると文字化けしてしまいます。

LESSCHARSETが指定されていない場合は、UTF-8が指定されたとみなされます。

SJISなどで書かれたテキストファイルを表示するには、次の例のようにiconvコマンドで変換して表示させることができます。

# SJISで書かれたファイルを表示する。
iconv -f SJIS sjis.txt | less

lvコマンドを使う

たまにであれば、iconvコマンドを使いますが、頻度が高くなってくるとだんだん面倒になってきます。

そんな時にはlvコマンドを使用します。このページャ表示コマンドであれば、SJIS以外にもJIS(ISO-2022-JP)やEUC-JPで書かれたテキストファイルもページャ表示できます。

使える操作コマンドはlessコマンドのより少ないようですが、ページの先頭や最後への移動など基本的な使い方は同じです。

lvコマンドのインストール

Ubuntuにはlvコマンドは初期状態ではインストールされていません。そこで次のようにlvコマンドをインストールする必要が有ります。

sudo apt-get install lv

秘密にしたいファイルを完全に削除する方法

復元されたくないファイルを完全に削除するには、shredコマンドでドライブごとデータを削除する。

ファイルは、普通の操作で削除しても一般的にディレクトリ情報が削除されるだけでデータ自体はハードディスク上に残っています。そのため簡単とは言えませんがデータを復元できる可能性が有ります。実際消した思っていたメールが復元されて賭博の証拠が見つかってしまった事件1が有りました。

犯罪の証拠になりそうなデータはなくとも、誰かに自分のデータを見られるのは気分の良いものではありません。このような場合には、ファイルのデータを復元できないように削除するshredコマンドが役に立ちます。

shredコマンドでファイルを削除

Linux(Ubuntu)には、データを復元できないように削除するshredコマンドが標準でインストールされています。このコマンドを使用することで、ファイルを復元できないよう完全に削除することができます。

shredコマンドは次のように使用します。

shred -uz -n 3 file

これでfileを安全に削除できます。

主なオプションには次のものが有ります。

-n num
ランダムなデータでnum回上書きする。-zオプションを使う場合に、0を指定することでランダムデータの書き込みをスキップできます。
-u
データを上書き後にファイルを削除する。
-v
進行状況を表示する。
-z
最後に0で上書きする。

shredコマンドでの欠点

shredコマンドは、ファイルに上書きする時に記録メディアで元と同じ場所に書き込まれることを前提としています。そのため一部のファイルシステムでは上書きしたはずのデータが残ってしまう可能性が有ります。

ドライブのデータを完全に削除

そこでパソコンを廃棄する場合などは、ファイルレベルではなくファイルシステムに依存しないディスクレベルでデータを削除することをオススメします。

Linuxではドライブもファイルの1つとして扱うことができるので、ファイルの削除と同じようにshredコマンドを使用して完全にデータを削除できます。

# 三回ランダムデータで上書きして、最後に0で上書きする。進行状況の表示付き。
sudo shred -nzv 3 /dev/sdb

# 時間がかかるので、普通のデータならこれで十分かな。
sudo shred -nzv 0 /dev/sdb

この例ではドライブを/dev/sdbとしていますが、環境によってファイル名が異なります。間違ったファイルを指定するとシステムを破壊してしまうので十分に気をつけてください。

ドライブの指定には、/dev/sdbではなく/dev/disk/by-idを使用するとファイル名とドライブの対応付けが分かりやすくファイル名の間違いを防げます。

Windowsのデータを完全に削除

WindowsのデータもドライブとしてみればWindowsもLinuxも違いはありません。

そこでWindowsで使用していたドライブをUbuntu(Linux)システムに接続するか、そのままUbuntuなどのLiveCDを使って起動して、shredコマンドでデータを削除できます。

参照と脚注

CGIプログラムが動かずにソースが表示される

設定は正しいのにCGIプログラムのソースが表示されてしまう原因は、mod_cgiがロードされていなかった。

Apacheを使ったWebサーバを新規にセットアップしたらCGIプログラムが動かないで、そのソースコードが表示されてしまう問題にぶつかりました。

まず最初に考えるのは、設定が間違っているのではないかということです。そこで既に動いているサーバから設定ファイルを持ってきて見ましたが、やはり新規サーバではソースコードが表示される問題が発生していまします。

ググっても有用なページを見つけることができずさんざん悩んでしましました。

仕方なしに一息入れて頭をリセットすると、設定ファイルに現れない設定が間違っていることに気が付きました。

ApacheでCGIを有効にする設定

見落としていたCGI設定のが何であったかという前に、CGIを有効にするApacheの設定を再度確認しておきましょう。

ApacheでCGIを有効にする設定にはに二種類あります1

  1. ScriptAliasを使う。
  2. HandlerとExecCGIを使う。

UbuntuのパッケージでApacheをインストールすると、設定ファイルは/etc/apache2/sites-enabled/000-default.confです。このファイルには最初から<VirtualHost>指定が書き込まれているので、この中にCGIの設定を挿入します。

ScriptAliasを使う。

ScriptAlias /url/ /abs/dir/

とすると、/abs/dirにある実行ファイルが全てCGIプログラムと認識されます。そして/url/cgiにアクセスすると、/abs/dir/cgiが実行されます。

/abs/dirは、通常のファイルとしてアクセスできないようにhtmlのDocumentRoot外に置きます。また/abs/dirの実行ファイルは全てCGIとして実行できてしまうので、CGIスクリプトのバックアップファイルが残っていたりしないよう注意する必要が有ります。

HandlerとExecCGIを使う。

特定の拡張子を持ったファイルのみをCGIプログラムとして実行したいときは、こちらの設定を使用します。

<Directory /var/www/html/cgi-dir>
  AllowOverride None
  Options +ExecCGI
  AddHandler cgi-script .rb .sh
</Directory>

# or

<Location /cgi-dir>
  AllowOverride None
  Options +ExecCGI
  AddHandler cgi-script .rb .sh
</Location>

この設定では、/var/www/html/cgi-dirにある*.rbまたは*.shというファイルがCGIプログラムとして認識されます。

その結果DocumentRootが/var/www/htmlだとすると、/cgi-dir/cgi.rbにアクセスすると/var/www/html/cgi-dir/cgi.rbが実行されます。

Handlerで指定されなかった/var/www/html/cgi-dirにあるファイルは、CGIプログラムとして実行されることはありません。しかし通常のファイルとしてアクセスすることが可能ですので、CGIスクリプトのバックアップファイルなどCGIプログラム以外のファイルを置かないように注意する必要が有ります。

500 Internal Server Error

Internal Server Errorと表示されるときには、次の点を確認します。

  • CGIプログラムにアクセスするURLに間違いがないか。
  • CGIプログラムの実行フラッグ(x)がセットされているか。
  • CGIプログラムにエラーがあって異常終了していないか。

CGIスクリプトが動かないでソースが表示されるときには、設定が間違っていてCGIプログラムと認識されていませんので、設定ファイルをもう一度確認します。

見落としがちなCGIを有効にする設定

設定ファイルに絶対間違いはないのにCGIプログラムが動かず、そのソースが表示されるときにはどうしたら良いんだろう?

その場合は、ApacheにCGIを実行するモジュールが組み込まれているか確認します。

$ sudo apache2ctl -M|grep cgi
 cgi_module (shared)

このコマンドでcgi_moduleが表示されない時には、ApacheにCGIモジュールが組み込まれていません。

UbuntuのApacheパッケージでCGIモジュールを読みこませるには、/etc/apache2/mods-available/cgi.loadmods-enabledにコピーまたはリンクを作成します。

$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/cgi.load .
$ ls -l | grep cgi
lrwxrwxrwx 1 root root 26 11月  3 11:58 cgi.load -> ../mods-available/cgi.load

これでApacheを再起動するとCGIプログラムが動くようになるはずです。

参照と注釈

  1. Apache Tutorial: CGI による動的コンテンツ – Apache2.0
    Apache2.0のドキュメントを参照したのが悪かった。最新のマニュアルを参照していれば、最初にmod_cgiをロードするように注意書きがあってハマることはなかった。

複数サイズのfaviconを作成するワンライナー

convertコマンドの-cloneオプションを使えばワンライナーでマルチサイズfaviconを作成できる。

以前faviconを作成する方法を書きました1が、convertコマンドの-cloneオプションを使えば、もっと簡単に複数サイズのデータを持ったicoファイルを作成できる2ことがわかりました。

faviconをワンライナーで作成

アイコンの元となる画像をfavicon.pngだとすると、次のコマンド一発で複数サイズfavicon.icoを作成できます3

convert favicon.png \
	\( -clone 0 -resize 16x16 \) \
	\( -clone 0 -resize 32x32 \) \
	\( -clone 0 -resize 48x48 \) \
	\( -clone 0 -resize 150x150 \) \
	-delete 0 favicon.ico

注意:シェルが解釈しないようにするため括弧をバックスラッシュ(円記号)でエスケープする。

このワンライナーが何をしているかというと…

  1. favicon.pngをlayer 0に読み込む。
  2. 括弧内を処理して、その結果を新しいlayerに置く。
  3. 括弧内では、-clone 0でlayer 0すなわちfavicon.pngをコピーして指定のサイズに縮小する。
  4. layer 0の元画像を削除して、favicon.icoに合成する。

色数を制限したいときには、-colorsオプションを加えます。例えば-colors 256とすると、256色に制限できます。

参照と注釈

UbuntuにKiCad 4.0をインストール

KiCad 4.0はUbuntuの標準パッケージには含まれていないのでPPAからインストールする。

KiCadは、Ubuntu 14.04と15.04の標準パッケージに登録されています。ただしこのパッケージのKiCadは、まもなく公開される予定の版に比べてかなり古い版です。そのためまもなく公開されるというKiCad 4.0で使用できる便利な機能がいろいろ使えません1

これからKiCadをUbuntuで使用するのであれば、KiCad 4.0をPPAからインストールすることをオススメします。また今月末に公開予定のUbuntu 15.10では、KiCadが標準パッケージに含まれなくなったかもしれません2。これが間違いでないとすると、Ubuntu 15.10(wily)でKiCadを使うにはPPAからインストールするしか選択肢はありません。

まだリリース前で動作が不安定かもと思われがちですが、約一年開発版を使い続けてきた感じでは確かにちょっと不安定になったことも有りますが要所要所で保存操作を忘れなければ得られるメリットのほうが大きかったです。

KiCad 4.0のインストール

KiCad 4.0のインストールには、ソースからビルドする方法とPPAからパッケージをインストールする方法の二通りが有ります。ここでは最初にPPAを使ったインストール方法を説明します。普通はこの方法で十分ですが、オプション設定を変えたい場合に必要なソースからビルドする方法も説明します。

KiCad 4.0をPPAからインストール

KiCadのPPAパッケージには、PPA for KiCad daily buildsを使用します。

インストールする方法は次のとおりです。

# 4.0のリリース版をインストールするとき。
$ sudo add-apt-repository ppa:js-reynaud/kicad-4

or

# 開発版(daily build)をインストールするとき。
$ sudo add-apt-repository ppa:js-reynaud/ppa-kicad

# 以下は4.0でも開発版でも共通
$ sudo apt-get update
# メニュー等を日本度で表示するためには、kicadだけでなくkicad-locale-jaも必要。
$ sudo apt-get install kicad kicad-locale-ja

必要な環境変数も自動で設定されるはずですが、一応確認しておきます。

$ env | grep KIGITHUB
KIGITHUB=https://github.com/KiCad

KiCad 4.0をソースからインストール

KiCad 4.0をソースからインストールすることも簡単ですが、ソースファイルのダウンロードとコンパイルに非常に時間がかかります。そのことを覚悟してとりかかる必要が有ります。

ソースからインストールすると言ってもインストール用のスクリプトが用意されているので、それを実行するだけです。

  1. インストールスクリプトをダウンロードする。
  2. (オプション)インストールスクリプトのオプション設定を変更する。
  3. インストールスクリプトを実行する3。このスクリプトを実行するだけで、ソースファイルのダウンロードからコンパイルとインストールまで自動的に実行されます。
    $ sh kicad-install.sh --install-or-update
    

    途中必要なパッケージやKiCadの各プログラムをインストールするために管理者権限が必要になるので、sudoによるパスワードの入力が求められます。

参照

  1. KiCad 4.0で加わった便利な機能を使うにはOpenGLが必須ですが、cairo表示を使うことで少しもっさりとはしますが同じ機能を使用することができます。

  2. Ubuntuパッケージの検索検索結果にUbuntu 15.10(wily)向けのkicadパッケージが見つかりません。kicad を名前に含むパッケージ

  3. バージョン管理システムからソースを持ってくるので、ソースを全く持っていない最初は特にソースのダウンロードに時間がかかります。

org.kde.klauncher5 was not provided

Ubuntu 15.10にアップグレードしたら`kdenlive`でクリップを追加しようとすると「The name org.kde.klauncher5 was not provided by any .service files」というメッセージが表示されてファイルを選択できなくなった。解決にはkinitパッケージをインストールする。

(2015-10-15)この問題は、kdenliveが依存しているkioの問題であった。bug reportを送った直後に同じ内容のbug reportが提出され問題は修正された7

いくつかの動画の編集ソフトを試したところ、私にはkdenliveがしっくりきました。kdenliveは名前からわかるようにデスクトップ環境KDE1のアプリケーションです。Ubuntuは別のデスクトップ環境であるGNOME2が標準ですが、KDEアプリケーションも問題なく使用できます。3

最新のUbuntuはUbuntu 15.04(vivid)ですが、まもなくUbuntu 15.10(wily)が公開される予定4です。そこで一足早く15.10を試してみようとUbuntu 15.04からUbuntu 15.10 betaにアップグレードしたらkdenliveにエラーが発生するようになってしまいました。

Ubuntu 15.10でkdenliveに問題発生

編集したい動画ファイルは「Project」メニューの「Add clip」を選択して、表示されるダイアログでファイルを選択します。しかしUbuntu 15.10にアップグレードしたら次のエラーが表示されて動画ファイルを追加できなくなってしまいました。5

プロセス klauncher と通信できません: The name org.kde.klauncher5 was not provided by any .service files を開始できませんでした。

kdenlive-error

kinitパッケージが必要

誰か同じ問題にぶつかって解決策がないかとエラーメッセージ「org.kde.klauncher5 was not provided by any .service files」をキーワードとしてググったところ、Ubuntuのバージョンは違うもののぴったりなページ6が見つかりました。

このMenachemさんによるとklauncherはkinitパッケージに含まれており、このパッケージをインストールすれば解決するとこのことでした。

そこで次のようにkinitパッケージをインストールしました。

$ sudo apt-get install kinit

するとクリップの追加で表示されていたエラーメッセージがなくなり、動画ファイルを選択できるようになりました。

またkinitの他にkioパッケージが必要だった6とのことですが、dpkg -l|grep kioしてみたところ、kdenliveをインストールした時にkioパッケージがインストールされていました。

参照

  1. KDE –Wikipedia

  2. GNOME – Wikipedia

  3. KDEとGNOMEのアプリケーションは共存して使用することができます。ただし同じデスクトップ環境間では可能なファイルのドラッグ・アンド・ドロップによる受け渡しなど連携はできないかもしれません。

  4. Ubuntu 15.10(wily)は、2015年10月22日公開の予定です。Wily Werewolf Release Schedule

  5. kdenliveで動画ファイルを追加できなくなったのはUbuntu 15.10のベータ版での話です。バグレポートも送っているので、この問題は公開までには修正されていると思います。

  6. Problem with KDE programs after upgrading to 15.04 – ask ubuntu

  7. 後から提出されたbug reportはすぐに修正されて、私のbug repotが放置ってなんだか悔しい。分かりやすく書いたつもりだけど、レポートのフォーマットに則している方が強いな。

Webブラウザのタブにオリジナルアイコンを表示

アイコン画像(16px X 16pxと32px X 32px)を用意して、GIMPまたはnetpbmを使用してfavicon.icoを作成する。作成したファイルをWebページのトップディレクトリーに保存する。

WebページをChromeなどで表示すると、タブやアドレスバーにサイト独自のアイコン(favicon)が表示されます。このサイトでも使用しているWordpressは、インストールしただけではfaviconが表示されません。そこでWordpressを使用したサイトでfaviconを表示するようにしてしてみました。

faviconとは

faviconを簡単に説明する1と、もともとは名前から想像できるようにMicrosoft Internel Explorer(IE)の「お気に入り」に登録された時に表示されるデコレーションアイコンでした。それが時代を経て現在のブラウザーでは、サイトを識別しやすいようにタブやアドレスバーにも表示されるようになりました。

favcionはIEの独自機能であったためにfaviconは標準化されていませんが、全てのブラウザーがWindowsのアイコンファイル形式(*.ico)をサポートしています。現在はWindowsアイコンファイルの他に、多くのブラウザーでGIPとPNG形式も使用できます2

しかしあえてGIFやPNGを選択する必要もないので、ここでは全てのブラウザーで表示できるWindowsアイコンファイルのfavicon.icoを作成します。

Linux環境でfaviconを作成

faviconを作成するWebサービスも有りますが、Linux(Ubuntu)環境で使用できるGIMPとnetpbmを使ってfaviconの作成方法を作成しました。

アイコン画像の準備

まずアイコンに使用する16×16ピクセルと32×32ピクセルのアイコン画像を用意します。アイコンの元となる画像がある場合は、GIMPやimagemagickパッケージのconvertなどで縮小します。

機械的に縮小したファイルをそのまま使うのでなく、すこし修正したほうが選り見やすいアイコンになります。絵心の必要な作業なので、機械的に縮小したものを使って不満があったら修正する程度で良いかと思います。

GIMPを利用してfaviconを作成

まずGIMPをインストールし、GIMPを起動します。

$ sudo apt-get install gimp
$ gimp &

GIMPを起動させたら、次のようにしてfavicon.icoを作成します。

  1. 「File」メニューの「Open…」を選択して、縮小した画像ファイルを開きます。GIMP-open
  2. 「File」メニューの「Open as Layers…」を選択して、残りの縮小した画像ファイルを開きます。GIMP-open-layers
  3. 「File」メニューの「Export AS …」を選択して、Export Imageダイアログを開きます。
  4. 表示されたダイアログの下の方に「Select File Type」があるので、「By Extension」または「Microsoft Windows icon」になっていることを確認します。GIMP-export
  5. Nameをfavicon.icoとして、「Export」ボタンをクリックしてアイコンファイルを保存します。

コマンドラインからfaviconを作成

コマンドラインからfaviconを作成するには、netpbmパッケージに含まれるコマンドを使用します。

$ sudo apt-get install netpbm

$ ppmtowinicon -o favicon.ico <(pngtopnm icon16.png|pnmquant 256) <(pngtopnm icon32.png|pnmquant 256)

# bashは、標準出力を普通のリダイレクトではなくファイルに見せかけてコマンドの引数に使えて便利。
# シェルがbashでない場合は、pnm形式の中間ファイルを作成する。

$ pngtopnm icon16.png|pnmquant 256 > icon16.pnm
$ pngtopnm icon32.png|pnmquant 256 > icon32.pnm
$ ppmtowinicon -o favicon.ico icon16.pnm icon32.pnm

pnmquantを通しているのは、Windowsのアイコンに使用できる色数が最大256色なので、色数を256以下に制限するためです。

Ubuntu 15.10 (Wily)でインストールされるnetpbmパッケージのバージョンは10.0ですが、今後netpbmが10.44より新しいバージョンに置き換えられた場合は、pngtopnmppmtowiniconが廃止になるのでpngtopampamtowiniconを使用します。

faviconを設置

作成したfavicon.icoは、http://site/favicon.icoでアクセスできるようにWebページのトップディレクトリーに置きます3

faviconを設置したWebページを開いて正しく表示されることを確認します。表示されない時は、サーバのアスセスログを確認してfavicon.icoにアクセスしているか・エラーが無く取得されているか確認します。

参照

  1. Favicon – Wikipedia

  2. GIFとPNG形式のアイコンファイルを使用するには、全てのページのHTMLファイルに次のリンクタグを入れてアイコンファイルを指定します。

    <link rel="shortcut icon" href="http://example.com/icons/favicon.png" />
    <link rel="icon" href="http://example.com/icons/favicon.png" />
    
  3. WordPressでは、テーマのヘッダーファイルに次のリンクタグを挿入して全てのページでfaviconを表示させることも可能です。

    <link rel="shortcut icon" href="http://example.com/icons/favicon.ico" type="image/vnd.microsoft.icon" />
    <link rel="icon" href="http://example.com/icons/favicon.ico" type="image/vnd.microsoft.icon" />
    

Ubuntu on Native ZFSを15.04へアップグレードする時の注意点

このメモは、ZFS On Linux(ZOL)をUbuntuのRootファイルシステムとしている場合の話です。

Ubuntu 15.04(Vivid Vervet)が、予定どおり公開されました

早速Ubuntu 14.10から15.04にアップグレードと行きたいところですが、upstartがsystemdに変更によるものなどいくつかの注意点が有りました。

注意点は、次の3つです。

zfs.koの確認を忘れない

これは毎回リリース・アップグレードをする時の注意点です。

ZFS On Linuxは、外部パッケージとして提供されるカーネルモジュールです。そのためカーネルの版が変わる度に新しくモジュールを作ってインストールする必要が有ります。もっともDKMSが自動的にインストールしてくれるので普段のapt-get dist-upgradeでは気にする必要はありません。

今回の14.10から15.04へなどリリースアップグレード時には外部パッケージのソースが無効にされてしまいます。そのため新しいカーネルがインストールされても対応するZFSのカーネル・モジュールはインストールされないかもしれません。もし対応するカーネル・モジュールがインストールされなければ、再起動してカーネルが変わると起動できなくなってしまいます。

そこでリリース・アップグレードをしたら、再起動する前に必ず新しいカーネルに対応するZFSモジュールが有るか確認します

$ sudo zfs snap -r tank@20150424 # upgradeに失敗してもrollbackで元に戻せる。
$ sudo zfs clone tank/ROOT/ubuntu@20150424 tank/ROOT/utopic # optional
$ sudo backup-zfs.sh # バックアップを取る

$ sudo apt-get update && sudo apt-get install -y update-manager-core
$ do-release-upgrade

... アップグレード ...

アップグレードを完了するには再起動が必要です。 
'Y' を選択すると再起動します。 

続行する[yN] # Nを選択して再起動しない

$ find /lib/modules -name zfs.ko -print
/lib/modules/3.19.0-15-generic/updates/dkms/zfs.ko

今回は新しいカーネルに対応するモジュールが有るので、このまま再起動しても大丈夫かも。ただしutopicのソースから作成されたモジュールなのでアップグレードしておく。

$ sudo nano /etc/apt/sources.list.d/zfs-native-*.list
$ sudo apt-get update && sudo apt-get upgrade -y

$ sudo shutdown -r now

mountall問題

Ubuntu 15.04の大きな変更点は、upstartの代わりにsystemdが使われるようになったことです。

この影響でmountallがRoot以外のZFSをマウント出来なくなってしまいました。そのため/varなど細かいファイルシステムに分けていると正しく起動できません。起動までに必要なファイルが全てRootと同じファイルシステム内に有れば起動には問題有りません。

ただしユーザが作成したZFSは起動時にはマウントされていません。そこでmountallが修正されるまでのworkaroundは、起動した後にcrontabなどからzfs mountを呼び出してマウントしています。

@reboot /sbin/zfs mount -a -O

起動した後でzpool importした場合は、問題なくmountpoint設定に応じて自動的に指定場所にマウントされます。

zpool upgradeしないこと

これはUbuntu 15.04へのアップグレードとは直接関係なく、どのバージョンのUbuntuを使っていても注意する必要がある点です。

先日ZFS On Linux 0.6.4が公開されました。この版では、ZPOOLに新しい機能がいろいろ追加されました。

しかしUbuntuを起動させるGrubがまだ新しい機能を有効にしたZPOOLに対応していません。そのためzpool upgradeで新しい機能を有効にしてしまうとGrubがファイルシステムを見つけられなくなり、結果としてシステムを起動できなくなったしまいます。

GrubがZPOOLを認識しない
GrubがZPOOLを認識しない

また新規にRootファイルシステムとなるZPOOLを作成する時には、次のようにこれまでの機能のみを有効にして作成します。

zpool create -f -d -o feature@async_destroy=enabled -o feature@empty_bpobj=enabled -o feature@lz4_compress=enabled -o ashift=12 -o autoexpand=on -O atime=off pool_name devices