Tag Archives: FreeBSD

[FreeBSD][メモ] ACL(Access Control Lists)を有効にする

Pocket

ACLとは、一般的なUNIXのパーミッション制御をさらに拡張したものである。
FreeBSDのハンドブックは以下の通りであるが、どうも実動作とハンドブックの内容に食い違いがあるようなのでメモ。

https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/fs-acl.html
https://www.freebsd.org/doc/en/books/handbook/fs-acl.html

ACLはファイルシステムごとに有効/無効を設定できる。
設定変更は、そのファイルシステムをumountするか、リードオンリーの状態でしかできない。
したがって、ルートファイルシステムの設定変更は、通常起動した後ではできない。

 

ACLの有効/無効化

GENERICカーネルであればACLが使える。

ACLを有効にするには、/etc/fstabの当該ファイルシステムオプションにaclsを追加し、再起動すればよい。
もちろん、ルートファイルシステム以外なら、再起動しないまでも、いったんumount、mountすればよい。
mount -uによる再マウントでは有効にならないので注意
fstab設定例は後述

 

ACLの有効/無効化のしくみ

ファイルシステムヘッダのスーパーブロックにACLの有効/無効フラグがある。tunefsコマンドでフラグを変更できる。
fstabでaclsが指定されていると、マシン起動時に、tunefsでスーパーブロックを書き換えののち、マウントされる。

 

注意点(一度ACLを有効にしたら永続…?)

ハンドブックによれば、一度ACLを有効にしたらその設定が永続する、という。
「スーパブロックフラグを設定すると、fstab に記述されていなかったり、デバイスの順番が変わってしまっても、常に ACLs が有効な状態でマウントされます」
※英語版も同じ。

 

ハンドブックとの違い?

ところが手元のマシンの動作を見ると、tunefsによる設定に関わらず、fstabのオプションしか参照していないようだ。
つまり、fstabでaclsを削ると、ACL無効でマウントされるようだ。
(fstabにaclsが無い場合、tunefs -a disableが実行される?)

それはともかく、上記を踏まえた設定例を示す。

 

fstabの設定変更

fstabのOptionsのところ、カンマに続けて「acls」と記載。
ルートファイルシステムなら、再起動。
ルートファイルシステム以外なら、umount,mountでよい。
ACLの設定はハンドブック参照。

設定前

設定後

以上。tunefsは考えなくてよし。

以下は記録。

 

tunefsのうごき

tunefs -pでACLの状態を確認できる。

tunefs -a enable/disableでACLの有効、無効を設定できる

/dev/ada0p2 は、ルートファイルシステムなのだが、そのまま起動すると、あるいは再起動するとtunefs -pの結果がdisabledに戻ってしまう。
さらに分からないのは、fstabにaclsの記載あるなしに関わらずdisabledになること。

 

実験(fstabしか見ていない…?)

fstabにaclsを記載し、あるファイルにsetfaclでACLを設定する。
ls -laで確認すると以下のように+が付く。

その後、fstabからaclsを削除し、再起動したのち、ls -laで確認すると+がない。

なお、上記の再起動前後を通してtunefs -pの結果はdisabled.

[FreeBSD] Samba 3.xからSamba 4.xへの移行

Pocket

Sambaの4.2.0リリースに伴い、3系列サポートが終了する、とのことなので、4.xに移行した。
顛末を記す。

Samba 3系列のサポート終了について

一応はソースを。
4.2.0のリリースノートに記載されている。

https://www.samba.org/samba/history/samba-4.2.0.html

With the final release of Samba 4.2, the last series of Samba 3 has been discontinued! People still running 3.6.x or earlier,should consider moving to a more recent and maintained version (4.0 – 4.2).

 

Samba 4について(Active DirectoryにしなくてもOK)

Samba 4はActive Directoryに対応しているが、従来のドメイン管理(NT4-style)もできる。
Active Directory対応の追加により、従来機能が差し替わることはないし、テストも続けられる。

なお、3から4へのアップデートで、自動的にActive Directoryへ変更されることはない。

 

移行先の選定(4.1にした)

どうせ移行するなら4.2がいいなと思ったんだけど、2015/4/28現在、4.2のports/packageはない。
しかたなく4.1にした。

 

