自由帳

@_nibral の技術ブログ

Windows 10でHyper-Vを使ってVagrantを動かす

Qiitaからの移転記事です https://qiita.com/nibral/items/94de6b9787e2aface2aa

VagrantHyper-Vで動かそうとしたところいくつかハマったので、一通りの流れをメモ。

環境

Hyper-V

インストール

「プログラムと機能」→「Windowsの機能の有効化または無効化」から「Hyper-V」にチェックを入れる。もし「Hyper-V プラットフォーム」にチェックが入れられない場合、BIOSの設定で仮想化支援機能(Intel VT-d)をオンにする必要がある。

仮想スイッチの作成

Hyper-V マネージャー」を立ち上げて1、左側のツリーから自マシンを選択、右側の「仮想スイッチマネージャー」を開く。Vagrantで作成した仮想マシンを外部と通信させたいので、「外部」を選択して仮想スイッチを作成しておく。

Vagrant

インストール

Vagrantの公式サイトからインストーラを落としてきて実行する。再起動するとコマンドプロンプトPowerShell、Git Bashからvagrantコマンドが使えるようになる。ただし、Hyper-Vを使うときは管理者権限で起動する必要があることに注意する。

Hyper-V also requires that you execute Vagrant with administrative privileges. Creating and managing virtual machines with Hyper-V requires admin rights. Vagrant will show you an error if it does not have the proper permissions. Usage - Hyper-V Provider - Vagrant by HashiCorp

以後のコマンドはすべて管理者権限で起動したGit Bashを前提としている。

init

ProviderにHyper-Vが選べるCentOS 7ということで、今回はserveit/centos-7を使う。適当なディレクトリをつくり、Vagrantにboxを追加して初期化する。

$ mkdir Vagrant
$ cd Vagrant
$ vagrant box add serveit/centos-7
$ vagrant init serveit/centos-7

up…の前に

通常であればこのままvagrant upするところだが、今回の環境では2つほど問題が起きて動かないので先に修正する。

get_vm_status.ps1の修正

この手順はVagrant 1.8.5から不要になりました(2016/07/27) Windows 10からHyper-Vの設定が保存されている場所が変わったらしく、以下のエラーが出て仮想マシンの情報取得に失敗する。

An error occurred while executing a PowerShell script. This error
is shown below. Please read the error message and see if this is
a configuration error with your system. If it is not, then please
report a bug.

Script: get_vm_status.ps1
Error:

