2013年5月31日金曜日

ファイルディスクリプタ数について

squidを使っていたら次のようなエラーが発生していて、
やたら重かったので調べていたらファイルディスクリプタという聞きなれない言葉をハヶ━m9( ゚д゚)っ━ン!!

squidのエラー内容
2013/04/16 14:37:58| WARNING! Your cache is running out of filedescriptors
squildの実際に使われている値の確認
※squidが起動している状態で実行する。-hにはsquidサーバーを指定する
squidclient -h 192.168.0.20 -p 80 mgr:info| grep 'file descri'
#ファイルディスクリプタの最大値
Maximum number of file descriptors:   1024
#ファイルディスクリプタの空きすう
Available number of file descriptors: 1005
#ファイルディスクリプタの予約数
Reserved number of file descriptors:   100
こちらのサイトで分かりやすく書かれていました! ファイルディスクリプタ数の上限変更とlimits.confの罠 一部抜粋です( ´∀`)bグッ!
Linuxでは、同時にオープンできるファイルディスクリプタ数が制限されています。
OS全体での設定は、/proc/sys/fs/file-max等で確認でき、大規模なアクセスがあるサーバでは/etc/sysctl.confに設定を追加して上限を増やしているケースも多いでしょう。

これとは別に、1プロセスが同時オープン可能なファイルディスクリプタ数は、標準で1024となっています。
apacheのpreforkモデル等の子プロセスが多数稼動するアプリケーションだと、
1プロセスあたりのファイルオープン数はそこまで増加しないので、普段はあまり意識することは少ないかもしれません。
しかし、apacheのworkerモデル等のスレッドを使用するアプリケーションでは、この制限が致命的になるケースが発生します。
とのことです。(´・∀・`)ヘー

そんで、squidは1プロセスしか立ち上がらないので、上記のサイトの説明に書かれている
apacheのworkerモデルに該当するっぽいです。

そのため、同時オープン可能なファイルディスクリプタ数はデフォルト設定の1024になっていると思われます。

