Tag Archives: FreeBSD

[zfs][zpool] zfsの別ディスクへの移行

Pocket

zpoolを容量の多い別HDDに移したのでメモ。
一度、同じようなことはやっているが、時間も経っているので。
最初に書いておくが移行元でまずscrubしておくこと。

流れとしては以下の通り。

  1. 移行元HDD
    1. scrubしておく
    2. snapshot
  2. 移行先HDD
    1. GPTでzfsのパーティションを作成
    2. zpool作成
  3. zfs send, recvで丸々コピー

以下、実作業に触れる前に補足。

方針についての補足

なぜmirrorにしないのか

上記の方法のほかには、追加のディスクをmirrorとしてzpoolに追加し、resilveringが終わったら旧ディスクを外してexpandという手がある。
が、その手は採らない。
実は、zpool statusをする都度、以下のメッセージが表示されていた。
旧ディスクは512Bセクタになっていると文句を言っているのである。
ディスクを交換するか、新Poolに移せ、と。

  pool: vault
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
        Expect reduced performance.
action: Replace affected devices with devices that support the
        configured block size, or migrate data to a properly configured
        pool.
  scan: scrub repaired 0 in 8h3m with 0 errors on Sun Nov  4 04:16:39 2018
config:

        NAME        STATE     READ WRITE CKSUM
        vault       ONLINE       0     0     0
          ada1      ONLINE       0     0     0  block size: 512B configured, 4096B native

 

512Bセクタのpoolにmirrorを追加したら、やっぱり512Bになるんではと心配になったので、mirrorではなく新規ディスクの新規Poolに移す。

なぜディスクをまるっと使わずgptでパーティションを切るのか

zpoolは、わざわざgptパーティションにしなくても、ディスクをまるっと使ってzpoolに指定できる。
できるのだが、/dev/ada2なんて名前よりも、gptラベルでpoolを作成したいのである。
これの有利な点は、例えば当該ディスクの物理的な位置で名前を付けることができる点である。
具体的には、slot_1とか名前を付けておくと、ディスク交換の時に楽。
幸いにもFreeBSDにおいては、gptパーティションを切ってもディスクをそのまま使っても、いずれもパフォーマンスに違いはない。
それならgptにしましょう。

https://www.freebsd.org/doc/handbook/zfs-zpool.html
There is no performance penalty on FreeBSD when using a partition rather than a whole disk.
(2018/11/09)

ではさっそく作業を。

実作業(移行元ディスクの準備)

scrubをしておく。

zpool scrub で。
かなり時間がかかるので覚悟しておくように。
なおscrubは最低3か月に一回が推奨
https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-scrub
recommended at least once every three months

作業直前にsnapshot。

pool内に複数のディレクトリがある場合、最上階層でsnapshot -r(recursive)すればよい。
たとえばvaultというpoolにchamber, itunesがある場合に;

vault
vault/chamber
vault/chamber@20170503
vault/itunes
vault/itunes@20170503

※zfs list -t allの出力を一部削除したもの

zfs snapshot vault@20181109とすれば;

vault
vault@20181109
vault/chamber
vault/chamber@20180503
vault/chamber@20181109
vault/itunes
vault/itunes@20180503
vault/itunes@20181109

※zfs list -t allの出力を一部削除したもの

となる。いちいち各ディレクトリ配下でコマンドを叩かなくてよい。

 

移行先作業

GPTパーティションの作成

以下のようなディスク

ada3 at ahcich3 bus 0 scbus3 target 0 lun 0
ada3: ACS-3 ATA SATA 3.x device
ada3: Serial Number WD-WCC7K3PU64NE
ada3: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada3: Command Queueing enabled
ada3: 3815447MB (7814037168 512 byte sectors)

GPTスキームをcreateし、全領域をfreebsd-zfsに割り当てる。
このとき、-lオプションでラベルを付ける。
同じくgpart showに-lオプションを付ければ名前を確認できる。

# gpart create -s GPT ada3
ada3 created
# gpart add -l slot_4 -t freebsd-zfs /dev/ada3
ada3p1 added
$ gpart show ada3
=>        40  7814037088  ada3  GPT  (3.6T)
          40  7814037088     1  freebsd-zfs  (3.6T)