移行にあたっての注意

4へのアップグレードにあたり注意すべきことは以下の三点である。
うっかりすると、マシン起動時にsambaが起動しなかったり、共有が消えたり、ユーザがアクセスできなくなったりする。あな恐ろし。

  1. rc.conf(マシン起動時のsamba起動設定)の書き換え
  2. samba設定ファイルの移行
  3. sambaユーザデータベースの移行

 

インストール(アップグレード)の流れ

全体の流れを示す。

  1. samba3を停める。
  2. samba3の削除
  3. samba4のインストール
  4. rc.confの書き換え
  5. 設定ファイルの移管
  6. ユーザーデータベースの移管
  7. 起動

 

Samba3の停止

アンインストールの前に。
なお、serviceコマンドで使うSambaの識別子は、3の”samba”が4では”samba_server”に変わる(後述)。

 

Samba3の削除とSamba4のインストール

pkgならsamba4のインストール時にsamba3を削除してくれる。
samba4インストール後のメッセージは超重要。

 

rc.confの書き換え

本記事の手順上、rc.confの書き換えをここに記載しているが、本来は設定ファイルの正常性確認や検証を済ませてからのほうがよい。

sambaの3と4では、rc.confの書式が違う。
ここを忘れたままだと、serviceコマンドでのsambaサーバの操作ができないし、次回のマシン再起動時にsambaが自動起動しない。

samba3だと;
samba_enable=”YES”
samba4だと;
samba_server_enable=”YES”

したがって、rc.confは以下のようになる。
もちろん、samba3の方は、不要なら削除して構わない。

 

設定ファイルの移管

sambaの3と4では、設定ファイルの場所は/usr/local/etc/の下で変更ないのだが、ファイル名が異なる。
気づかずにsamba4を起動すると共有フォルダが消える。

samba3だと;
smb.conf
samba4だと;
smb4.conf

samba3の書式はsamba4でも有効なので、コピーするかリンクを張る。
私はリンクにしておいた。

ユーザーデータベースの移管

samba向けのユーザデータベースも移管が必要である。
これをしないとユーザごとの認証ができない。
これには、ほとほと困らされた。

ユーザデータベースの置き場所は以下の通り。

samba3だと;
/usr/local/etc/samba/
samba4だと;
/var/db/samba4/private/

したがって、/var/db/samba4/privateとディレクトリを作成し、/usr/local/etc/samba/の下にあるファイルをコピーすればよい。

なお、samba4のユーザデータベース置き場をどう調べたかというと、ビルドオプションを表示させてPRIVATE_DIRを見た。
(こんなのすぐ分かるかよ!)

 

起動

起動前にtestparmでsmb4.confのチェックをするのはいい習慣であります。

では起動。
rc.confでsamba_server_enable=”YES”と記載しているなら、以下の通り。

していないなら、以下のように「onestart」にする。

以上。

[FreeBSD][メモ] pkgngで複数レポジトリ使ってる奴は1.4.3に上げておけ

Pocket

pkgngが1.4.3に上がった。
これより前のpkgngでは、複数レポジトリをうまく扱えない。
したがって、レポジトリ参照先にpourdriere等による自前レポジトリと公式レポジトリを設定している諸氏は1.4.3に上げるのが得策。

具体的には以下。
ports-mgmt/pkg: pkg install uses the wrong repository for some packages
要するに、追加したレポジトリからpkgをインストールしても、pkgngが公式レポジトリからpkgをダウンロードしようとする。

1.4.3では複数レポジトリを扱うための仕組みが追加された。
端的に言えば、複数レポジトリに優先度設定ができる。
まずpkg.confでCONSERVATIVE_UPGRADEを有効にし、各レポジトリの設定でPRIORITYを整数値で指定すれば、複数レポジトリの優先度を決められる。

詳細はman pkg.confせよ。
CONSERVATIVE_UPGRADEはこちら。

PRIORITYはこちら。

[FreeBSD] システムアップグレード時にはzpool(ZFS)のアップグレードも忘れずにNE!

Pocket