まずは、OS全体のでのファイルディスクリプタ数の設定の確認を行ってみます(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
次のコマンドを実行すると、左から、割り当て済みファイルディスクリプタ(17824) 、
使用中ファイルディスクリプタ(0) 、最大割り当て可能ファイルディスクリプタ(785338)となる。
cat /proc/sys/fs/file-nr
17824   0       785338
OS全体では最大値が785338がなっているようでした。

OS全体でのファイルディスクリプ値
sudo cat /proc/sys/fs/file-max
785338

現在のファイルディスクリプタの使用状況
左から、割り当て済みファイルディスクリプタ 、使用中ファイルディスクリプタ 、最大割り当て可能ファイルディスクリプタとなる。
sudo cat /proc/sys/fs/file-nr
17824   0       785338

この最大割り当て可能ファイルディスクリプタの値を増やしてみる。/etc/sysctl.conf を開いて、最下行に以下のように追記する。
sudo vi /etc/sysctl.conf

# ファイルディスクリプタの上限値
fs.file-max = 794573
ここでは最大割り当て可能値を794573とした。この設定を反映させる為に以下のコマンドを実行する。
$ sudo sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
fs.file-max = 794573
#確認する
sudo cat /proc/sys/fs/file-nr
17824   0       785338
各ユーザのファイルディスクリプタの上限値を変更する

現在ログイン中のユーザーのファイルディスクリプタの上限値の確認
ulimit -n
1024
指定ユーザーのファイルディスクリプタの変更
/etc/security/limits.d/に拡張子をconfにしたファイルをおけば、
自動で読み込んでくれるっぽい。
ls -alt /etc/security/limits.d/
合計 12
drwxr-xr-x. 6 root root 4096  2月 25 09:56 2013 ..
drwxr-xr-x. 2 root root 4096  2月 25 09:56 2013 .
-rw-r--r--. 1 root root  152  4月 16 18:04 2012 90-nproc.conf
squid用の設定ファイルを作成する。
vi /etc/security/limits.d/squid.conf
######################
#
# squidの設定
#
######################

#OSの最大値785338
* soft nofile 10000
* hard nofile 10000

ただし、注意として、limits.dの設定ファイルで変更できるのは、
一時的なもので、OSの再起動や

また「ファイルディスクリプタ数の上限変更とlimits.confの罠」次から抜粋ですが、 つまり、「PAM認証を介さないようなdaemon系プログラムの制限には/etc/security/limits.confは使えない」ことになるのです。

daemon系プロセスのファイルディスクリプタ数上限を設定する際、/etc/security/limits.conf は使えません。
状況によっては一見設定されたように見えますが、大きな落とし穴にはまることになります。
面倒ですが、必要なプロセス毎にulimitを用いて適切に設定しましょう。

確認のためにsquidユーザーになろうとするが、
ログインが出来ないユーザーで作成してあった・・・orz
sudo su - squid
This account is currently not available.
nologin:(;゙゚'ω゚'): #設定の確認
cat /etc/passwd|grep squid
squid:x:23:23::/var/spool/squid:/sbin/nologin
そこで、ログインできるようにする。
usermod -s /bin/bash squid
設定の確認
cat /etc/passwd|grep squid
squid:x:23:23::/var/spool/squid:/bin/bash
ログイン成功
# sudo su - squid
-bash-4.1$
squidユーザーになったら、先程設定したファイルディスクリプタの上限値を確認する
$ ulimit -n
10000
squidユーザーのファイルディスクリプタの上限値をあげたので、
反映されるために、squidを一度停止してから起動を行います。
suqid -k reconfigureでは反映されません。

再起動後に、次のコマンドで反映されていることを確認する。
squidclient -h squidサーバーのIPアドレス -p 80 mgr:info| grep 'file descri'
        Maximum number of file descriptors:   10000
        Available number of file descriptors: 9055
        Reserved number of file descriptors:   100
以上です(`・ω・´)ゞビシッ!!
参考URL

2013年5月23日木曜日

MySQLマスター手動切替

DB01(マスター)/DB02(スレーブ)の2台構成に

DB03を追加して

DB03(マスター)/DB02(スレーブ)の2台構成に切替を行います。(DB01はサーバ停止)


1.まずはDB03にmysqlをインストールして、DB03を一旦スレーブで起動させデータの同期を行います。

1.1.mysqlをインストールする[DB03]
インストール手順はこちらを参考
レプリケーション設定(非同期レプリケーション)
準同期レプリケーション設定

1.2./etc/my.cnfを設定する[DB03]
# vi /etc/my.cnf
基本的にはDB02(スレーブ)の/etc/my.cnfをコピーして、server-id=XXの箇所を、DB01(マスター)/DB02(スレーブ)と重複しない値に変更するだけ。

1.3.mysqlを再起動する[DB03]
# service mysqld restart

1.4.DB01(マスター)側でDB03のレプリケーション用ユーザを追加する[DB01]
# mysql -u root
mysql> SELECT user, host, password FROM mysql.user;
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '★レプリケーション用ユーザ'@'★DB03のIP' IDENTIFIED BY '★パスワード';
mysql> FLUSH PRIVILEGES;

1.5.DBをダンプする[DB01]
# mysqldump -u root -p --all-databases --master-data=2 --single-transaction > /var/tmp/dump_20130523_01.sql

1.6.DB01からDB03へダンプファイルを転送する[DB01]
# scp /var/tmp/dump_20130523_01.sql ★DB03のアカウント@★DB03のIP:/var/tmp/

1.7.ダンプファイルをインポートする[DB03]
# mysql -u root -p < /var/tmp/dump_20130523_01.sql

1.8.ダンプファイルからステータス(ファイル名、ポジション)を取得する[DB03]
# head -100 /var/tmp/dump_20130523_01.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='★ログファイル名', MASTER_LOG_POS=★ポジション;

1.9.パラメータを設定する[DB03]
# mysql -u root
mysql> CHANGE MASTER TO
    -> MASTER_HOST='★DB01マスターのIP',
    -> MASTER_USER='★レプリケーション用ユーザ',
    -> MASTER_PASSWORD='★パスワード',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='★ログファイル名',
    -> MASTER_LOG_POS=★ポジション,
    -> MASTER_CONNECT_RETRY=10;

1.10.スレーブで起動する[DB03]
# mysql -u root
mysql> START SLAVE;

mysql> SHOW SLAVE STATUS\G・・・起動確認
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

1.11.DB03からDB01(マスター)へレプリケーションの接続ができるか確認する[DB03]
# mysql -u ★レプリケーション用ユーザ -p -h '★DB01のIP'

1.12.WEBサーバからDB03へ接続ができるか確認する[WEBサーバ]
# mysql -u ★WEBサーバからの接続用ユーザ -p -h '★DB03のIP'

※上記が接続できず、下記のエラーになりました。・・・
ERROR 1045 (28000): Access denied for user '★WEBサーバからの接続用ユーザ'@'★DB03のIP' (using password: NO)

※まずはiptablesを設定してみる[DB03]・・・
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

※現象が変わらないためユーザ権限を確認してみると[DB03]・・・
# mysql -u root
mysql> SELECT user, host, password FROM mysql.user;
マスターからmysql.userを丸ごとコピーしているのでユーザは存在する。

ただし、SHOW GRANTSで実際にユーザ権限を確認しようとすると・・・
mysql> SHOW GRANTS FOR ★WEBサーバからの接続用ユーザ@'★WEBサーバのIP';
ERROR 1141 (42000): There is no such grant defined for user '★WEBサーバからの接続用ユーザ' on host '★WEBサーバのIP'
エラーになる。WEBサーバからの接続用ユーザの定義がないとのこと??・・・

なので、
mysql> FLUSH PRIVILEGES;
を実行し、内部キャッシュを消去したら・・・
接続できました[DB03]

これで、第一段階の
DB01(マスター)/DB02(スレーブ)/DB03(スレーブ)
の3台構成になりました。


2.続いてマスター切替

2.1.サイトをメンテナンス中にするなどしてinsert/updateを停止する

2.2.insert/updateの停止確認(ステータス情報をリアルタイムで表示しておく)

[DB01]
# watch -n1 'mysql -uroot -e"SHOW MASTER STATUS\G"'
Position: XXXXXXXX

[DB02]
# watch -n1 'mysql -uroot -e"SHOW SLAVE STATUS\G"'
Read_Master_Log_Pos: XXXXXXXX

[DB03]
# watch -n1 'mysql -uroot -e"SHOW SLAVE STATUS\G"'
Read_Master_Log_Pos: XXXXXXXX

※insert/updateが停止されていれば、上記のポジションの値は変化しない。

2.3.上記のポジションの値と合わせて、プロセスが実行されていないことを確認する

[DB01]
mysql> SHOW FULL PROCESSLIST;

[DB02]
mysql> SHOW FULL PROCESSLIST;

[DB03]
mysql> SHOW FULL PROCESSLIST;

※何度か実行して確認する。

2.4.DB01のテーブルをロックし、DB02/DB03のスレーブ停止を行う
※ロック中に仮にinsert/updateがあった場合、プロセスが溜まっていってしまうので、下記の一連の作業は続けて行うこと。またロック以降のinsert/updateのデータは、マスター切替後、消滅します。

DB01のテーブルをロックする[DB01]
# mysql -u root
mysql> FLUSH TABLES WITH READ LOCK;

DB02とDB03のポジションの値(SHOW SLAVE STATUS\Gの値)が一致していることを確認する[DB02/DB03]

InnoDB内部状態を確認する[DB02]
# mysql -u root
mysql> SHOW ENGINE INNODB STATUS\G
Log sequence number XXXXXXXXXXXX・・・3つが同値か確認する
Log flushed up to   XXXXXXXXXXXX・・・3つが同値か確認する
Last checkpoint at  XXXXXXXXXXXX・・・3つが同値か確認する

InnoDB内部状態を確認する[DB03]
# mysql -u root
mysql> SHOW ENGINE INNODB STATUS\G
Log sequence number XXXXXXXXXXXX・・・3つが同値か確認する
Log flushed up to   XXXXXXXXXXXX・・・3つが同値か確認する
Last checkpoint at  XXXXXXXXXXXX・・・3つが同値か確認する

※DB02とDB03のポジションの値(SHOW SLAVE STATUS\Gの値)が一致していること、それぞれのサーバのSHOW ENGINE INNODB STATUS\Gの3つの値が必ず一致している状態でスレーブを停止すること!

スレーブ停止[DB02]
mysql> STOP SLAVE;

スレーブ停止[DB03]
mysql> STOP SLAVE;

DB01(マスター)で、mysqlの接続を切断する(ロック解除)
mysql> Ctrl-C -- exit!


2.5.念のため、バイナリファイルをディレクトリごとバックアップする[DB02]
# cp -rp /var/lib/mysql /var/lib/mysql.20130522

2.6.念のため、バイナリファイルをディレクトリごとバックアップする[DB03]
# cp -rp /var/lib/mysql /var/lib/mysql.20130522


2.7.my.cnf をマスター用に修正する[DB03]
# ls -lat /etc/my.cnf*
# cp -rp /etc/my.cnf /etc/my.cnf.20130522
# ls -lat /etc/my.cnf*
# vi /etc/my.cnf ・・・マスター用に変更
基本的にはDB01(マスター)の/etc/my.cnfをコピーして、server-id=XXの箇所を、DB02(スレーブ)と重複しない値に変更するだけ。(※マスター用my.cnfファイルを事前に準備しておくと良い)

※ファイルサイズが大きいため少し時間が掛かる

2.8.ポジションリセット[DB03]
# mysql -u root
mysql> RESET MASTER;・・・こっちは元々バイナリファイルが無くてエラーになったので不要でした
mysql> RESET SLAVE;

2.9.MySQL再起動[DB03]
# service mysqld restart

2.10.MySQLマスター起動確認[DB03]
# mysql -u root
mysql> SHOW MASTER STATUS;


2.11.ポジションリセット[DB02]
# mysql -u root
mysql> RESET MASTER;・・・こっちは元々バイナリファイルが無くてエラーになったので不要でした
mysql> RESET SLAVE;

2.12.MySQL再起動[DB02]
# service mysqld restart


2.13.マスターのステータス(ファイル名、ポジション)を取得する[DB03]
# mysql -u root
mysql> SHOW MASTER STATUS;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| ★ログファイル名 |★ポジション |              |                  |
+----------------+----------+--------------+------------------+

2.14.上記で取得したファイル名、ポジションでパラメータを設定する[DB02]
# mysql -u root
mysql> CHANGE MASTER TO
    -> MASTER_HOST='★DB03マスターのIP',
    -> MASTER_USER='★レプリケーション用ユーザ',
    -> MASTER_PASSWORD='★パスワード',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='★ログファイル名',
    -> MASTER_LOG_POS=★ポジション,
    -> MASTER_CONNECT_RETRY=10;

2.14.スレーブで起動する[DB02]
mysql> START SLAVE;

mysql> SHOW SLAVE STATUS\G・・・起動確認
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

※パラメータの設定を下記の3つだけで実行したところ
Master_Userなどが空欄のままでSTART SLAVEを実行してしまい
Last_IO_Error: error connecting to master '@★DB03のIP:3306' - retry-time: 60 retries: 86400
エラーになりました。
手を抜かず全パラメータを設定しないといけないんですね・・・

mysql> CHANGE MASTER TO
    -> MASTER_HOST='★DB03マスターのIP',
    -> MASTER_LOG_FILE='★ログファイル名',
    -> MASTER_LOG_POS=★ポジション;

mysql> START SLAVE;

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: ★DB03のIP
                  Master_User:
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: ★ログファイル名
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: ★ログファイル名
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 107
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1045
                Last_IO_Error: error connecting to master '@★DB03のIP:3306' - retry-time: 60  retries: 86400
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)


これで
DB01(スタンドアローン)/DB02(スレーブ)/DB03(マスター)
の3台構成になりました。


3.1.あとは旧マスターを停止するだけ[DB01]
# service mysqld stop

3.2.バイナリファイル削除[DB02/DB03]

正しく切替ができたら、上記2.5./2.6.でバックアップした/var/lib/mysql.20130522を削除する


参考URL


2013年5月20日月曜日

ソフトウェアの管理

Stowを使うと管理が楽ちん!!!という事で使ってみたいと思います。

Stowの概要などは、こちらのサイトに詳しく書かれています!
下記は抜粋になります。
Stowを使ってのパッケージ管理
Stowは、Linuxシステム向けの、簡単で使いやすいフリーのソフトウェア・インストール管理ユーティリティーです。
Stowは、.rpmや .debなどの標準的なパッケージング・フォーマットを使わずに、
tarのソースから直接インストールされるアプリケーションに最適です。

Stowは、所望の任意の場所に設けた専用のディレクトリーにアプリケーションを収容しながら、
要求されている場所にアプリケーションがインストールされているかのように見せるといった方法で、
アプリケーションのインストールを管理します。

Stowでソフトウェア・インストール管理を行うと、
アプリケーションのインストール、アンインストールが簡単になる、
インストールされたアプリケーションや関連するファイルの検出が簡単になる、アップグレードが簡単になる、
収容されているアプリケーションの再構成が簡単になるという具合に、さまざまな利点が得られます。
下記もこちらのサイトの抜粋になります。
Stowを利用してソースからビルドしたソフトウェアを効率的に管理する
Stowの概要

Perlで書かれている
ソースからビルドしたソフトウェアを管理するソフト
任意のディレクトリ/usr/local/stowなどにパッケージ一式をインストール
インストールしたパッケージから/usr/lib/{bin,lib,share}にリンクを貼って利用。
バージョンの切り替えはリンク張り直しで行う(ファイルの上書きはしない)
zsh-4.3.17やzsh-5.0.0などバージョンの切り替えが容易になる(同じようなソフトのpacoと違う点)
とりあえず、ソフトウェアの管理が楽になるってことです!ド━━━━m9(゚∀゚)━━━━ン!!

早速使ってみます!
まずはstowを利用するにあたっての下準備になります。 インストールする。
sudo yum -y install stow
次に、stowで利用する管理用ディレクトリを作成します。
mkdir -p /user/local/stow/
これで下準備は完了です( ´∀`)bグッ!

何か適当なソフトウェアをインストールしてみたいと思います。
ffmpegで利用しているlibvpxを使ってみる!
libvpxのダウンロード
wget http://webm.googlecode.com/files/libvpx-v1.1.0.tar.bz2
解凍
tar xjf libvpx-v1.1.0.tar.bz2
解凍したディレクトリへ移動する
cd libvpx-v1.1.0
makefileの作成
ここで、stow管理用ディレクトリを指定してあげること。
またインストールするディレクトリ名は、バージョン名などを付与してあげる置くことで、
別バージョンが出た場合に、別々で管理できて切り替えが楽チンになります(ΦωΦ)フフフ…
./configure --prefix=/usr/local/stow/libvpx-v1.1.0
コンパイルする
make
インストールする
make install
stow管理用ディレクトリの/usr/local/stowへ移動する
cd /usr/local/stow/
stowを利用してlibvpx-v1.1.0のシンボリックリンクを張る。
stowはデフォルトで、現在いる位置からひとつ上のディレクトリを自動でシンボリックリンクに利用するため、
現在のいる位置の/usr/local/stowで実行したら/usr/localが使われる。
stow -v libvpx-v1.1.0
※stow -v /usr/local opencv-2.4.5でも同じ動作になる。

stowのオプションには、以下のものがあります。
Stowを使ってのパッケージ管理
-v または--verbose[=n] 
 Stowが何を行っているのかの詳しい説明を表示します。nは、詳しさのレベルを、0、1、2、3の4段階で表します。デフォルトは0です。単に-v または--verbose を指定すると、詳しさのレベルが1段階上がります。--verbose=n は、レベルをnにします。
-ddirectoryまたは--dir=directory
 収容ディレクトリーを、カレント・ディレクトリーではなく、directory (所望のディレクトリーへの絶対パス) にします。これによって、directory の親をデフォルトのターゲット・ディレクトリーにすることにもなります。
-tdirectory または--target=directory
 ターゲット・ディレクトリーを、現在の収容ディレクトリーの親ではなく、directory (所望のディレクトリーの絶対パス) にします。
-D または--delete
 ターゲット・ディレクトリーからアプリケーションのsymlinkを削除します。すなわち、アプリケーションの収容解除 (unstow) を行います。
-R または--restow
 アプリケーションの再収容 (restow) を行います (まず収容解除を行ってから、再度収容を行います)。このオプションは、アプリケーションのパッケージ・ディレクトリーに変更を加え、アプリケーションを更新した場合に、ターゲット・ツリーのsymlinkを更新して、不要になったものを除去するときに使用されます。
-c または--conflicts
 収容操作を実行したときに発生するかもしれない情報の不一致を検出します。このオプションは、別のオプション-n (以下参照) といっしょに使用します。ただし、間違った不一致情報が報告される可能性もあります (参考文献 には、Stowのマニュアルの中の情報の不一致に関する章へのリンクを示してあります)。
-n または--no
 収容操作は何も行わず、どんな結果になるかだけを表示します。実際の操作を何も行いませんので、stow -n を実行すると、操作を行った場合に実際に起こるはずの情報の不一致とともに、実在しない情報の不一致を報告する可能性があります (参考文献 には、Stowのマニュアルの中の情報の不一致に関する章へのリンクを示してあります)。
-V または--version
 Stowのバージョンを表示します。
-h または--help
 stowコマンドの記法を表示します。

これで、インストールは完了になります。

libvpxのバージョンがアップして、最新のものに変更した場合には次のようになります。
たとえば、libvpx-v1.1.xが出た場合には、
configureで最初にインストールしたディレクトリ名とは別名を指定する。
./configure --prefix=/usr/local/stow/libvpx-v1.1.x
後は、インストールまで行い、旧バージョンと新バージョンのシンボリックリンクの張替えを行います。
stow管理用ディレクトリの/usr/local/stowへ移動する
cd /usr/local/stow/
stow管理用ディレクトリの中には、libvpx-v1.1.0とlibvpx-v1.1.xが存在している状態になります。
# ls -alt /usr/local/stow/
合計 12
drwxr-xr-x  6 root root 4096  5月 20 13:26 2013 libvpx-v1.1.x
drwxr-xr-x  6 root root 4096  5月 20 13:26 2013 libvpx-v1.1.0
drwxr-xr-x  3 root root 4096  5月 20 13:26 2013 .
drwxr-xr-x 13 root root 4096  5月 20 11:48 2013 ..
この状態でバージョンの切り替えを行う為に、
旧バージョンの「libvpx-v1.1.0」のシンボリックリンクを切ってから、
新バージョンの「libvpx-v1.1.x」のシンボリックリンクを張る作業を行います。

旧バージョンのシンボリックリンクを切る。
stow -Dv libvpx-v1.1.0
新バージョンのシンボリックリンクを張る。
stow -v libvpx-v1.1.x
これで、バージョンの変更は完了ですワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ

以上です(`・ω・´)ゞビシッ!!
参考URL