$ gpart show -l /dev/ada3
=>        40  7814037088  ada3  GPT  (3.6T)
          40  7814037088     1  slot_4  (3.6T)

zpoolの作成

/dev/ada3ではなくGPTラベルで指定する。
GPTラベルで指定するときは、gpt/<GPTラベル>というように指定する。

# zpool create warehouse gpt/slot_4
# zpool status warehouse
  pool: warehouse
 state: ONLINE
  scan: none requested
config:
        NAME               STATE     READ WRITE CKSUM
        warehouse          ONLINE       0     0     0
          gpt/slot_4  ONLINE       0     0     0

プロパティの変更

zfsを作成する前に。
圧縮モードをlz4にする。lz4はCPU負荷の割には非常に効率が良いので積極的に有効にしたい。
また、atime(アクセスタイムの記録)もoffに。これがonだと差分snapshotが失敗するから、というのが一つと、これをoffにするとパフォーマンスが上がる(can result in significant performance gains)から。
zfs get <プロパティ名> で現在の値を取得。
zfs set <プロパティ名>=<値> で値のセット。
圧縮モードのプロパティ名はcompression、atimeはatime。

$ zfs get compression warehouse
NAME       PROPERTY     VALUE     SOURCE
warehouse  compression  off       default
$ zfs get atime warehouse
NAME       PROPERTY   VALUE     SOURCE
warehouse  atime      on        default

# zfs set compression=lz4 warehouse
# zfs set atime=off warehouse
$ zfs get compression warehouse
NAME       PROPERTY     VALUE     SOURCE
warehouse  compression  lz4       local
$ zfs get atime warehouse
NAME       PROPERTY   VALUE     SOURCE
warehouse  atime      off       local

ディレクトリの用意とsend/recv

# zfs create warehouse/itunes
# zfs create warehouse/chamber

このとき、勝手にマウントされないようにすべきだった。-uを付ければよかったかな。
いずれにせよzfs set mountpointで後から変えられる。

sendに-Rを付けると、子孫やスナップショットもまとめてsendされる。

# zfs send -R vault/chamber@20181109 | zfs receive warehouse/chamber
# zfs send -R vault/itunes@20181109 | zfs receive warehouse/itunes

かかった時間、容量は以下の通り。うーむ。ちょっとかかったかな。

 991GiB 3:09:00 [89.5MiB/s]
1.10TiB 3:58:24 [80.3MiB/s] 

このとき適当にhtopを叩いた結果。CPU負荷はそんなんでもないので、ボトルネックは別のところにあるように思われる。

  1  [|||||||||||||||||||||                47.6%]   Tasks: 43, 0 thr; 2 running
  2  [|||||||||||||||||                    37.7%]   Load average: 0.91 1.77 1.86 
  Mem[||||||||||||||||||||||||||||||||642M/1.84G]   Uptime: 12:03:30
  Swp[|||||||||                        176M/907M]

なおCPUはAMDのTurionである。

compression=lz4の結果は.
プロパティused(HDD上の容量)とlogicalused(圧縮前容量)で調べられる。

warehouse  used                  2.00T                    -
warehouse  logicalused           2.02T                    -

本来なら2.02Tのところ、2.00Tで済んでる。

これで引っ越し完了。

以上

[メモ][FreeBSD] 複数Jailのpkg upgradeを一気に済ませたい

Pocket

メモ。

jailのpkg操作は、いちいちそのjailの中に入らなくてもpkg -j <jail名 or jail ID> …というように-jオプションを付与すればできる。

しかしjailの指定は、個々に行う必要がある。
たとえばpkg -j * upgradeというように、ワイルドカードを使うようなことは、もってのほかのようである。
jailなんてどんどん増えていくのに、いちいち-jで指定していくのもなあ。
仕方ないんで、やっつけでパイプを繋いで実現。

jls -N|tail -n +2|cut -f2 -d" "|xargs -I{} sudo pkg -j {} upgrade

以上

[slack][hubot][jail][メモ] FreeBSD Jailでhubotを飼う

Pocket