10.1-RELEASEにアップグレードしたけどzpool(ZFS)のアップグレードを忘れてたのでメモ。
アップグレードでfeaturesがいくつか追加されるから、まあやっておくのがおすすめ。
9.x系列からのアップグレードの場合は、以下を参照のこと。
[メモ]zpoolのupgrade
[メモ]zpoolのVersionについて(Versionナンバはもう使われない)

10.1-RELEASEで追加されるfeaturesは以下の通り。
詳細はman zpool-featuresせよ(手抜き)。
この中ではbookmarksがすごいと思うよ。

アップグレードが必要かどうかは、zpool statusで分かる。

前も書いたと思うけど、ZFSは「何をすべきか」まで教えてくれるのがとても助かる。
ファイルシステムなんてそんな頻繁にいじらないし、久しぶりだとコマンド忘れてしまうからね。
この場合はzpool upgradeせよと。

まず一般権限でzpool upgrade。

追加されるfeaturesを確認したらスーパーユーザでもう一度zpool upgrade。
すぐ終わる。
お約束だが、フルバックアップは取っておこうな!

FreeBSD 10.1-RELEASEのvt(4)でconsoleをうつくしく

Pocket

10.1-RELEASEの目玉機能の一つにvt(4)がある。
有名すぎるけど改めてvtが何かというと、殺風景で絶望的にクソダサいFreeBSDのコンソールを美しくするドライバである。

LANGを日本語設定にしたままコンソールでログインし、メッセージが文字化けしまくる情けなさ。
そうでなくとも、コンソールで使われるフォントはカッコ悪いように思う。
そんなガッカリ感ともサヨナラである(ただし日本語表示にはひと手間かかる!)。
みんな。今日限りコンソールドライバはvtにしちまおうぜ。

vt(4)とは

使い方を示すまえにvtについてもう少しだけ詳しく。
もとはNewcons(NEW CONSoleですな)として進められていたプロジェクトで、コンソールでの2バイト文字を含むユニコードを使えるようにしたコンソールドライバ。
くわえて、Xを使ってる時でもバーチャルターミナルを使えるし、コンソールなのにマウスでコピー&ペーストができたり、ScrLockして画面をスクロールバックしたりできる。
(FreeBSDにおいて)これはすごい。

ただ、意外にもスクリーンセーバはできないようだ。
詳細はNewcons wikiをどうぞ。
https://wiki.freebsd.org/Newcons

なお、従来のドライバはsyscons。

vtの使い方

10.1-RELEASEではデフォルトで有効にはならない。
有効にするには、/boot/loader.confに以下の記述が必要。

私は以下のように追記している。

これで再起動。

見た目の変化

これがオリジナルのコンソール。
この、フォントが気に入らないんですよ。
vt03

こうなる。
なんだろう…。20世紀の8bitパソコンのような趣がありますな。
vt01

日本語フォント

よしじゃあ次は日本語フォント!と思ったのだが、冒頭のnewcons Wikiを見るとCJKフォントは「In progress」、つまり「まだ」である。(2014/11/23現在)
とはいえ全く表示できないか、というとそうではなく。このあたりを参考に進めてみた。
具体的には、ユニコードなビットマップフォントをダウンロードしてきてvidcontrolで指定してあげればよい。
vidcontrolでの操作はコンソールでやること。

さすればこのように。
vt02

以上

rsyncのディレクトリ指定でエスケープの必要な文字を含めるには

Pocket

先に結論:ダブルクオーテーションで括ればよい。

rsyncの対象ディレクトリでカッコ「()」など、エスケープの必要な文字の含まれているケースがある。
たとえば、Sambaでサービスしている共有フォルダとか。
そのままディレクトリ名をrsyncに与えてしまうと、とても面倒なことになる。

どうするか。
ダブルクオーテーションで括ればよい。
ふむ。よろしい。
ではディレクトリがリモートにある場合、どこからどこまでを括ればよいの?
以下の通りである。
192.168.1.1にsomeoneでログインした先のディレクトリを手元にsyncする場合。

参考
http://serverfault.com/questions/234876/escaping-spaces-in-a-remote-path-when-using-rsync-over-a-remote-ssh-connection

以上。

[メモ][Python][SQLite] 巨大なSQLiteデータベースからレコードを取り出すには