発生場所 C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.4\plugins\providers\hyperv\scripts\get_vm_status.ps1:21 文字:8
+ } catch $ExceptionType {
+        ~
Catch ブロックにステートメント ブロックがありません。
発生場所 C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.4\plugins\providers\hyperv\scripts\get_vm_status.ps1:21 文字:24
+ } catch $ExceptionType {
+                        ~
式またはステートメントのトークン '{' を使用できません。
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : MissingCatchHandlerBlock

対策としては、既に修正済みのスクリプトが作られているのでこれをダウンロードしてきてget_vm_status.ps1を置き換える。この問題はVagrantの次のリリース(1.8.5?)で修正されるはずされました。

ファイル共有オプションの修正

Hyper-Vを使う場合、ホストOS-ゲストOS間のファイル共有は「ホストOSのディレクトリをsambaで共有してゲストOSからアクセス」という方法になるのだが、以下のエラーが出て設定に失敗する。

==> default: Mounting SMB shared folders...
(省略)
The error output from the last command was:

mount: wrong fs type, bad option, bad superblock on //192.168.***.*/*********************************,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

どうやらVagrantはバージョン1.8からsambaの認証方法を変更したのだが、boxにインストールされているsambaが新しい認証方法に対応していないためにこのエラーが起きる(らしい)。

Vagrant 1.8 changed SMB mounting to use the more secure credential file mechanism. However, many operating systems ship with an outdated filesystem type for SMB out of the box which does not support this. SMB - Synced Folders - Vagrant by HashiCorp

この問題は、Vagrantfileのファイル共有設定でmount_optionsにホストOSのユーザ名(USERNAME)とパスワード(PASSWORD)を指定することで回避できる。ただし、パスワードが平文で記録されてしまうのでセキュリティ的には好ましくない。ゲストOS側のsambaを更新すればいいような気もするので要調査。

Vagrant.configure("2") do |config|
  (省略)
  config.vm.synced_folder ".", "/vagrant", type: "smb", mount_options: ["username=USERNAME","password=PASSWORD"]
  (省略)
end

up & ssh

ここまできたら、仮想マシンを立ち上げてSSHで入れるか確認する。upするときに--provider=hypervをつけるのを忘れないように。つけ忘れるとVirtualBoxをインストールしようとするので、Ctrl+Cで止める。

$ vagrant up --provider=hyperv
(途中でホストOSのユーザ名とパスワードを聞かれるので入力)

$ vagrant ssh
[vagrant@centos7 vagrant]$

ホストOSのVagrantfileがあるディレクトリとゲストOSの/vagrantが共有されているはずなので、適当にファイルを作ったりして動作を確かめると良い。

その他

  • Git Bashだとupの途中で入力するパスワードが隠れない(Your console doesn't support hiding input.らしい)
  • 仮想マシンのIPを固定できない?

  1. Windows+QでCortanaを出して「hyper-v」で検索するとラク

Amazon Linuxに最新版のnginxをインストールする

amzn-mainリポジトリに登録されてるnginxが古いので、 yumにnginxのリポジトリを追加して最新版をインストールする。

注:インターネットからアクセスするためには、HTTP(80番ポート)の通信を許可するように セキュリティグループを作成してインスタンスに割り当てる必要がある。詳細は Linux インスタンスの Amazon EC2 セキュリティグループ を参照。

sudo vi /etc/yum.repos.d/amzn-main.repo 
--------
[amzn-main]
name=amzn-main-Base
mirrorlist=http://repo.$awsregion.$awsdomain/$releasever/main/mirror.list
mirrorlist_expire=300
metadata_expire=300
priority=10
failovermethod=priority
fastestmirror_enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-ga
enabled=1
retries=5
timeout=10
report_instanceid=yes
exclude=nginx
sudo vi /etc/yum.repos.d/nginx.repo
--------
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
  • nginxをインストール
sudo yum install nginx
sudo service nginx start
sudo chkconfig nginx on
  • 動作確認

http://<インスタンスのIP/>にアクセスして、下のようなページが出ればOK
設定ファイルは/etc/nginx/conf.d/に置く。

Raspberry Pi 2をVPNサーバに仕立てる

はじめに

購入直後にひとしきり遊んで放置されていたRasberry Pi 2 Model Bを発見したので、

  • 公衆無線LAN利用時のセキュリティ向上
  • 自宅NASへのアクセス

を目的としてVPNサーバを立てた。VPNソフトウェアはSoftEther VPN。 また、

  • 接続するLANでDHCPが提供されている
  • 作業はすべてSSH経由で行い、USBキーボードとマウスを使わない(適当なHDMI対応モニタがなかったので)
  • SoftEther VPNの設定は、別のWindowsマシンから「SoftEther VPN サーバ管理マネージャ」を使って行う

ものとする。

やるべきこと

  • OSのインストール
  • Raspbianのセットアップ
  • ネットワーク設定
  • SoftEther VPNのインストール

OSのインストールと初期セットアップ

まず、Raspberry Pi公式のRaspbianダウンロードページから OSイメージをダウンロードする。Raspbianには通常版とLite版があるが、Lite版でインストールされないパッケージに 依存するソフトウェアがあると面倒なので今回は通常版を選択。

zipを展開して2016-03-18-raspbian-jessie.imgを手に入れたら、それをmicroSDに書き込む。 今回はLinuxマシンで作業したので、ddコマンドを使う。 コマンドは公式のインストールガイドそのまま。 (of=で示される書き込み先は環境により異なるので、先にdf -hmicroSDのデバイス名を確認しておく)

dd bs=4M if=2016-03-18-raspbian-jessie.img of=/dev/sdb

書き込みが終わったら、syncを実行してからmicroSDを取り出す。

Raspbianのセットアップ

OSイメージを書き込んだmicroSDをRasPiに差し込み、LANケーブルと電源を接続する。 DHCP環境であれば、数分もするとIPが割り当てられてSSHでアクセスできるようになる。 本来はRasPiに割り当てられたIPを探すために必要があるが、今回はルータでIPの割り当てが確認できたので不要だった。

IPがわかったらSSHで接続し(ユーザ名pi、パスワードraspberry)、Raspberry Piの設定を行う。

raspi-config

少なくとも、「1. Expand Filesystem」の実行と「4. i18n Options」のロケールタイムゾーン設定は必須。 終わったら一旦再起動し、続いて各種アップグレードを済ませる。

apt-get update
apt-get upgrade
rpi-update

ファームウェアの更新が行われるためここでも再起動。

ネットワーク設定

サーバとして動作させる関係上、RasPiのIPは固定値が望ましい。通常はサーバ側に固定IPを設定するが、RasPiでは Zeroconfの実装であるavahi-daemonが 標準で動作していて、DHCPで割り当てられたIPに対してraspberrypi.localで名前解決ができるようになっている。 今回はこのavahi-daemonを活かすため、ルータ側でRasPi(の有線NIC)のMACアドレスに対して 割り当てるIPを固定した。

補足…Windows10からはmDNSが実装されて.localの名前解決ができるようなのだが (仮想化雑記帳: Windows and Bonjour)、 手元の環境ではWindows 10 -> RasPiの名前解決ができなかった。RasPi -> Windows 10の名前解決はできるので、 ファイアウォールの設定等を見直す必要があるかもしれない。

RasPiのIPが固定できたら、WAN側からのVPN通信をそのIPに流すように設定する(ポート開放)。 今回利用するLT2P/IPsecでは、UDPの500番と4500番ポートを開ければよい。

SoftEther VPNのインストール

適当なマシンでSoftEtherダウンロードセンターに行き、 SoftEther VPNの入ったtar.gzファイルのURLを確認する。

URLを確認したら、RasPiへダウンロード。

wget http://jp.softether-download.com/<中略>/softether-vpnserver-v4.19-9605-beta-2016.03.06-linux-arm_eabi-32bit.tar.gz

あとは公式ドキュメントの7.3 Linux へのインストールと初期設定に したがってファイルを展開し、ビルドし、適切な場所に配置し、動作チェックを行ってデーモンとして登録すればよい。 ただし、Raspbianはsystemdを採用しているので、「7.3.8 スタートアップスクリプトへの登録」はスキップして Systemd用SoftEther設定ファイル に従う。

vpncmdによるチェックでエラーが出なければ、この時点でVPNサーバが稼働している。 あとは別のWindowsマシンに「SoftEther VPN サーバ管理マネージャ」をインストールし、指示に従って 初期設定を行う。L2TP/IPsecによるアクセスを有効にすることと、DDNSの設定を行うことを忘れないように。

追記

RasPi内臓の有線LANインターフェース(eth0)にSoftether VPNの仮想HUBをブリッジすると、 Liunx側の制約でVPNサーバが提供する他のサービス(httpサーバ等)にVPNクライアントからアクセス出来ない。

Linuxオペレーティングシステム内部での制限事項により、VPN側(仮想HUB側)からローカルブリッジしている LANカードに割り当てられるIPアドレスに対して通信を行うことはできません。この制限はSoftEtherVPNが原因ではなく、 Linuxの内部構造に原因があります。もしVPN側(仮想HUB側)からLinuxでローカルブリッジに使用している コンピュータ本体と、何らかの通信を行いたい場合(たとえばVPN Server/VPN BridgeサービスとHTTPサーバー サービスを両方動作させており、VPN側からもサーバーサービスにアクセスさせたい場合)は、ローカルブリッジ用の LAN カードを用意して接続し、そのLANカードと既存のLANカードの両方を物理的に同じセグメントに接続してください (3.6.11 Linux, FreeBSD, Solaris, Mac OS X オペレーティングシステムで「ローカルブリッジ機能」を使用する場合の注意事項)

この問題を解決するためには、以下の2つの方法がある。

  1. USB-Ethernetアダプタ(eth1)を増設して仮想HUBのブリッジ専用にする
    • VPN以外のサービスにはeth1→eth0という形で一回外に出て戻ってくる経路になる
    • シンプルだが、IPを2つ専有する上にアダプタとケーブルが邪魔
  2. VPN用の仮想インターフェース(tap)を作成し、ブリッジインターフェース(br0)を介して外部及びeth0と接続する
    • eth0のIPをbr0に移し、eth0はbr0へOS内部で接続する
    • tapデバイスはサーバ管理マネージャの「ローカルブリッジ設定」で名前を指定して作成できる

systemd-networkd環境下で方法2を用いる場合の手順は以下のとおり。 リモートで作業する場合、設定をミスるとIPの割り当てられているインターフェースが一つもない状態になって詰むので、 一時的にUSB-Ethernetアダプタを接続などして回線を確保しておくほうが安全。

  • ブリッジインターフェースの作成
/etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge
  • ブリッジのプロファイルを作成
/etc/systemd/network/br0.interface
[Match]
Name=br0

[Network]
DHCP=ipv4
  • eth0をブリッジに接続
/etc/systemd/network/eth0.interface
[Match]
Name=eth0

[Network]
Bridge=br0
  • systemd-networkdの再起動
sudo systemctl restart systemd-networkd.service
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

# 追記(tap_vpnの部分は管理マネージャで指定した名前に合わせる)
ExecStartPost=/bin/sleep 5 ; /sbin/brctl addif br0 tap_vpn

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl stop vpnserver
sudo systemctl start vpnserver

リーダブルコードを読んだ

気になった記述や考え方のメモ。

1章「理解しやすいコード」

  • 読みやすさの基本定理…優れたコード=他人が理解するのに要する時間が最短のコード
    • カッコいいコードを書こうとしてテクニックに走り、読みづらいコードにならないように。

2章「名前に情報を詰め込む」

  • 正確かつ明確な名前・表現を探す。GetよりもDownloadやFetchが適切かもしれない。
  • 変数名の長さとスコープを反比例させる。数行の間しか使われない変数に長い名前は必要ない。
  • アンダースコア(_)やダッシュ(-)、大文字小文字を使って情報を表現する。
    • CamelCaseとsnake_caseを混在させるのは微妙に感じる。大規模なコードでは有用なんだろうか。

3章「誤解されない名前を使う」

  • 範囲を指定するときは境界値を含むのかを明らかにする。
  • 名前は肯定形を使うとよい。(disable_ssl→use_ssl)
  • 軽い処理であることが期待されやすい名前に注意する。(ex. get,size)

4章「美しさ」

  • 改行や空白を揃えて、同じような処理は同じような見た目にする。
  • 最後は個人の好みの問題…正しさよりも、一貫性

5章「コメントすべきことを知る」

  • 優れたコード > 悪いコード+優れたコメント。コードのクオリティを上げるのが先。
  • コードそのものの説明はしない。自分の考えやコードの根拠をコメントに残す。

6章「コメントは正確で簡潔に」

  • あいまいな表現をしない。「優先度を変える」は「高くする or 低くする」として明確に。
  • 動作のわかりにくいコードには実例を示す。
  • 可能であれば、関数呼び出しの際に引数に名前を付ける。
    • C++JavaならIDEを使うだろうし、インラインコメントを使ってまで1行に書かなくてもいいのでは。

7章「制御フローを読みやすくする」

  • 条件式を書くときは、変化する値を左、安定した値を右に書く。
  • 分岐(if)や繰り返し(for,while)では単純なもの、目立つものを先に片づける。

8章「巨大な式を分割する」

  • 式が長くなったら、変数を作って概念レベルで意味を持つ単位に分割する。
  • より簡単な条件で目的を達成する方法はないか考える。条件を逆にしたら簡単にならないか?

9章「変数と読みやすさ」

  • 1度しか使われていなかったり、中間結果を保持している変数は削除する。
    • 後で何度も使うだろうと思って変数にして、結局1回しか使わないパターンに注意する。
  • 変数のスコープは短く、書き換える場所は少ないほうがよい。
    • ES6のletconstはこの考え方を実現するのによさそう。

10章「無関係の下位問題を抽出する」

  • 純粋な計算やユーティリティのコードを別の関数に分離することで、本来の問題に集中しやすくなる。
    • デバッグ出力用のコードを関数化しておくことで、再帰的に使うことができる(配列要素の列挙がラクになる)のがgood。
  • 汚いインターフェースを使うために長いコードを書くくらいなら、その労力でラッパーを作ってインターフェースをきれいにする。

11章「1度に1つのことを」

  • コード中で複数のタスクを行ったり来たりしない。タスクと値を洗い出して、1つずつ片付ける。

12章「コードに思いを込める」

  • 実装したい処理について他人に説明するならどう話すかを考え、出てきたキーワードを元にコードを書く。
    • その説明でおばあちゃんは理解できるか?

13章「短いコードを書く」

  • 「コードを書かずに済ませる」ことも手段の一つ。コードが少なければ付随する仕事も少なくて済む。
    • 要求にあったレベルの実装で終わらせる。新しい機能は必要になるまでつけない。
  • 標準ライブラリやAPIの一覧に目を通しておき、「その機能、どこかにあったような…」と思えるとよい。

14章「テストと読みやすさ」

  • あるユニットに対するテストは、「状態Aにおける入力xに対して、動作Bと結果yが得られる」という1行で説明できることが多い。
  • テストに用いる値は可能な限り単純なものにする。1回のテストで複数の状況をチェックしようとしない。

15章「分/時間カウンタを設計・実装する」

  • 処理の計算量・メモリ使用量を意識し、可能であればO(1)で実行できるように実装する。
    • 「最大要素数が設定可能なキュー」のような汎用に使えるものなら、既存のライブラリを探してみる。
  • クラスを分割することになっても、外部に公開されるのは1つだけならば問題ない。

まとめ

自分が書いたコードのことを忘れてもいいように、読みやすいコード、適切なコメントを書く。

雑感

どんなコードを書いたとしても、普通はコンパイル時に最適化が入る。 定数への置き換えやループの展開が行われて、コードとバイナリは必ずしも一致しない。 (組み込み系などの特殊な場合を除いて)限られたリソースをやりくりする時代でもないことを思えば、 他人にとってわかりやすいコードを書くことの優先順位が高くなることに不思議はない。

Raspberry Pi 2 Model B + WDC-150SU2Mで無線LANに接続する

やるべきこと

  • WDC-150SU2M(=Realtek 8188eu)のドライバをインストール
  • dhcphdとwpa_suppcilantでネットワークに接続

ドライバのインストール

WDC-150SU2M(=Realtek 8188eu)のドライバをインストールして、ネットワークに接続する。

Raspbian更新

sudo apt-get update
sudo apt-get upgrade

ファームウェア更新

rpi-update

Linuxバージョン確認

uname -a

表示されたバージョン番号を確認する。(2015/12/8時点では4.1.13-v7+ #826)

ドライバダウンロード

https://www.raspberrypi.org/forums/viewtopic.php?p=462982から対応するバージョンのファイル名(8188eu-v7-yyyymmdd.tar.gz)を探す。PiとPi2でファイルが違うので注意。

ドライバインストール

wget https://dl.dropboxusercontent.com/u/80256631/8188eu-v7-2015yyzz.tar.gz
tar xzf 8188eu-v7-yyyymmdd.tar.gz
./install.sh

再起動

sudo reboot now

認識していることを確認

lsusb

"ID 056e:4008 Elecom Co., Ltd"が表示されていれば正常に認識されている。

ネットワークに接続

プロファイル作成

/etc/wpa_supplicant/wpa_supplicant.confを作成する。

{% gist 944802d888a5d5536559 %}

network={...}の部分はwpa_passphrase 接続したいSSID パスワードを実行して生成できる。 コマンドの出力にはコメントとしてパスワードの平文が含まれている(#psk=...)ので、心配なら削除する。

接続

標準で動いているdhcpcdは特定の名前が付いた設定ファイルを自動で読み込むので(dhcpcd#10-wpa_supplicant - ArchWiki)、dhcpcdを再起動すれば接続できるはず。

sudo systemctl daemon-reload
sudo service dhcpcd restart

うまくいかない場合はwpa_cliで対話型の設定コンソールが開いて何とかする。

固定IP

dhcpcdの設定と競合するので/etc/network/interfacesは書き換えない。 dhcpcdの設定ファイル/etc/dhcpcd.confの末尾に下記の設定を追記するか、DHCPサーバ側でリースするIPを固定する。

interface wlan0
static ip_address=192.168.0.81/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

ただ、標準でavahiが動いていて"raspberypi.local"でアクセスできるのでサーバ運用しないならIPを固定する必要はない気がする。 (WindowsではBonjourが必要だが、単体のインストーラが提供されている。)

CentOS7でSSHを使う

CentOS7になって、iptablesがfirewalldになったりsystemctl使うようになったりしたので、6.x系から変わったところを中心に。

ユーザ関連

インストール中に一般ユーザを作成し、かつそのユーザでsudoコマンドを使いたい場合、インストール完了後に当該ユーザをwheelグループに追加する

gpasswd -a akari wheel

firewalld

結局、firewalldの設定はどこを見ているのか?

  1. firewalldが立ち上がると、各NICに対して「ゾーン」が紐付けされる
  2. ゾーンには「サービス」や「ポート」、「マスカレードの可否」といったルールが紐付けされている
    • このルールに従って、パケットを通したり捨てたりする
  3. サービスのルールはxmlファイルに保存されていて、必要に応じて編集できる
    • 初期状態では、/usr/lib/firewalld/servicesに保存されているxmlファイルを参照している
    • ファイルを編集したいときは直接編集せず、/etc/firewalld/servicesにコピーして書き換える

sshdの標準ルール

<?xml version="1.0" encoding="utf-8"?>
<service>
    <short>SSH</short>
    <description>略</description>
    <port protocol="tcp" port="22"/>
</service>

sshdのポートを変える場合

cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
vi /etc/firewalld/services/ssh.xml
    <port protocol="tcp" port="22"/>
    ↓
    <port protocol="tcp" port="10022"/>
systemctl restart firewalld

ただ、手元の環境ではfirewalldの再起動がタイムアウトして失敗する。 設定に問題があるか、サービス間の依存関係に見落としがあるか、単にマシンの性能が足りないか(Celeron N3050でHyper-Vは重い)。 設定が終わったあとにrebootしたらちゃんと動いたのでよし。

SELinux

管理ツールのインストール

yum install policycoreutils-python

sshdが待ち受けるポートとしてTCPの10022番を追加

semanage port -a -t ssh_port_t -p tcp 10022

ちゃんと登録できたか確認

semanage port -l | grep ssh

SSH

sshdの設定変更

vi /etc/ssh/sshd_config
    Port 10022
    PermitRootLogin no
    PubkeyAuthentication yes
    PasswordAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys     

公開鍵認証に使うファイルのパーミッションに過不足があるとPermission deniedになるので注意

  • ~/.sshは700
  • ~/.ssh/authorized_keysは600

sshd再起動

systemctl restart sshd.service
systemctl status sshd.service

その他

MSYSgitとWindowspingコマンドの相性が悪いのか、出力が中途半端なところで切れたりする

パケッ

ffmpeg on CentOS

はじめに

公式のインストールガイドを参考に、余計なオプション入れてないffmpegをビルドしよう(x264とfdk_aac)

Git

yumのパッケージが古いので自分でビルドする

git 依存関係の解決

sudo yum install curl-devel expat-devel gcc gettext-devel make openssl-devel zlib-devel perl-ExtUtils-MakeMaker

Gitのダウンロード

wget https://www.kernel.org/pub/software/scm/git/git-x.x.x.tar.gz

展開してビルド、インストール

tar -zxf git-x.x.x.tar.gz
cd git-x.x.x
make prefix=/usr/local all
sudo make prefix=/usr/local install

nasmリポジトリの追加

sudo curl -o /etc/yum.repos.d/nasm.repo http://www.nasm.us/nasm.repo
sudo yum update

ffmpeg 依存関係の解決

sudo yum install autoconf automake cmake freetype-devel gcc-c++ libtool nasm pkgconfig

変更点

  • gcc,make,zlib-devel…gitのビルドでインストール済
  • git…上でビルドしたものと競合
  • mercurial…libx265をダウンロードしないので不要

ビルド

ダウンロード用のディレクトリを切る

mkdir ffmpeg_sources

yasm

cd ~/ffmpeg_sources
git clone --depth 1 git://github.com/yasm/yasm.git
cd yasm
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
sudo make install
make distclean

x264

cd ~/ffmpeg_sources
git clone --depth 1 git://git.videolan.org/x264
cd x264
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
sudo make install
make distclean

fdk_aac

cd ~/ffmpeg_sources
git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
sudo make install
make distclean

ffmpegのダウンロードと展開

cd ~/ffmpeg_sources
git clone --depth 1 git://source.ffmpeg.org/ffmpeg
cd ffmpeg

ffmpegビルド設定

PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"
./configure --prefix="$HOME/ffmpeg_build" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--bindir="$HOME/bin" \
--pkg-config-flags="--static" \
--enable-gpl \
--enable-nonfree \
--enable-libfdk-aac \
--enable-libx264

staticなバイナリにする場合の設定

PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig/"
./configure --prefix="$HOME/ffmpeg_build" \
--disable-ffserver \
--enable-version3 \
--arch=x86_64 \
--extra-cflags="-I$HOME/ffmpeg_build/include -static" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib -static" \
--bindir="$HOME/bin" \
--pkg-config-flags="--Bstatic" \
--enable-gpl \
--enable-nonfree \
--enable-libfdk-aac \
--enable-libx264 \
--enable-static \
--disable-shared

ビルド

make
sudo make install
make distclean

shellのハッシュ更新

hash -r