slackにhubotを住まわせる記事は山のようにあるが、それを「hubotを自前サーバ」「それもFreeBSDに」という条件にすると記事数が激減する。

そんななか、四苦八苦してなんとか達成したのでここに採録。
なお、そっけなく不親切に見えるのは、ここまでたどり着くのに疲労困憊したから。
ではどうぞ。

jailの作成

フッツーに。
以下ではqjailを使っているがezjailでもなんでも、好きなのを使いたまえ。

sudo qjail create hubot -4 192.168.200.1

 

npmのインストール

まずjailをスタートさせて中に入ろうか。
そしてnpmのインストール。

sudo qjail console ex02
pkg install npm

node, npmのバージョンを確認しておく。
問題なくインストールされているかの確認でもある。

node -v
npm -v

 

generatorのインストール

npm install -g yo generator-hubot

 

hubot用ユーザの作成

jailの中でadduserし、お好きなユーザを作る。
以下では「bot」というユーザ。

adduser bot

 

hubot用ユーザでhubotレポジトリ作成

su - bot
mkdir hubot
cd hubot
yo hubot --adapter slack

botホストの作業はいったんはここまで。
以降、slack側で。

 

slackにhubotのインストール

slackのteamメニューからApp&Integrations > Hubotをインストール
表示されるAPI Tokenを記録する。
hubotがslackへアクセスするためのトークン。

 

botホストで起動スクリプトの作成

再びbotホスト
/usr/local/etc/rc.d/hubotとして以下を作成。
試行錯誤で作ったから雑なスクリプトであることに注意。
それから実行権限付けるのを忘れないこと。

#! /bin/sh
#
#
# PROVIDE: hubot
# REQUIRE: DAEMON
# KEYWORD: shutdown
# $Id: hubot,v 1.3 2016/04/16 12:57:03 root Exp $

. /etc/rc.subr

name=hubot
rcvar=hubot_enable

command=/usr/home/bot/hubot/bin/hubot
command_args="--adapter slack"

hubot_user=bot

pidfile="/var/run/${name}.pid"
procname=node

start_cmd="${name}_start"

hubot_start()
{
        export HUBOT_SLACK_TOKEN=xoxb-xxxx-xxxxx
        export PATH="$PATH:/usr/home/bot/hubot/bin:/usr/local/bin"
        cd /usr/home/bot/hubot
        echo "starting hubot"
        /usr/sbin/daemon -p ${pidfile} -u ${hubot_user} ${command} ${command_args}
}

load_rc_config $name
run_rc_command "$1"

 

起動確認

/etc/rc.confにhubot_enable=YESを記載。
service -l でhubotがリストされることを確認したら、service hubot startで起動。

以下のような表示が出ればOK。