Pocket

PythonでSQLiteのデータベースからデータを抜き取るときには何種類か方法がある。

  1. fetchallで一気に取得する方法
  2. fetchoneを繰り返す方法
  3. fetchmanyで数行ずつ取得する方法

である。

fetchoneはダルいから、いままではfetchallを使っていた。
単純に気持ちの問題なんだけれども、根こそぎぶっこ抜いてリストにいったん入れてしまえば、あとはフッツーのPythonで流儀で操作できるからである。
しかし。この方法には問題がある。
fetchallで全部を取り出した先はどこかと言えば、メモリである。
つまり、データベースが巨大になるほど、メモリをバカ食いするわけである。
これはたまらん。

そこで以下のようにする。

データベースから1000行ずつ取り出し、かつ、1行ずつyieldする。
メモリ使用量も抑えて、かつスピードも出る方法である。

元ネタは以下。
Use generators for fetching large db record sets (Python recipe)
http://code.activestate.com/recipes/137270-use-generators-for-fetching-large-db-record-sets/

[FreeBSD][メモ] pkg 1.3.7による問答無用の全パッケージ再インストールを避けるには

Pocket

pkgを1.3.7にアップグレードすると、インストール済み全パッケージの再インストールが求められる。
この回避方法について示す。

そもそも、なんでそんな事になっているかというと。
端的に言って、パッケージシステムでのshared libraryの扱いに難があったため、1.3.7でキッチリ修正したのだと。
その影響で、何も知らずにパッケージをアップグレードしようとすると、「shared libraryに変更があったため」と全パッケージを再インストールしようとしてしまう。

もちろん、別に全部再インストールしたって問題ないわけだが、帯域も時間も電気ももったいないので、再インストールを必要最低限に止める方法が公儀から発表された次第である。

詳細は以下をご覧あれ。

http://lists.freebsd.org/pipermail/freebsd-ports-announce/2014-August/000086.html

手順1.なにはともあれpkgを1.3.7に

2014/8/28現在である。

キター。
さっそくpkgをアップグレードする。

オゲ。

手順2.レポジトリカタログの強制更新とパッケージ解析

pkgをアップグレードした瞬間にレポジトリカタログの更新も走っている。
したがって、もう一回pkg updateする必要はないのだが、念のため手順に沿ってもう一回やる。

当たり前だがアップデートも削除もなし。
次。
手順によるとpkg check -Baせよと。
これは何かというと、下記の通りインストール済みshared librariesを解析するものだそうな。
つまりこの解析の結果、全ファイル再インストールという事態を避けられるわけですな?

以下、-B, -aのオプション説明をmanから抜粋。

実行…するが、ひょっとすると時間がかかるかも。
仮想マシン、かつ750個くらいパッケージがある状態で1時間近くかかった。
しかし実マシン(hp microserver)、120個くらいで2分。
パッケージの数、装置スペックによって前後するだろうが覚悟のこと。

改めて実行。

あとは通常通りpkg upgradeでよい。
理不尽な再インストールを求められることもありません。

[FreeBSD][pkgng][メモ] pkgを1.2から1.3に上げたらneed to re-create repo FreeBSD to upgrade schema version

Pocket

pkgを1.2から1.3.xに上げたら以下のようなメッセージが出てupgradeができない。

need to re-create repo とか言いつつ、どうすればいいのか書いてないし。
調べたところ、pkg update -fすればいいとのこと。

incremental update completedとのこと。
この状態でpkg upgradeすると、確かに動いた。
表示も少し親切になっていますな。

しかもconflictsを検知してくれるみたい。

以上。

[メモ] sambaのパスワードファイルに登録されているユーザ一覧を表示するには

Pocket

smbpasswdにはそういった機能がない。
pdbedit -Lを使う。

pdbeditとは

manによれば「SAM database(sambaユーザデータベース)を管理するコマンド」

ユーザデータベースに登録されているユーザアカウントをすべて表示する。
「ユーザ名:uid:フルネーム」という書式で表示。
以下、実行例はすべてmanから。

-vを付けると詳細に。

そのほかのオプションはpdbedit –helpあるいは、もちろんman。