[Sat Apr 16 2016 21:55:52 GMT+0900 (JST)] INFO Connecting...
[Sat Apr 16 2016 21:55:53 GMT+0900 (JST)] INFO Logged in as xxx of xxxxxx, but not yet connected
[Sat Apr 16 2016 21:55:54 GMT+0900 (JST)] INFO Slack client now connected
[Sat Apr 16 2016 21:55:55 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web-url | cut -d= -f2)`
[Sat Apr 16 2016 21:55:55 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379

 

ポートフォワーディングの設定。

前章の起動時メッセージ、「INFO hubot-redis-brain: Using default redis on localhost:6379」に注目。
6379でポート待ち受けている。
ご家庭のサーバで動かしている場合には、ルータでのポートフォワーディング設定を忘れずに。
なお2016/4/16現在、slackの側でサーバのIPアドレスを指定したりするような設定は不要。

 

slack側の確認

slackでbotを住まわせたいchannelにInvite。
botの名前の左側に在席マークが点いているのを確認し、「@<bot名> ping」とし、botからPONGと帰ってきたら成功。
もし起動時メッセージが不要であれば、以下のように/usr/sbin/daemonのオプションに-fを加えるとよい。

/usr/sbin/daemon -f -p ${pidfile} -u .....

[sh] オレオレ証明書作成シェルスクリプト

Pocket

すぐに作り方を忘れるので、シェルスクリプトを記録しておく。
変数OPENSSLにopensslをフルパスで与えること。
あとはchmod 755して実行すればカレントディレクトリにserver.crtとserver.keyができる。
おまけでDHパラメータ、dhparam.pemもできる。

#!/bin/sh

# Generates a self-signed certificate.

OPENSSL=/usr/bin/openssl
KEYFILE=server.key
CERTFILE=server.crt
SIGNREQ=server.csr
DHPARAM=dhparam.pem

if [ -f $CERTFILE ]; then
  echo "$CERTFILE already exists, won't overwrite"
  exit 1
fi

if [ -f $KEYFILE ]; then
  echo "$KEYFILE already exists, won't overwrite"
  exit 1
fi

if [ -f $SIGNREQ ]; then
  echo "$SIGNREQ already exists, won't overwrite"
  exit 1
fi

echo
echo "Generating key file, $KEYFILE"
echo "============================"
$OPENSSL genrsa 2048 > $KEYFILE || exit 2
chmod 0600 $KEYFILE
echo "============================"
echo
echo "Generating sign request file, $SIGNREQ"
echo "============================"
$OPENSSL req -new -key $KEYFILE > $SIGNREQ || exit2
echo "============================"
echo
echo "Generating cert file, $CERTFILE"
echo "============================"
$OPENSSL x509 -days 3650 -req -signkey $KEYFILE < $SIGNREQ > $CERTFILE || exit2
echo "============================"
echo
echo "Generating DH key, $DHPARAM"
echo "============================"
$OPENSSL dhparam -out $DHPARAM 2048
echo "============================"
echo
echo "Now you have $CERTFILE, $KEYFILE and $DHPARAM"
echo

参考
http://d.hatena.ne.jp/rikunora/20120514/p1
http://qiita.com/kunichiko/items/12cbccaadcbf41c72735

[メモ][Vagrant] FreeBSDのboxを作る。

Pocket

インストール時設定

容量節約のためにgame, srcはインストールしない。
rootのパスワードはvagrantに。
ユーザvagrantを追加、パスワードもvagrantに。
sshdは有効に、dumpdevは無効に。

/etc/rc.confの中身

hostname="freebsd10"
keymap="jp.106.kbd"
ifconfig_em0="DHCP"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"

インストール後設定

まずはOSの更新。

# freebsd-update fetch install
src component not installed, skipped
Looking up update.FreeBSD.org mirrors... none found.
Fetching public key from update.FreeBSD.org... done.
(略)

pkgのインストール

pkgをインストールするには、pkg listでもなんでも叩けばインストールしてくれる。

# pkg list
The package management tool is not yet installed on your system.
Do you want to fetch install it now? [y/N]: y
(略)

sudoのインストール

vagrant用に。

# pkg install sudo

ユーザvagrantにパスワードなしのsudo権限を与える。

requirettyがあればコメントアウト。

# visudo

vagrant ALL=(ALL) NOPASSWD: ALL

ユーザvagrantのssh key設定

定番のキーをauthorized_keysとしてダウンロードし、パーミッションを設定する。

# mkdir -p /home/vagrant/.ssh
# cd /home/vagrant/.ssh
# fetch --no-verify-peer -o authorized_keys https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub
fetch: https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub: size of remote file is not known
authorized_keys                                         80 kB  225 kBps 00m00s
#
# chmod 700 ~vagrant/.ssh
# chmod 600 ~vagrant/.ssh/authorized_keys
# chown -R vagrant:vagrant ~vagrant

sshd設定の変更

/etc/ssh/sshd_configに以下を追加。

Port 22
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
PermitEmptyPasswords no
UseDNS no

空行、コメント行を除くとこんな感じ。

# egrep -v '^ *#|^ *$' ./sshd_config
Port 22
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
PermitEmptyPasswords no
UseDNS no
Subsystem       sftp    /usr/libexec/sftp-server

sshdを再起動

# service sshd restart
Performing sanity check on sshd configuration.
Stopping sshd.
Performing sanity check on sshd configuration.
Starting sshd.

VirtualBox Guest Additonsは必要か。

FreeBSDのGuest Additionsで以下が可能になる。
https://wiki.freebsd.org/VirtualBox

Clipboard sharing
Mouse pointer integration
Host Time synchronization
Window scaling
Seamless mode

逆に言うと、以上が必要なければわざわざ入れることもない。
もしXを入れないのであれば、インストールしないほうがよい。
pkgのGuest AdditionsはX11のサポートがOnになっており、そのままインストールすると山ほどpackageを追加されるから。
ではportsからコンパイルする?
まずportsディレクトリが必要。
さらに、実はGuest AdditionsのコンパイルにはKernelソースが必要なので、/usr/srcも必要。
しかもportsからのコンパイルするとperlやらgmakeやら、いろんなもののコンパイルが発生する。
本当におすすめしない。

Guest Additionsのインストール

インストールする場合には、pkgからvirtualbo-ose-additonsを。
search -fすると分かるが、X11がOnになっている。

$ pkg search -f virtualbox-ose-additions
virtualbox-ose-additions-4.3.30
Name           : virtualbox-ose-additions
Comment        : VirtualBox additions for FreeBSD guests
Description    :
These additions are for installation inside a FreeBSD guest.

Options        :
        DEBUG          : off
        OPENGL         : off
        X11            : on

$ pkg install virtualbox-ose-additions<\pre>

/etc/rc.confの変更
$ sudo sysrc vboxguest_enbale=YES
vboxguest_enbale:  -> YES
$ sudo sysrc vboxservice_enable=YES
vboxservice_enable:  -> YES

念のため確認

$ sudo sysrc vboxservice_enable
vboxservice_enable: YES
$ sudo sysrc vboxguest_enbale
vboxguest_enbale: YES

仮想マシンをパッケージする

シャットダウンしたのち、ホストマシンで梱包
–boxに続けてVirtualBox上の名前を入れる。

vagrant package --box FreeBSD10

できたpackage.boxは約1Gバイト。うーん。ちょっとでかいなあ。

[FreeBSD] jailのetcを更新する(qjail)

Pocket

qjailだと、ここで示したようにqjail update -bでjailのバイナリアップグレードをしてくれる。

アップグレードといっても、ホストのバイナリをjailのsharedfsにまるまるコピーしているだけである。
ということは、通常のアップグレードで更新されるはずの/etc下ファイルには一切、手を付けないということ。

jailのetc更新にはmergemaster

実はmergemasterは更新するフォルダを-Dオプションで選ぶことができる。
つまり、ホストのsrcをベースにjailのetcを更新できる。

jailの/etcを更新するには

jail ex01を更新する場合は、以下の通り。-D以外のオプションはUPiF。

$ sudo mergemaster -UPiFD /usr/jails/ex01/

新しくjailを作る際のテンプレートも更新しておく。

$ sudo mergemaster -UPiFD /usr/jails/template/

以上

[FreeBSD][メモ] PlexConnectに関する情報

Pocket

PlexConnect

https://github.com/iBaa/PlexConnect

最低限入れておくべきもの(jailを想定)

  • plexmediaserver(これは当然)
  • ca_root_nss
  • python2.*

スタートアップスクリプト

/usr/local/etc/rc.dに設置。
/etc/rc.confにplexconnect_enable=”YES”

#! /bin/sh
#
#
# PROVIDE: plexconnect
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name="plexconnect"
rcvar=plexconnect_enable

command="/usr/local/bin/python"
pidfile="/var/run/${name}.pid"
plexconnect_flags="/usr/local/PlexConnect/PlexConnect_daemon.py --pidfile $pidfile"
eval ${name}_flags=\"${plexconnect_flags}\"


load_rc_config $name
run_rc_command "$1"

[FreeBSD] pkg quarterlyとlatestレポジトリの共存

Pocket

ここでも触れたが、10.2-RELEASEから、pkgレポジトリのデフォルト参照先がlatestからquarterlyになった。
具体的には/etc/pkg/FreeBSD.confの内容が変わった。

だからして、引き続きlatestを参照したい場合には、/etc/pkg/FreeBSD.confを書き換えればいいや、と思っていたものの、どうもこのファイルは「なるべく触るな」ということのようである。

つまり、もしもの時にlatestを参照する場合には、quarterly(すなわちデフォルト)の他に、latest向けのレポジトリ設定ファイルを作る必要がある。

それぞれを、いちいちenable/disableするのも面倒なので、latest、quarterlyの双方を参照するよう、Multi-repositoryの設定をした。

本記事ではMulti-repositoryの設定方法について示す。
と同時に、普段はquarterlyを使い、特定のときだけlatestを使うための方法を示す。

まずデフォルトの/etc/pkg/FreeBSD.confについて

/etc/pkg/FreeBSD.confは触るな

/etc/pkg/FreeBSD.confの中身を見てみると、以下のような記載がある。

# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

すなわち、この設定を無効化したい場合には、/etc/pkg/FreeBSD.confは触らずに、/usr/local/etc/pkg/repos/FreeBSD.confを作ったうえで、無効化の宣言をしろ、ということである。

/etc/pkg/FreeBSD.confはデフォルト設定として扱いたい雰囲気丸出しであるが、そうならrc.confのデフォルト設定が/etc/defaultsの下にあるように、/etc/pkg/defaults/FreeBSD.conf的なものを作ってくれても良いのではないかと思った。

しかしそもそも、レポジトリの設定ファイルはどのように読み込まれるのであろうか。

レポジトリ設定ファイルの読み込まれる順番

/usr/local/etc/pkg.confで指定する。
上記ファイルの中に、REPOS_DIRがある。
pkgは、ここに記載された順番通りにレポジトリ設定ファイルを読み込む。
特に変更していないのであれば、内容は下記の通り。

REPOS_DIR [
    "/etc/pkg/",
    "/usr/local/etc/pkg/repos/",
]

仮に複数のディレクトリに、同じレポジトリに対する設定ファイルがあったならば、後から読み込まれたもので上書きされる。
同じディレクトリに複数のファイルがあったならば、ファイルはアルファベット順に読み込まれる。

以下、マニュアルからの引用

Repositories are processed in the order they are found on the REPOS_DIR search path, with individual repository configuration files in the same directory processed in alphabetical order. Settings from files later in the search path will override those from earlier ones.

だから、/etc/pkg/FreeBSD.confのコメントに書いてある通り、/usr/local/etc/pkg/repos/FreeBSD.confでFreeBSDレポジトリを無効にする宣言をすると、設定が上書きされ、めでたくFreeBSDレポジトリは無効になる。

ところで、同じディレクトリ内の読み込み順序はアルファベット順、というのがキモで、実はレポジトリの名前と設定ファイルの名前は別々でも構わない。
だから、読み込ませたい順番に応じて、ファイル名の頭に数字を入れてもよい。

latestレポジトリ向けの設定はどこに?またどうやって?

さて。
仕組みはわかった。
どうも/etc/pkg/は触ってほしくないようだから、/usr/local/etc/pkg/reposにlatest向けの設定ファイルを置けばよいのだろう。
しかしちょっと待て。
latestとquarterlyを両立させるにはどのようにしたら良いのであろうか。

レポジトリの優先度について

複数のレポジトリを参照する場合、どちらをどの程度優先するか。
レポジトリ設定ファイルにpriorityという設定項目があるので、それを使えば優先度の設定ができる、ようだが。

以下はマニュアル。

PRIORITY: integer    Set the priority of the repository.  Higher
                     values are preferred.  Default: 0

レポジトリ設定ファイルにPRIORITYで優先度を指定すればよい。
数値が高ければ高いほど、優先度が高い。

ふむふむ。
では、動作は?

優先度設定されたときの動作

WORKING WITH MULTIPLE REPOSITORIES
  Where several different repositories are configured pkg will search
  amongst them all in the order specified by the PRIORITY settings in the
  repo.conf files, unless directed to use a single repository by the -r
  flag (略)

「複数のレポジトリが与えられた場合、pkgは、-rで参照先レポジトリを明示されない限り、PRIORITYの順番で検索を行う。」

ほほう。なるほど。
続けて読む。

  Where several different versions of the same package are available, pkg
  will select the one with the highest version (略)

「異なるバージョンのpackageが見つかった場合、最も高いバージョンが選ばれる。」

アレ!? 話が思わぬ方向に向かってきたよ!
優先度の高いレポジトリからインストールしてくれるんじゃないの!?

  even if a lower numbered version can be found in a
  repository earlier in the list

「低いバージョンが優先度の高いレポジトリにあったとしてもこの動作は変わらない。」

Oh…。

  This applies even if an explicit version is stated on
  the command line.  Thus if packages example-1.0.0 and
  example-1.0.1 are available in configured repositories(後略)

「さらにさらに、仮にバージョンを指定してインストールを実行しても、
動作は変わらない。
高いバージョンが見つかったら問答無用で新しい方をインストールする。」

ぐぬぬ。

基本、quarterlyを使い、特定のときだけlatestを使うためには

上記の動作を踏まえ、基本、quarterlyを使い、特定のときだけlatestを使うためには、以下の方法がある。

A. 都度、レポジトリ設定ファイルを使い分ける。
B. マルチレポジトリにしつつ、インストール時に考慮をする。

ここでA.を選ぶと芸がないので、B.の方法を示す。
B.の方法と言っても、以下の通りでOK。

最初にquarterlyレポジトリからインストールする。
-rオプションで参照先レポジトリを明示すること。

pkgは、そのpackageをどこからインストールしたかを覚えている。
後に示す設定を変えない限り、アップグレードの際には同じレポジトリを参照してくれる。
だから、最初のインストールでquarterlyを選んでおけば、次回アップグレードのときにも、原則としてquarterlyが選ばれるというわけ。

これをコンサバティブアップグレード(conservative upgrade)といい、pkg.confでデフォルト有効になっている。

  CONSERVATIVE_UPGRADE: boolean
    Ensure in multi repository mode that the priority is given
    as much as possible to the repository where a package was
    first installed from.  Default: YES.

説明を読むと;

  To override this
  behaviour, on first installation of the package select the repository
  with the appropriate version:
     pkg install -r repo-a example-1.0.0
  and then to make updates to that package ``sticky'' to the same reposi-
  tory, set the value CONSERVATIVE_UPGRADE to true in pkg.conf.

「(常に高いバージョンを選ぶ)この動作を変更するには、最初のインストールで
-rオプションによりレポジトリを選ぶ。
その後のアップグレードで同じレポジトリを使うには、pkg.confの
CONSERVATIVE_UPGRADEでtrueを選べばよい。」

以上

[メモ] 写真、ホームビデオ等をため込んだFreeBSDホストのjailにPlex Media Serverをインストール

Pocket

件名の通り。
FreeBSDホストに格納してある写真、動画を各種メディアプレイヤー向けに公開したいが、オリジナルのホストを直接は公開したくないな、というときのため。
jailなら物理的に同じマシンを使いつつ、論理的には別マシンとして振る舞えるので適任である。

jailの作成

jailとくればezjailが定番だが、私はqjailが好き。
qjailについてはこちらを。

以下、qjail installまで終わっている前提で勧める。

flavorにssh-defaultを選んでplexという名前で作成。

$ sudo qjail create -f ssh-default -4 192.168.200.19 plex
Successfully created  plex
$ sudo qjail list

STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------
DS  N/A  bge0 192.168.200.19     plex

jail plexをスタートし、pkgをインストール
インストールはとにかくpkgコマンドを叩けばOK。

$ sudo qjail start plex
Jail successfully started  plex
$ sudo qjail console plex
FreeBSD 10.2-RELEASE (GENERIC) #0 r286666: Wed Aug 12 15:26:37 UTC 2015

Welcome to your FreeBSD jail.
plex /root >
plex /root > pkg info
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
[plex] Installing pkg-1.5.6...
[plex] Extracting pkg-1.5.6: 100%
Message for pkg-1.5.6:
If you are upgrading from the old package format, first run:

  # pkg2ng
(略)

plexmediaserverインストール

そのままplexmediaserverをインストール。
もちろん、マシンは64bitです。

plex /root >uname -a
FreeBSD plex 10.2-RELEASE FreeBSD 10.2-RELEASE #0 r286666: Wed Aug 12 15:26:37 UTC 2015     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
plex /root >pkg install plexmediaserver
(略)
The following 2 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        plexmediaserver: 0.9.12.8.1362
        compat9x-amd64: 9.2.902000.201310
(略)
[plex] [1/2] Installing compat9x-amd64-9.2.902000.201310...
[plex] [1/2] Extracting compat9x-amd64-9.2.902000.201310: 100%
[plex] [2/2] Installing plexmediaserver-0.9.12.8.1362...
===> Creating users and/or groups.
Creating group 'plex' with gid '972'.
Creating user 'plex' with uid '972'.
[plex] [2/2] Extracting plexmediaserver-0.9.12.8.1362: 100%
Message for plexmediaserver-0.9.12.8.1362:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

multimedia/plexmediaserver includes an RC script:
/usr/local/etc/rc.d/plexmediaserver

TO START PLEXMEDIASERVER ON BOOT:
sysrc plexmediaserver_enable=YES

START MANUALLY:
service plexmediaserver start

Once started, visit the following to configure:
http://localhost:32400/web

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
plex /root >

plexmediaserver起動

rc.confに一行加えてさっさと起動。

plex /root >sysrc plexmediaserver_enable=YES
plexmediaserver_enable:  -> YES
plex /root >service plexmediaserver start
Starting plexmediaserver.
plex /root >

ブラウザからhttp://<IPアドレス>:32400/webに繋ぐ。
もし「このサーバに権限(permission)がない」というようなことを言われたなら、以下のファイルを変更するといいかもしれない。
「かもしれない」というのは、以下の通り変更したら症状が改善したので、確認のために戻してみたら、二度と症状が再現しないから。
うーん…。

/usr/local/plexdata/Plex Media Server/Preferences.xml

Preferences (略)allowedNetworks="192.168.1.0/255.255.255.0"

いったんそのままにしておく。

plexmediaserver向けにディレクトリをマウント

jailから抜けてホスト側で作業
jailであるplexのファイルシステムは、ホスト側では/usr/jails/plexにある。
/usr/jails/plex/がjail plexのルートディレクトリ。
だからホストの/warehouseにデータがあるとして、/usr/jails/plex/mediaにマウントすれば、jail plexでは/mediaとして見える。

せっかくだからread onlyでね。

$ sudo mount_nullfs -o ro /warehouse /usr/jails/plex/media

jail plexから見えるのを確認したら、ホスト側のfstabに書き込み。

$ sudo sh -c "mount -p|grep /usr/jails/plex/media >> /etc/fstab"

あとはブラウザからplex media serverにつないで、メディアの追加で/mediaを選ぶだけ

以上

[FreeBSD] 10.2-RELEASEから適用されるpkg quarterlyてなんだ。

Pocket

10.2-RELEASEから、pkgのデフォルト参照先レポジトリが”quartely”のものになる。

◎pkg.confの変更

-# $FreeBSD: releng/10.1/etc/pkg/FreeBSD.conf 263938 2014-03-30 15:29:54Z bdrewery $
+# $FreeBSD: releng/10.2/etc/pkg/FreeBSD.conf 285830 2015-07-23 23:31:40Z gjb $

 FreeBSD: {
-  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
+  url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
}

ご覧のとおり、いままでは”latest”。
これは言わばpkgのheadのようなもので、最新のpkgは手に入るものの、うっかりインストールすると地雷を踏むことがが多かった。

quarterlyは上記の問題を解決するために設けられる。
中の人によれば「意図的に更新速度を控えめにすることで、問題の発生を抑える一方、セキュリティ更新は受け取れるようにする」とのこと。
もちろん、望ならば今まで通りlatestを参照することもできる。

“In general, the quarterly package set is less prone to having build failures, since the changes in the branch are (by intent) less intrusive, while still receiving security updates. “

latestからquarterlyに変更してバージョンチェックしてみると、すでにインストール済みのpackageからバージョンの下がるケースも見られた。

python27-2.7.10                    >   succeeds remote (remote has 2.7.9_1)

詳細は待て10.2-RELEASEのアナウンス。

“(This will be noted in the final 10.2-RELEASE announcement, as well as
the release notes, and will also include instructions on how to switch
to the ‘latest’ branch if that is what is desired.)”

中の人の発言は以下から引用。
https://lists.freebsd.org/pipermail/freebsd-stable/2015-July/082905.html