サイズ: 4850
コメント:
|
← 2021-05-19 03:55:38時点のリビジョン63 ⇥
サイズ: 36024
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 2: | 行 2: |
FreeBSD 13.0-RELEASEをインストールしてみる。 本記述は13.0-BEATA3時点での内容であるが、13.0がリリースされた後、微調整する。 |
FreeBSD 13.0-RELEASEの初期セットアップをしてみる。 本記述は13.0ーR時点での内容であるが、13.0がリリースされた後でも調整は入る可能性がある。 初期設定にあたり [[FreeBSD/FreeBSD13-install|インストール]] 手順を踏んでる前提で記述している。 自分の環境で読み替える時に発生する差分は読み替えて欲しい。 また [[FreeBSD/FreeBSD13-freq-setup|よくある設定]] で典型的な設定をまとめてみた。 ※本ドキュメントは随時調整が入ることがあります。 |
行 7: | 行 13: |
== 前提条件 == |
|
行 10: | 行 14: |
* ログ関連 * 各種ログは1年間の保持を目指す。 * またログローテーション期間はよく使う物について、月一をベースに、出力が多いサービスでは1週間または1日で切り替えるものとする。 * SYSLOGの書式を最新のRFC5452に準拠させる。これは時刻を正確に記録したいためである。 * TCP関連 * 輻輳制御はDcTCPを使用する(デフォルトは!NewReno)。 * 合わせてECN(`Explicit Congection Notification`)を「受信のみ」から「送受信」に切り替える。 * この辺りの設定は [[https://www.janog.gr.jp/meeting/lt-night-1/download_file/view/16/1|ECN(Explicit Congestion Notification)のあるネットワーク]] を参考にしています。 * FASTOPENをサーバー(受信)でも受け付けるようにする(対応しているサービスによる)。 * SSH関連 * 公開鍵認証とKerberos(GSSAPI)認証のみを有効にし、それ以外を明示的に無効にする。 * SSHエージェントフォワードやGSSAPIデリゲーションを有効にする。 * LANG系の環境変数を引き継ぐようにする。 * よってログイン元であるターミナルにて文字種が明示されていることを期待している。 * OSデフォルトでは `C.UTF-8` になってしまうが、特に変更しない(シェルでの運用上 `LC_TIME` だけは変更する)。 * ソースコードからのコンパイル運用 * ベースシステムもパッケージシステムも全てコンパイルベースで運用するものとする(切り分けは不可能ではないはず)。 * 配布元ではCPUTYPEが指定されていないため、amd64環境では `x86-64`、i386環境では `i686` が選択されている(コンパイラデフォルト)。 * バイナリで運用するかコンパイルして運用するかについては、使用するライフタイムとメンテナンスを天秤にかけて判断すればよいかと。 |
|
行 17: | 行 40: |
@@ -5,6 +5,7 @@ | @@ -6,6 +6,7 @@ |
行 27: | 行 50: |
== /etc/cron.d/portsupdate == | == /etc/cron.d/ports-update == |
行 30: | 行 53: |
0 0 * * * root cd /usr/ports && sleep $(jot -r 1 0 86400) && (svnlite update && make index ) | logger -p user.notice -t ports-svn-update 2>&1 }}} ※2021年02月末日時点ではportsのGIT移行は未完了。 |
0 0 * * * root cd /usr/ports && sleep $(jot -r 1 0 86400) && (git pull && make index ) | logger -p user.notice -t ports-update 2>&1 }}} == /etc/login.conf == {{{#!highlight udiff numbers=disable --- /etc/login.conf.orig 2021-03-05 16:10:22.000000000 +0900 +++ /etc/login.conf 2021-03-13 21:48:59.740931000 +0900 @@ -48,8 +48,7 @@ :priority=0:\ :ignoretime@:\ :umask=022:\ - :charset=UTF-8:\ - :lang=C.UTF-8: + :charset=UTF-8: # # A collection of common class names - forward them all to 'default' }}} この変更実施後 `cap_mkdb /etc/login.conf` を実行すること。 |
行 38: | 行 77: |
+++ /etc/newsyslog.conf 2021-02-25 08:13:00.228193000 +0900 | +++ /etc/newsyslog.conf 2021-03-04 06:43:50.764180000 +0900 |
行 44: | 行 83: |
+/var/log/auth.log 600 53 * $W0D0 XC | +/var/log/auth.log 600 12 * $M1D0 XC |
行 69: | 行 108: |
== /etc/newsyslog.conf.d/ntpd == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ntpd.log 644 12 * $M1D0 XC }}} == /etc/newsyslog.conf.d/ports-svn-update == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ports-svn-update.log 644 12 * $M1D0 XC }}} == /etc/newsyslog.conf.d/sudo == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] var/log/sudo.log 644 12 * $M1D0 XC |
== /etc/newsyslog.conf.d/console.conf == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/console.log 644 12 * $M1D0 XC }}} == /etc/newsyslog.conf.d/ntp.conf == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ntp.log 644 12 * $M1D0 XC }}} == /etc/newsyslog.conf.d/ports-update.conf == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ports-update.log 644 12 * $M1D0 XC }}} == /etc/newsyslog.conf.d/sudo.conf == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/sudo.log 644 12 * $M1D0 XC }}} == /etc/newsyslog.conf.d/syslogd.conf == {{{ # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/syslogd.log 644 12 * $M1D0 XC |
行 88: | 行 139: |
{{{ | {{{#!highlight shell numbers=disable daily_scrub_zfs_enable="YES" daily_status_zfs_enable="YES" }}} == /etc/rc.conf == {{{#!highlight console numbers=disable sysrc syslogd_flags="-s -O rfc5424" |
行 93: | 行 151: |
--- /etc/ssh/ssh_config.orig 2021-03-05 16:08:20.000000000 +0900 +++ /etc/ssh/ssh_config 2021-03-13 00:48:59.419630000 +0900 @@ -18,6 +18,16 @@ # list of available options, their meanings and defaults, please see the # ssh_config(5) man page. +Host * + ForwardAgent yes + EscapeChar none + GSSAPIAuthentication yes + GSSAPIDelegateCredentials yes +# Send locale-related environment variables + SendEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES + SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT + SendEnv LC_IDENTIFICATION LC_ALL + # Host * # ForwardAgent no # ForwardX11 no |
|
行 97: | 行 174: |
--- /etc/ssh/sshd_config.orig 2021-02-25 04:46:53.081176000 +0900 +++ /etc/ssh/sshd_config 2021-03-04 06:50:09.275221000 +0900 @@ -85,6 +85,11 @@ # and ChallengeResponseAuthentication to 'no'. #UsePAM yes +# Accept locale-related environment variables +AcceptEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES +AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT +AcceptEnv LC_IDENTIFICATION LC_ALL + #AllowAgentForwarding yes #AllowTcpForwarding yes #GatewayPorts no |
|
行 102: | 行 193: |
+++ /etc/sysctl.conf 2021-02-25 07:07:39.965363000 +0900 @@ -7,3 +7,6 @@ |
+++ /etc/sysctl.conf 2021-03-09 13:17:58.158067000 +0900 @@ -7,3 +7,12 @@ |
行 110: | 行 201: |
+#et.inet.tcp.fastopen.client_enable=1 +net.inet.tcp.fastopen.server_enable=1 +net.inet.tcp.nolocaltimewait=1 + +kern.ipc.maxsockbuf=16777216 +kern.ipc.shm_use_phys=1 |
|
行 114: | 行 211: |
--- /etc/syslog.conf.orig 2021-02-19 15:05:41.000000000 +0900 +++ /etc/syslog.conf 2021-03-09 13:31:41.455039000 +0900 @@ -5,10 +5,10 @@ # separators. If you are sharing this file between systems, you # may want to use only tabs as field separators here. # Consult the syslog.conf(5) manpage. -*.err;kern.warning;auth.notice;mail.crit /dev/console -*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages +*.err;kern.warning;auth.none;mail.none;user.none;ntp.none;syslog.none /dev/console +*.*;authpriv.none;kern.debug;lpr.info;mail.none;news.err;cron.none;console.none;daemon.none;ntp.none;auth.none;syslog.none;user.none;local2.none /var/log/messages security.* /var/log/security -auth.info;authpriv.info /var/log/auth.log +auth.*;authpriv.* /var/log/auth.log mail.info /var/log/maillog cron.* /var/log/cron !-devd }}} * `mail.*`: メールシステムのログ(`sendmail` 他) * `auth.*`、`authpriv.*`: 認証システムのログ(`sshd`、`su` 他) * `cron.*`: cronログ(`cron`、`at`) * `console.*`: コンソールログ(と言われる何か、実際の運用では `daemon.*` と変わらなさそうな扱い) * `daemon.*`: デーモンサービスのログ(各種) * `ntp.*`: NTPログ(`ntpd`) * `syslog.*`: syslogdのログ(`syslogd`) * `user.*`: ユーザーレベルのログ(`/etc/cron.d/ports-update` にて使用) * `local2.*`: 任意のアプリでのログ(`sudo` 他) == /etc/syslog.d/console.conf == {{{ console.* /var/log/console.log }}} == /etc/syslog.d/daemon.conf == {{{ daemon.* /var/log/daemon.log |
|
行 119: | 行 252: |
*.>=notice /var/log/devd.log | *.* /var/log/devd.log |
行 124: | 行 257: |
ntp.* /var/log/ntpd.log | ntp.* /var/log/ntp.log |
行 129: | 行 262: |
local2.* /var/log/sudo.log }}} == /etc/syslog.d/syslog.conf == {{{ syslog.* /var/log/syslogd.log |
|
行 133: | 行 272: |
user.* /var/log/ports-svn-update.log | !-devd user.* /var/log/ports-update.log |
行 138: | 行 278: |
--- /etc/ttys.orig 2021-02-19 15:00:30.000000000 +0900 +++ /etc/ttys 2021-03-09 10:00:54.967135000 +0900 @@ -31,13 +31,13 @@ # ttyv0 "/usr/libexec/getty Pc" xterm onifexists secure # Virtual terminals -ttyv1 "/usr/libexec/getty Pc" xterm onifexists secure -ttyv2 "/usr/libexec/getty Pc" xterm onifexists secure -ttyv3 "/usr/libexec/getty Pc" xterm onifexists secure -ttyv4 "/usr/libexec/getty Pc" xterm onifexists secure -ttyv5 "/usr/libexec/getty Pc" xterm onifexists secure -ttyv6 "/usr/libexec/getty Pc" xterm onifexists secure -ttyv7 "/usr/libexec/getty Pc" xterm onifexists secure +ttyv1 "/usr/libexec/getty Pc" xterm off secure +ttyv2 "/usr/libexec/getty Pc" xterm off secure +ttyv3 "/usr/libexec/getty Pc" xterm off secure +ttyv4 "/usr/libexec/getty Pc" xterm off secure +ttyv5 "/usr/libexec/getty Pc" xterm off secure +ttyv6 "/usr/libexec/getty Pc" xterm off secure +ttyv7 "/usr/libexec/getty Pc" xterm off secure ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure # Serial terminals # The 'dialup' keyword identifies dialin lines to login, fingerd etc. }}} == 物理環境の場合の省電力設定 == {{{#!highlight console numbers=disable sysrc powerd_enable="YES" sysrc power_profile="NO" sysrc powerd_flags="-a adaptive" |
|
行 141: | 行 311: |
バイナリベースで運用したいなら以後の作業は不要。 | |
行 143: | 行 314: |
{{{#!highlight makefile numbers=disable # # System Dependent Configurations # CPUTYPE?= cascadelake KERNCONF?= GENERIC # # Package/Ports Dependent Configurations # OPTIONS_SET+= ZSH BASH OPTIONS_SET+= NLS DOCS IPV6 EXAMPLES OPTIONS_SET+= LZ4 LZO LZO2 LZMA ZLIB ZSTD BROTLI OPTIONS_SET+= ASM SIMD SSE2 CPU_OPTS OPTIMIZED_FLAGS OPTIMIZED_CFLAGS OPTIONS_SET+= X265 SVTHEVC VMAF HI8P HI10P HI12P OPTIONS_SET+= X3F DAV1D RAV1E RPIRAW JPEGICC TIFFICC LIBDE265 IMAGEMAGICK7 OPTIONS_SET+= PNG APNG HEIF JPEG TIFF RAQM LCMS2 JASPER WEBP FREETYPE FONTCONFIG OPTIONS_SET+= GMP ICU IDN SSL SSH SSH2 DTRACE GLIB PCAP ICONV SOCKS OPENSSL THREADS OPTIONS_SET+= PYGMENTS BACKSPACE ONIGURUMA ENCODINGS ETCSYMLINK DEFAULT_VIMRC OPTIONS_SET+= GSSAPI_BASE OPTIONS_UNSET+= GUI CUPS GDBM TEST DEBUG TESTS GNUTLS NETTLE MBEDTLS OPENMP CA_BUNDLE OPTIONS_UNSET+= GPG_AGENT HTMLDOCS GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE OPTIONS_UNSET+= AOM SDL X11 XPM XCB TRACE GCRYPT OPENGL GLESV2 STATIC # per port devel_cmake_UNSET= CPACK MANPAGES devel_git_UNSET= P4 CVS GITWEB SUBTREE devel_glib20_SET= FAM_ALTBACKEND devel_glib20_UNSET= MANPAGES devel_oniguruma_UNSET= STATISTICS devel_py-yaml_SET= LIBYAML dns_bind-tools_SET= MANPAGES editors_vim-console_SET= MAKE_JOBS lang_tcl86_UNSET= TCLMAN TZDATA ports-mgmt_portmaster_SET= BASH ZSH security_dehydrated_UNSET= ZSH security_sudo_UNSET= GSSAPI_BASE }}} * `CPUTYPE`: 運用するサーバーの[[https://qiita.com/nanorkyo/items/e0417d8c1388750cb72c|CPUに合わせて指定]]する(指定可能なCPU種別は `/usr/share/mk/bsd.cpu.mk` で定義されている)。 * ports用のオプションについては以下でインストールする際に要求される選択肢に対して、ある程度手を打つ形で設定している。 * X11関連は無効にする。 * 圧縮系アルゴリズム(ライブラリやその使用)はおおよそ有効にしている。 * `ImageMagick`基準で画像の取り扱いもおおよそメジャーなものは有効にしている。 * 同じく`ImageMagick`基準で動画の取り扱いもいくらか有効にしている。 * ただHEIF関連については色々と重たい依存関係が発生している点はご容赦願いたい。 * gitコマンドについては軽量指定してる。ガチで使うなら `SUBTREE` オプションは有効にした方がいい。 * 積極的にOpenSSLを使用するものとし、代替ライブラリ(NETTLEやMBEDTLS等)は選択しない(選択可能なケースで)。 * 最適化はある程度選択するが、極端な最適化を求めると重たすぎるものについては無効にする(OpenMP)。 |
|
行 145: | 行 365: |
* ベース内にgitコマンドが無いため、パッケージでgitコマンドをインストールしてから各種セットアップする。 * また `git clone` する場合はGitHub等(二次配布先)からでなく、`git.freebsd.org` から取得する。もちろんGitHubでもGitLabでもどこからでも構わないが…。 * `make -j` で指定している「n」は `sysctl hw.cpu` を実行して得た数字+1を指定することを推奨する。 * ただしメモリが2GB以下の場合はn=1としておいた方が安全である(`-j` オプションの指定は不要)。 * `certctl rehash` コマンドの扱いについてメモ。 * 本コマンドの実行は原則不要。 * これは `make installworld` 中に実施される。 * ただし `etcupdate` (`mergemaster`)では実行されない。 * なぜ明記しているのかというと、`/etc` 以下に対するオペレーションなのだけど、上記2つでカバーできないケースでは、`certctl rehash` を個別に実施しないといけないケースが発生している。 * 例えばジャイル内でホスト側の `/usr` や `/bin` などのを参照しているケースで、`/var` や `/etc` をジャイル固有で持っている場合である。 {{{#!wiki note なおシャロークローンと言われる状態なので、(本家から配布されてる)他のブランチに変えることができません。 他のブランチに切り替えたいと考えている場合は `--no-single-branch` オプションも指定しておく。 }}} {{{#!highlight console numbers=disable pkg install -y git git clone -b releng/13.0 --depth 1 https://git.freebsd.org/src.git /usr/src cd /usr/src git config pull.ff only make -jn buildworld buildkernel make installkernel installworld certctl rehash etcupdate etcupdate resolve }}} ここで一旦再起動する。 {{{#!highlight console numbers=disable cd /usr/src make -jn buildworld buildkernel make installkernel installworld }}} 再度再起動を実施。 == OS展開時のコマンド指定方法とディスク容量の違い == ※`releng/13.0` ブランチを指定してクローンした場合。別ブランチの指定や時間経過により容量が変動するので参考までに。 ||<#FFFF00> コマンド ||<#FFFF00> ディスク消費容量 ||<#FFFF00> 効能 || || `git clone --depth 1` || 985MB || 最小容量ただしログは一世代のみ || || `git clone --depth 1 --no-single-branch` || 1687MB || 最小容量+ブランチ情報を持つ || || `git clone` || 2047MB || リポジトリの全てのデータ || == ブランチ切り替え == ※`--depth 1` のシャロークローン状態で別のブランチ(ここでは `releng/12.2` で検証)および切り替えてみた。 {{{#!highlight console numbers=disable cd /usr/src git config --add remote.origin.fetch "+refs/heads/releng/12.2:refs/remotes/origin/releng/12.2" git fetch git branch releng/12.2 remotes/origin/releng/12.2 git checkout releng/12.2 }}} * この時(`git fetch` 直後) `/usr/src` のディスク消費量は2GBに達した。 * つまりこの手順はあまり意味(効果)は無く、削除して再度クローンしなおした方が安全と思われる。 == オリジン名の指定 == * [[https://docs.freebsd.org/en/books/handbook/mirrors/#git|Using Git]]によれば、`git clone` 時に `-o freebsd` オプションを指定している。 * このオプションの指定はオリジンURLのエイリアス名を指定するもので、デフォルトの `origin` から `freebsd` に変えるものである。 * 具体的には `git remote -v` を実行した際にエイリアス名とURLのペアが確認できる。 * また `git branch -a` の表示結果からも効果がわかる(URLを指定しなくてよいため)。 * このエイリアス名を変更したい場合は `git remote rename 旧エイリアス名 新エイリアス名` を実行する。 * 通常の利用では特に意識する必要は無いが運用次第で変える。 * 配布先を指定する例: `-o freebsd`、`-o github`、`-o gitlab` … * フォーク元を明示したい例: `-o upstream` * よってごく単純に `/usr/src` だけとか、`/usr/ports` だけなら `-o` オプションは指定しなくてよい。 |
|
行 147: | 行 440: |
パッケージベースで運用したいなら以後の作業は不要。 == portsの展開 == {{{#!highlight console numbers=disable git clone --depth 1 https://git.freebsd.org/ports.git /usr/ports cd /usr/ports git config pull.ff only pkg delete -ayf rm /var/db/pkg/* mkdir -p /usr/ports/distfiles cd /usr/ports; make index }}} == 互換設定 == * サードパーティシェル(ZSH/BASH)をベースシステムと同じように扱うための設定(主にLinuxディストリビューションとの互換)。 * Perlについて同じく(こちらは気にしないケースが多いかも)。 {{{#!highlight console numbers=disable ln -s /usr/local/bin/zsh /bin/zsh ln -s /usr/local/bin/bash /bin/bash ln -s /usr/local/bin/perl /usr/bin/perl }}} == 前提インストール == {{{#!highlight console numbers=disable cd /usr/ports/ports-mgmt/dialog4ports && make install clean cd /usr/ports/ports-mgmt/portconf && make install clean }}} === /usr/local/etc/ports.conf === {{{ databases/db5: NO_DIALOG=yes databases/sqlite3: NO_DIALOG=yes devel/apr1: NO_DIALOG=yes devel/git: NO_DIALOG=yes devel/m4: NO_DIALOG=yes devel/pcre*: NO_DIALOG=yes devel/py-Jinja2: NO_DIALOG=yes devel/subversion: NO_DIALOG=yes dns/bind-tools: NO_DIALOG=yes ftp/curl: NO_DIALOG=yes lang/perl5.*: NO_DIALOG=yes lang/python*: NO_DIALOG=yes net/rsync: NO_DIALOG=yes security/p5-Authen-SASL: NO_DIALOG=yes security/p5-GSSAPI: NO_DIALOG=yes security/sudo: NO_DIALOG=yes shells/bash: NO_DIALOG=yes shells/zsh: NO_DIALOG=yes sysutils/tmux*: NO_DIALOG=yes textproc/libxml2: NO_DIALOG=yes textproc/py-snowballstemmer: NO_DIALOG=yes www/serf: NO_DIALOG=yes }}} == 共通(定番)インストール == {{{#!highlight console numbers=disable cd /usr/ports/shells/zsh && make install clean cd /usr/ports/shells/bash && make install clean cd /usr/ports/japanese/less && make install clean cd /usr/ports/japanese/nkf && make install clean cd /usr/ports/sysutils/lsof && make install clean cd /usr/ports/sysutils/topless && make install clean cd /usr/ports/sysutils/zfs-stats && make install clean cd /usr/ports/ports-mgmt/portmaster && make install clean cd /usr/ports/security/makepasswd && make install clean cd /usr/ports/dns/bind-tools && make install clean cd /usr/ports/devel/subversion && make install clean cd /usr/ports/devel/git && make install clean cd /usr/ports/sysutils/tmux && make install clean cd /usr/ports/net/rsync && make install clean cd /usr/ports/editors/vim-console && make install clean cd /usr/ports/security/sudo && make install clean cd /usr/ports/security/dehydrated && make install clean cd /usr/ports/security/testssl.sh && make install clean }}} === /usr/local/etc/portmaster.rc === {{{#!highlight shell numbers=disable SAVE_SHARED=wopt ALWAYS_SCRUB_DISTFILES=dopt PM_NO_CONFIRM=pm_no_confirm PM_NO_TERM_TITLE=pm_no_term_title PM_IGNORE_FAILED_BACKUP_PACKAGE=pm_ignore_failed_backup_package }}} ==== ports更新メモ ==== 本ファイルの設定は以下のオプションを付与した物と同じになる。 * `-w`: パッケージのアンインストール時に共有ライブラリを保存する。 * `-d`: 常に古いディストファイルを削除する。 * `--no-confirm`: 特に確認プロンプト無しで処理を進める(`-y` オプションとは違います)。 * `--no-term-title`: XTERM由来のタイトルバー更新機能(意外と対応している)を使用しない。 * パッケージのバックアップに失敗しても無視する。これが無いと失敗したときの挙動についてインタラクティブに問い合せてくる。 つまり下記のようにして、更新可能な全てのインストール済みパッケージをバッチ的に処理を進める。 {{{#!highlight console numbers=disable portmaster -a }}} また個別にアップデートするために `-a` の対象外にする方法として `-x` オプションを指定することが可能である。 {{{#!highlight console numbers=disable portmaster -a -x "rubygem-*" }}} これを `/usr/local/etc/portmaster.rc` に設定する場合は下記の内容を追加します。 {{{#!highlight shell numbers=disable PM_EXCL="rubygem " }}} なぜ「`rubygem-*`」が「`rubygem `」になるかは、内部動作を読むしか無いです。 下記のようにコマンドを実行して `PM_EXCL` が設定された内容を参照します。 {{{#!highlight console numbers=disable /bin/sh -x /usr/local/bin/portmaster -a -x "rubygem-*" }}} === /usr/local/etc/sudoers === {{{#!highlight udiff numbers=disable --- /usr/local/etc/sudoers.orig 2021-03-12 03:12:25.197155000 +0900 +++ /usr/local/etc/sudoers 2021-03-12 14:32:30.719682000 +0900 @@ -77,6 +77,9 @@ # Defaults!/usr/local/bin/sudoreplay !log_output # Defaults!REBOOT !log_output +# Allow ssh commands with ssh-agent +Defaults env_keep += "SSH_CLIENT SSH_CONNECTION SSH_TTY SSH_AUTH_SOCK" + ## ## Runas alias specification ## @@ -90,7 +93,7 @@ # %wheel ALL=(ALL) ALL ## Same thing without a password -# %wheel ALL=(ALL) NOPASSWD: ALL +%wheel ALL=(ALL) NOPASSWD: ALL ## Uncomment to allow members of group sudo to execute any command # %sudo ALL=(ALL) ALL }}} === /usr/local/etc/zlogin === {{{#!highlight shell numbers=disable stty erase $(printf "\010") xtset Host: $(hostname) }}} * `xtset` コマンド(シェル関数)は `x11/xtset` ポート由来で、わざわざインストールするまでも無く自作している(その程度のプログラム)。 * XTERMタイトルバーの更新機能に対応しているターミナルでは、これの実行によりタイトルバーが変更される。 * 何か重要な作業することがあって、ターミナル毎に作業している場合、タイトルバーで区別することが可能である。 === /usr/local/etc/zshenv === {{{#!highlight shell numbers=disable PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin }}} === /usr/local/etc/zshrc === {{{#!highlight shell numbers=disable bindkey -e autoload compinit compinit alias ls="ls -lwF" alias vi=vim unset zle_bracketed_paste export LC_TIME=C export LESS=-FRX export PAGER=jless export EDITOR=vim prompt='%h %n@%m%(#.#.$) ' xtset () { printf "\033]1;%s\007\033]2;%s\007" "${*}" "${*}" } [ -f /usr/local/bin/aws_zsh_completer.sh ] && source /usr/local/bin/aws_zsh_completer.sh }}} == 物理環境での追加インストール == * `smartmontools` はストレージのS.M.A.R.T.情報を読み取ってくれるツールである。 * 仮想化環境ではこれの読み取りができないし、読み取った意味も無いので、そのような環境ではインストール不要である。 === S.M.A.R.T. disk monitoring tools のインストール === {{{#!highlight console numbers=disable cd /usr/ports/sysutils/smartmontools && make install clean sysrc smartd_enable="YES" }}} ストレージ環境に合わせて下記(特に `/usr/local/etc/smartd.conf`)の設定を行いサーバーを再起動するか `service smartd start` で手動起動する。 === SATA環境 === * SATA接続のHDD/SSDの場合の設定例。 * 2台のストレージがつながってるとして、`/dev/ada0`、`/dev/ada1` の場合の例を示す。 * 何かしら異常を検知したら連絡する先(メールアドレス)を用意しておく。 ==== /etc/periodic.conf ==== {{{#!highlight shell numbers=disable daily_status_smart_devices="/dev/ada0 /dev/ada1" }}} ==== /usr/local/etc/smartd.conf ==== {{{ /dev/ada0 -H -m メールアドレス /dev/ada1 -H -m メールアドレス }}} * ドライバ種別は指定していないので、自動判定を行っている。 * このケース(SATA)で、なお敢えて、指定するとしたら `-d atacam` になる。 === HPE SmartArray Pシリーズ環境 === * RAIDコントローラに接続されたストレージ(HDD/SSD)の場合の設定例。 * 4台のストレージがつながってるとして、個別には `/dev/ciss0,n` (n≧0)を指定できる場合の例を示す。 * 何かしら異常を検知したら連絡する先(メールアドレス)を用意しておく。 ==== /etc/periodic.conf ==== {{{#!highlight shell numbers=disable daily_status_smart_devices="/dev/ciss0,0 /dev/ciss0,1 /dev/ciss0,2 /dev/ciss0,3" }}} ==== /usr/local/etc/smartd.conf ==== {{{ /dev/ciss0 -d cciss,0 -H -m メールアドレス /dev/ciss0 -d cciss,1 -H -m メールアドレス /dev/ciss0 -d cciss,2 -H -m メールアドレス /dev/ciss0 -d cciss,3 -H -m メールアドレス }}} * `-d` オプションでしている設定は `smartmontools` のドライバ名であるため、デバイス名とは違う点に注意。 == VMware環境での追加インストール == * ホスト(ESXi)とゲスト(FreeBSD)間での状態を交換するためのツールです。 * 特に、安全にVモーションするためには必須のツールです。 * `vmblock` はホストとゲスト間でのコピー&ペーストを実現するためのドライバです。 * X11上でしかコピペできない(コンソール相手にはできない)ため明示的に無効にしています。 === /etc/make.conf === {{{#!highlight makefile numbers=disable emulators_open-vm-tools_UNSET= DOCS FUSE LIBNOTIFY }}} === The Open Virtual Machine Tools のインストール === {{{#!highlight console numbers=disable cd /usr/ports/emulators/open-vm-tools && make install clean sysrc vmware_guest_vmblock_enable="NO" echo 'rc_quiet="YES"' > /etc/rc.conf.d/vmware_guest_vmblock }}} === 手動立ち上げ === ※再起動すれば自動的に立ち上がるようになっています(デフォルトON)。 {{{#!highlight console numbers=disable service vmware-kmod start service vmware-guestd start }}} = よくある質問とその答え = == Q.なんで二回もリビルドしてるのですか? == A.いわゆる完全なクロスコンパイル環境では発生しえませんが、セルフビルド環境ではホストのバイナリが紛れ込むことがあるため、それを排除するために二回リビルドしています。 <<BR>> なので以後のリビルドは一回で十分です。もちろんCPUを変更したり、メジャーバージョンアップするなら二回リビルドした方が良いです。 究極的には [[https://www.archive.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf|Thompson hack]] の話を無視できないので、どこまでを許容するかという話になります。 == Q./usr/bin/perl なんて今時… == A.昔作ったスクリプトや他の環境で作ったスクリプトをそのまま運用するための設定ですね。長いこと運用しているとそういうのが…。 <<BR>> そういう意味では `/bin/bash` の類いはケア(`/usr/local/bin/bash` でもOKなように)してるケースはあまり見かけませんね。 <<BR>> `bash` が `/bin` にあることを前提にしている人が多いように見受けられます。 == Q.CPUTYPEなんてnativeを指定しておけば良きに計らってくれるんでね? == A.その通り。ではない(どっち?)。単純にコンパイルするという観点で言えばコンパイラがCPUを自動判定して最適化してくれます。 <<BR>> しかしビルドシステム(`bsd.cpu.mk`)ではランタイムに判定していないので、各種CPU拡張機能が未対応として処理が進みます。 <<BR>> CPUのことを何も考えてないアプリであればコンパイラが良き(SIMDエンジン使用するなど)に計らってくれますが、 <<BR>> CPUに応じて最適化の選択ができるアプリ(数値演算ライブラリ等)では、適切な選択が行われず、CPU拡張機能を使用してくれない場合があります。 もう一つ、最初に設定した時は `native` で良きに計らってくれても良いけど、後になってどのCPU向けであったか分からなくなることがあります。 <<BR>> そのことも踏まえて、自分が使用しているシステムのCPUアーキテクチャは把握しておいた方がいいです。 = 参考文献 = * [[https://qiita.com/nanorkyo/items/e0417d8c1388750cb72c|FreeBSDでのCPUTYPEの指定方法]] * [[https://qiita.com/nanorkyo/items/a0068cafcf9112ebbb7b|Ports System における OPTIONS_SET/OPTIONS_UNSET/NO_DIALOG の活用方法]] * [[https://qiita.com/nanorkyo/items/451d1a3fda704601a14a|Ports System における公式 OPTIONS のリスト]] * [[https://github.com/bsdimp/freebsd-git-docs/blob/main/mini-primer.md|FreeBSD mini-git Primer]] * [[https://github.com/bsdimp/freebsd-git-docs/blob/main/URLs.md|Important URLs of the FreeBSD Git Infrastructure]] * [[https://www.janog.gr.jp/meeting/lt-night-1/download_file/view/16/1|ECN(Explicit Congestion Notification)のあるネットワーク]] * [[https://www.janog.gr.jp/meeting/janog41/program/sp9tcp|TCP輻輳制御技術動向]] * [[https://www.archive.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf|Thompson hack]] |
FreeBSD13の初期設定
FreeBSD 13.0-RELEASEの初期セットアップをしてみる。 本記述は13.0ーR時点での内容であるが、13.0がリリースされた後でも調整は入る可能性がある。
初期設定にあたり インストール 手順を踏んでる前提で記述している。 自分の環境で読み替える時に発生する差分は読み替えて欲しい。 また よくある設定 で典型的な設定をまとめてみた。
※本ドキュメントは随時調整が入ることがあります。
目次
- FreeBSD13の初期設定
-
初期設定
- /boot/loader.conf
- /etc/cron.d/ports-update
- /etc/login.conf
- /etc/newsyslog.conf
- /etc/newsyslog.conf.d/console.conf
- /etc/newsyslog.conf.d/ntp.conf
- /etc/newsyslog.conf.d/ports-update.conf
- /etc/newsyslog.conf.d/sudo.conf
- /etc/newsyslog.conf.d/syslogd.conf
- /etc/periodic.conf
- /etc/rc.conf
- /etc/ssh/ssh_config
- /etc/ssh/sshd_config
- /etc/sysctl.conf
- /etc/syslog.conf
- /etc/syslog.d/console.conf
- /etc/syslog.d/daemon.conf
- /etc/syslog.d/devd.conf
- /etc/syslog.d/ntp.conf
- /etc/syslog.d/sudo.conf
- /etc/syslog.d/syslog.conf
- /etc/syslog.d/user.conf
- /etc/ttys
- 物理環境の場合の省電力設定
- OSのリビルド
- portsのインストール
- よくある質問とその答え
- 参考文献
設定目標
- ログ関連
- 各種ログは1年間の保持を目指す。
- またログローテーション期間はよく使う物について、月一をベースに、出力が多いサービスでは1週間または1日で切り替えるものとする。
- SYSLOGの書式を最新のRFC5452に準拠させる。これは時刻を正確に記録したいためである。
- TCP関連
輻輳制御はDcTCPを使用する(デフォルトはNewReno)。
合わせてECN(Explicit Congection Notification)を「受信のみ」から「送受信」に切り替える。
この辺りの設定は ECN(Explicit Congestion Notification)のあるネットワーク を参考にしています。
- FASTOPENをサーバー(受信)でも受け付けるようにする(対応しているサービスによる)。
- SSH関連
- 公開鍵認証とKerberos(GSSAPI)認証のみを有効にし、それ以外を明示的に無効にする。
- SSHエージェントフォワードやGSSAPIデリゲーションを有効にする。
- LANG系の環境変数を引き継ぐようにする。
- よってログイン元であるターミナルにて文字種が明示されていることを期待している。
OSデフォルトでは C.UTF-8 になってしまうが、特に変更しない(シェルでの運用上 LC_TIME だけは変更する)。
- ソースコードからのコンパイル運用
- ベースシステムもパッケージシステムも全てコンパイルベースで運用するものとする(切り分けは不可能ではないはず)。
配布元ではCPUTYPEが指定されていないため、amd64環境では x86-64、i386環境では i686 が選択されている(コンパイラデフォルト)。
- バイナリで運用するかコンパイルして運用するかについては、使用するライフタイムとメンテナンスを天秤にかけて判断すればよいかと。
初期設定
/boot/loader.conf
--- /boot/loader.conf.orig 2021-02-25 04:30:48.435918000 +0900
+++ /boot/loader.conf 2021-02-25 07:03:15.844423000 +0900
@@ -6,6 +6,7 @@
zfs_load="YES"
nullfs_load="YES"
+cc_dctcp_load="YES"
geom_eli_load="YES"
vfs.root.mountfrom="zfs:zroot"
/etc/cron.d/ports-update
#minute hour mday month wday who command 0 0 * * * root cd /usr/ports && sleep $(jot -r 1 0 86400) && (git pull && make index ) | logger -p user.notice -t ports-update 2>&1
/etc/login.conf
--- /etc/login.conf.orig 2021-03-05 16:10:22.000000000 +0900
+++ /etc/login.conf 2021-03-13 21:48:59.740931000 +0900
@@ -48,8 +48,7 @@
:priority=0:\
:ignoretime@:\
:umask=022:\
- :charset=UTF-8:\
- :lang=C.UTF-8:
+ :charset=UTF-8:
#
# A collection of common class names - forward them all to 'default'
この変更実施後 cap_mkdb /etc/login.conf を実行すること。
/etc/newsyslog.conf
--- /etc/newsyslog.conf.orig 2021-02-19 15:05:34.000000000 +0900
+++ /etc/newsyslog.conf 2021-03-04 06:43:50.764180000 +0900
@@ -16,21 +16,21 @@
#
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/all.log 600 7 * @T00 J
-/var/log/auth.log 600 7 1000 @0101T JC
+/var/log/auth.log 600 12 * $M1D0 XC
/var/log/console.log 600 5 1000 * J
-/var/log/cron 600 3 1000 * JC
+/var/log/cron 600 12 * $M1D0 XC
/var/log/daily.log 640 7 * @T00 JN
/var/log/debug.log 600 7 1000 * JC
/var/log/init.log 644 3 1000 * J
/var/log/kerberos.log 600 7 1000 * J
-/var/log/maillog 640 7 * @T00 JC
-/var/log/messages 644 5 1000 @0101T JC
+/var/log/maillog 640 12 * $M1D0 XC
+/var/log/messages 644 12 1000 $M1D0 XC
/var/log/monthly.log 640 12 * $M1D0 JN
/var/log/devd.log 644 3 1000 * JC
-/var/log/security 600 10 1000 * JC
+/var/log/security 600 53 * $W0D0 XC
/var/log/utx.log 644 3 * @01T05 B
/var/log/weekly.log 640 5 * $W6D0 JN
-/var/log/daemon.log 644 5 1000 @0101T JC
+/var/log/daemon.log 644 12 * $M1D0 XC
<include> /etc/newsyslog.conf.d/[!.]*.conf
<include> /usr/local/etc/newsyslog.conf.d/[!.]*.conf
/etc/newsyslog.conf.d/console.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/console.log 644 12 * $M1D0 XC
/etc/newsyslog.conf.d/ntp.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ntp.log 644 12 * $M1D0 XC
/etc/newsyslog.conf.d/ports-update.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ports-update.log 644 12 * $M1D0 XC
/etc/newsyslog.conf.d/sudo.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/sudo.log 644 12 * $M1D0 XC
/etc/newsyslog.conf.d/syslogd.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/syslogd.log 644 12 * $M1D0 XC
/etc/periodic.conf
daily_scrub_zfs_enable="YES"
daily_status_zfs_enable="YES"
/etc/rc.conf
sysrc syslogd_flags="-s -O rfc5424"
/etc/ssh/ssh_config
--- /etc/ssh/ssh_config.orig 2021-03-05 16:08:20.000000000 +0900
+++ /etc/ssh/ssh_config 2021-03-13 00:48:59.419630000 +0900
@@ -18,6 +18,16 @@
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.
+Host *
+ ForwardAgent yes
+ EscapeChar none
+ GSSAPIAuthentication yes
+ GSSAPIDelegateCredentials yes
+# Send locale-related environment variables
+ SendEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
+ SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
+ SendEnv LC_IDENTIFICATION LC_ALL
+
# Host *
# ForwardAgent no
# ForwardX11 no
/etc/ssh/sshd_config
--- /etc/ssh/sshd_config.orig 2021-02-25 04:46:53.081176000 +0900
+++ /etc/ssh/sshd_config 2021-03-04 06:50:09.275221000 +0900
@@ -85,6 +85,11 @@
# and ChallengeResponseAuthentication to 'no'.
#UsePAM yes
+# Accept locale-related environment variables
+AcceptEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
+AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
+AcceptEnv LC_IDENTIFICATION LC_ALL
+
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
/etc/sysctl.conf
--- /etc/sysctl.conf.orig 2021-02-19 15:00:35.000000000 +0900
+++ /etc/sysctl.conf 2021-03-09 13:17:58.158067000 +0900
@@ -7,3 +7,12 @@
# Uncomment this to prevent users from seeing information about processes that
# are being run under another UID.
#security.bsd.see_other_uids=0
+
+net.inet.tcp.cc.algorithm=dctcp
+net.inet.tcp.ecn.enable=1
+#et.inet.tcp.fastopen.client_enable=1
+net.inet.tcp.fastopen.server_enable=1
+net.inet.tcp.nolocaltimewait=1
+
+kern.ipc.maxsockbuf=16777216
+kern.ipc.shm_use_phys=1
/etc/syslog.conf
--- /etc/syslog.conf.orig 2021-02-19 15:05:41.000000000 +0900
+++ /etc/syslog.conf 2021-03-09 13:31:41.455039000 +0900
@@ -5,10 +5,10 @@
# separators. If you are sharing this file between systems, you
# may want to use only tabs as field separators here.
# Consult the syslog.conf(5) manpage.
-*.err;kern.warning;auth.notice;mail.crit /dev/console
-*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
+*.err;kern.warning;auth.none;mail.none;user.none;ntp.none;syslog.none /dev/console
+*.*;authpriv.none;kern.debug;lpr.info;mail.none;news.err;cron.none;console.none;daemon.none;ntp.none;auth.none;syslog.none;user.none;local2.none /var/log/messages
security.* /var/log/security
-auth.info;authpriv.info /var/log/auth.log
+auth.*;authpriv.* /var/log/auth.log
mail.info /var/log/maillog
cron.* /var/log/cron
!-devd
mail.*: メールシステムのログ(sendmail 他)
auth.*、authpriv.*: 認証システムのログ(sshd、su 他)
cron.*: cronログ(cron、at)
console.*: コンソールログ(と言われる何か、実際の運用では daemon.* と変わらなさそうな扱い)
daemon.*: デーモンサービスのログ(各種)
ntp.*: NTPログ(ntpd)
syslog.*: syslogdのログ(syslogd)
user.*: ユーザーレベルのログ(/etc/cron.d/ports-update にて使用)
local2.*: 任意のアプリでのログ(sudo 他)
/etc/syslog.d/console.conf
console.* /var/log/console.log
/etc/syslog.d/daemon.conf
daemon.* /var/log/daemon.log
/etc/syslog.d/devd.conf
!devd *.* /var/log/devd.log
/etc/syslog.d/ntp.conf
ntp.* /var/log/ntp.log
/etc/syslog.d/sudo.conf
local2.* /var/log/sudo.log
/etc/syslog.d/syslog.conf
syslog.* /var/log/syslogd.log
/etc/syslog.d/user.conf
!-devd user.* /var/log/ports-update.log
/etc/ttys
--- /etc/ttys.orig 2021-02-19 15:00:30.000000000 +0900
+++ /etc/ttys 2021-03-09 10:00:54.967135000 +0900
@@ -31,13 +31,13 @@
#
ttyv0 "/usr/libexec/getty Pc" xterm onifexists secure
# Virtual terminals
-ttyv1 "/usr/libexec/getty Pc" xterm onifexists secure
-ttyv2 "/usr/libexec/getty Pc" xterm onifexists secure
-ttyv3 "/usr/libexec/getty Pc" xterm onifexists secure
-ttyv4 "/usr/libexec/getty Pc" xterm onifexists secure
-ttyv5 "/usr/libexec/getty Pc" xterm onifexists secure
-ttyv6 "/usr/libexec/getty Pc" xterm onifexists secure
-ttyv7 "/usr/libexec/getty Pc" xterm onifexists secure
+ttyv1 "/usr/libexec/getty Pc" xterm off secure
+ttyv2 "/usr/libexec/getty Pc" xterm off secure
+ttyv3 "/usr/libexec/getty Pc" xterm off secure
+ttyv4 "/usr/libexec/getty Pc" xterm off secure
+ttyv5 "/usr/libexec/getty Pc" xterm off secure
+ttyv6 "/usr/libexec/getty Pc" xterm off secure
+ttyv7 "/usr/libexec/getty Pc" xterm off secure
ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
物理環境の場合の省電力設定
sysrc powerd_enable="YES"
sysrc power_profile="NO"
sysrc powerd_flags="-a adaptive"
OSのリビルド
バイナリベースで運用したいなら以後の作業は不要。
/etc/make.conf
#
# System Dependent Configurations
#
CPUTYPE?= cascadelake
KERNCONF?= GENERIC
#
# Package/Ports Dependent Configurations
#
OPTIONS_SET+= ZSH BASH
OPTIONS_SET+= NLS DOCS IPV6 EXAMPLES
OPTIONS_SET+= LZ4 LZO LZO2 LZMA ZLIB ZSTD BROTLI
OPTIONS_SET+= ASM SIMD SSE2 CPU_OPTS OPTIMIZED_FLAGS OPTIMIZED_CFLAGS
OPTIONS_SET+= X265 SVTHEVC VMAF HI8P HI10P HI12P
OPTIONS_SET+= X3F DAV1D RAV1E RPIRAW JPEGICC TIFFICC LIBDE265 IMAGEMAGICK7
OPTIONS_SET+= PNG APNG HEIF JPEG TIFF RAQM LCMS2 JASPER WEBP FREETYPE FONTCONFIG
OPTIONS_SET+= GMP ICU IDN SSL SSH SSH2 DTRACE GLIB PCAP ICONV SOCKS OPENSSL THREADS
OPTIONS_SET+= PYGMENTS BACKSPACE ONIGURUMA ENCODINGS ETCSYMLINK DEFAULT_VIMRC
OPTIONS_SET+= GSSAPI_BASE
OPTIONS_UNSET+= GUI CUPS GDBM TEST DEBUG TESTS GNUTLS NETTLE MBEDTLS OPENMP CA_BUNDLE
OPTIONS_UNSET+= GPG_AGENT HTMLDOCS GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE
OPTIONS_UNSET+= AOM SDL X11 XPM XCB TRACE GCRYPT OPENGL GLESV2 STATIC
# per port
devel_cmake_UNSET= CPACK MANPAGES
devel_git_UNSET= P4 CVS GITWEB SUBTREE
devel_glib20_SET= FAM_ALTBACKEND
devel_glib20_UNSET= MANPAGES
devel_oniguruma_UNSET= STATISTICS
devel_py-yaml_SET= LIBYAML
dns_bind-tools_SET= MANPAGES
editors_vim-console_SET= MAKE_JOBS
lang_tcl86_UNSET= TCLMAN TZDATA
ports-mgmt_portmaster_SET= BASH ZSH
security_dehydrated_UNSET= ZSH
security_sudo_UNSET= GSSAPI_BASE
CPUTYPE: 運用するサーバーのCPUに合わせて指定する(指定可能なCPU種別は /usr/share/mk/bsd.cpu.mk で定義されている)。
- ports用のオプションについては以下でインストールする際に要求される選択肢に対して、ある程度手を打つ形で設定している。
- X11関連は無効にする。
- 圧縮系アルゴリズム(ライブラリやその使用)はおおよそ有効にしている。
ImageMagick基準で画像の取り扱いもおおよそメジャーなものは有効にしている。
同じくImageMagick基準で動画の取り扱いもいくらか有効にしている。
- ただHEIF関連については色々と重たい依存関係が発生している点はご容赦願いたい。
gitコマンドについては軽量指定してる。ガチで使うなら SUBTREE オプションは有効にした方がいい。
- 積極的にOpenSSLを使用するものとし、代替ライブラリ(NETTLEやMBEDTLS等)は選択しない(選択可能なケースで)。
- 最適化はある程度選択するが、極端な最適化を求めると重たすぎるものについては無効にする(OpenMP)。
OSの展開
- ベース内にgitコマンドが無いため、パッケージでgitコマンドをインストールしてから各種セットアップする。
また git clone する場合はGitHub等(二次配布先)からでなく、git.freebsd.org から取得する。もちろんGitHubでもGitLabでもどこからでも構わないが…。
make -j で指定している「n」は sysctl hw.cpu を実行して得た数字+1を指定することを推奨する。
ただしメモリが2GB以下の場合はn=1としておいた方が安全である(-j オプションの指定は不要)。
certctl rehash コマンドの扱いについてメモ。
- 本コマンドの実行は原則不要。
これは make installworld 中に実施される。
ただし etcupdate (mergemaster)では実行されない。
なぜ明記しているのかというと、/etc 以下に対するオペレーションなのだけど、上記2つでカバーできないケースでは、certctl rehash を個別に実施しないといけないケースが発生している。
例えばジャイル内でホスト側の /usr や /bin などのを参照しているケースで、/var や /etc をジャイル固有で持っている場合である。
なおシャロークローンと言われる状態なので、(本家から配布されてる)他のブランチに変えることができません。 他のブランチに切り替えたいと考えている場合は --no-single-branch オプションも指定しておく。
pkg install -y git
git clone -b releng/13.0 --depth 1 https://git.freebsd.org/src.git /usr/src
cd /usr/src
git config pull.ff only
make -jn buildworld buildkernel
make installkernel installworld
certctl rehash
etcupdate
etcupdate resolve
ここで一旦再起動する。
cd /usr/src
make -jn buildworld buildkernel
make installkernel installworld
再度再起動を実施。
OS展開時のコマンド指定方法とディスク容量の違い
※releng/13.0 ブランチを指定してクローンした場合。別ブランチの指定や時間経過により容量が変動するので参考までに。
コマンド |
ディスク消費容量 |
効能 |
git clone --depth 1 |
985MB |
最小容量ただしログは一世代のみ |
git clone --depth 1 --no-single-branch |
1687MB |
最小容量+ブランチ情報を持つ |
git clone |
2047MB |
リポジトリの全てのデータ |
ブランチ切り替え
※--depth 1 のシャロークローン状態で別のブランチ(ここでは releng/12.2 で検証)および切り替えてみた。
cd /usr/src
git config --add remote.origin.fetch "+refs/heads/releng/12.2:refs/remotes/origin/releng/12.2"
git fetch
git branch releng/12.2 remotes/origin/releng/12.2
git checkout releng/12.2
この時(git fetch 直後) /usr/src のディスク消費量は2GBに達した。
- つまりこの手順はあまり意味(効果)は無く、削除して再度クローンしなおした方が安全と思われる。
オリジン名の指定
Using Gitによれば、git clone 時に -o freebsd オプションを指定している。
このオプションの指定はオリジンURLのエイリアス名を指定するもので、デフォルトの origin から freebsd に変えるものである。
具体的には git remote -v を実行した際にエイリアス名とURLのペアが確認できる。
また git branch -a の表示結果からも効果がわかる(URLを指定しなくてよいため)。
このエイリアス名を変更したい場合は git remote rename 旧エイリアス名 新エイリアス名 を実行する。
- 通常の利用では特に意識する必要は無いが運用次第で変える。
配布先を指定する例: -o freebsd、-o github、-o gitlab …
フォーク元を明示したい例: -o upstream
よってごく単純に /usr/src だけとか、/usr/ports だけなら -o オプションは指定しなくてよい。
portsのインストール
パッケージベースで運用したいなら以後の作業は不要。
portsの展開
git clone --depth 1 https://git.freebsd.org/ports.git /usr/ports
cd /usr/ports
git config pull.ff only
pkg delete -ayf
rm /var/db/pkg/*
mkdir -p /usr/ports/distfiles
cd /usr/ports; make index
互換設定
- サードパーティシェル(ZSH/BASH)をベースシステムと同じように扱うための設定(主にLinuxディストリビューションとの互換)。
- Perlについて同じく(こちらは気にしないケースが多いかも)。
ln -s /usr/local/bin/zsh /bin/zsh
ln -s /usr/local/bin/bash /bin/bash
ln -s /usr/local/bin/perl /usr/bin/perl
前提インストール
cd /usr/ports/ports-mgmt/dialog4ports && make install clean
cd /usr/ports/ports-mgmt/portconf && make install clean
/usr/local/etc/ports.conf
databases/db5: NO_DIALOG=yes databases/sqlite3: NO_DIALOG=yes devel/apr1: NO_DIALOG=yes devel/git: NO_DIALOG=yes devel/m4: NO_DIALOG=yes devel/pcre*: NO_DIALOG=yes devel/py-Jinja2: NO_DIALOG=yes devel/subversion: NO_DIALOG=yes dns/bind-tools: NO_DIALOG=yes ftp/curl: NO_DIALOG=yes lang/perl5.*: NO_DIALOG=yes lang/python*: NO_DIALOG=yes net/rsync: NO_DIALOG=yes security/p5-Authen-SASL: NO_DIALOG=yes security/p5-GSSAPI: NO_DIALOG=yes security/sudo: NO_DIALOG=yes shells/bash: NO_DIALOG=yes shells/zsh: NO_DIALOG=yes sysutils/tmux*: NO_DIALOG=yes textproc/libxml2: NO_DIALOG=yes textproc/py-snowballstemmer: NO_DIALOG=yes www/serf: NO_DIALOG=yes
共通(定番)インストール
cd /usr/ports/shells/zsh && make install clean
cd /usr/ports/shells/bash && make install clean
cd /usr/ports/japanese/less && make install clean
cd /usr/ports/japanese/nkf && make install clean
cd /usr/ports/sysutils/lsof && make install clean
cd /usr/ports/sysutils/topless && make install clean
cd /usr/ports/sysutils/zfs-stats && make install clean
cd /usr/ports/ports-mgmt/portmaster && make install clean
cd /usr/ports/security/makepasswd && make install clean
cd /usr/ports/dns/bind-tools && make install clean
cd /usr/ports/devel/subversion && make install clean
cd /usr/ports/devel/git && make install clean
cd /usr/ports/sysutils/tmux && make install clean
cd /usr/ports/net/rsync && make install clean
cd /usr/ports/editors/vim-console && make install clean
cd /usr/ports/security/sudo && make install clean
cd /usr/ports/security/dehydrated && make install clean
cd /usr/ports/security/testssl.sh && make install clean
/usr/local/etc/portmaster.rc
SAVE_SHARED=wopt
ALWAYS_SCRUB_DISTFILES=dopt
PM_NO_CONFIRM=pm_no_confirm
PM_NO_TERM_TITLE=pm_no_term_title
PM_IGNORE_FAILED_BACKUP_PACKAGE=pm_ignore_failed_backup_package
ports更新メモ
本ファイルの設定は以下のオプションを付与した物と同じになる。
-w: パッケージのアンインストール時に共有ライブラリを保存する。
-d: 常に古いディストファイルを削除する。
--no-confirm: 特に確認プロンプト無しで処理を進める(-y オプションとは違います)。
--no-term-title: XTERM由来のタイトルバー更新機能(意外と対応している)を使用しない。
- パッケージのバックアップに失敗しても無視する。これが無いと失敗したときの挙動についてインタラクティブに問い合せてくる。
つまり下記のようにして、更新可能な全てのインストール済みパッケージをバッチ的に処理を進める。
portmaster -a
また個別にアップデートするために -a の対象外にする方法として -x オプションを指定することが可能である。
portmaster -a -x "rubygem-*"
これを /usr/local/etc/portmaster.rc に設定する場合は下記の内容を追加します。
PM_EXCL="rubygem "
なぜ「rubygem-*」が「rubygem 」になるかは、内部動作を読むしか無いです。 下記のようにコマンドを実行して PM_EXCL が設定された内容を参照します。
/bin/sh -x /usr/local/bin/portmaster -a -x "rubygem-*"
/usr/local/etc/sudoers
--- /usr/local/etc/sudoers.orig 2021-03-12 03:12:25.197155000 +0900
+++ /usr/local/etc/sudoers 2021-03-12 14:32:30.719682000 +0900
@@ -77,6 +77,9 @@
# Defaults!/usr/local/bin/sudoreplay !log_output
# Defaults!REBOOT !log_output
+# Allow ssh commands with ssh-agent
+Defaults env_keep += "SSH_CLIENT SSH_CONNECTION SSH_TTY SSH_AUTH_SOCK"
+
##
## Runas alias specification
##
@@ -90,7 +93,7 @@
# %wheel ALL=(ALL) ALL
## Same thing without a password
-# %wheel ALL=(ALL) NOPASSWD: ALL
+%wheel ALL=(ALL) NOPASSWD: ALL
## Uncomment to allow members of group sudo to execute any command
# %sudo ALL=(ALL) ALL
/usr/local/etc/zlogin
stty erase $(printf "\010")
xtset Host: $(hostname)
xtset コマンド(シェル関数)は x11/xtset ポート由来で、わざわざインストールするまでも無く自作している(その程度のプログラム)。
- XTERMタイトルバーの更新機能に対応しているターミナルでは、これの実行によりタイトルバーが変更される。
- 何か重要な作業することがあって、ターミナル毎に作業している場合、タイトルバーで区別することが可能である。
/usr/local/etc/zshenv
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
/usr/local/etc/zshrc
bindkey -e
autoload compinit
compinit
alias ls="ls -lwF"
alias vi=vim
unset zle_bracketed_paste
export LC_TIME=C
export LESS=-FRX
export PAGER=jless
export EDITOR=vim
prompt='%h %n@%m%(#.#.$) '
xtset () { printf "\033]1;%s\007\033]2;%s\007" "${*}" "${*}" }
[ -f /usr/local/bin/aws_zsh_completer.sh ] && source /usr/local/bin/aws_zsh_completer.sh
物理環境での追加インストール
smartmontools はストレージのS.M.A.R.T.情報を読み取ってくれるツールである。
- 仮想化環境ではこれの読み取りができないし、読み取った意味も無いので、そのような環境ではインストール不要である。
S.M.A.R.T. disk monitoring tools のインストール
cd /usr/ports/sysutils/smartmontools && make install clean
sysrc smartd_enable="YES"
ストレージ環境に合わせて下記(特に /usr/local/etc/smartd.conf)の設定を行いサーバーを再起動するか service smartd start で手動起動する。
SATA環境
- SATA接続のHDD/SSDの場合の設定例。
2台のストレージがつながってるとして、/dev/ada0、/dev/ada1 の場合の例を示す。
- 何かしら異常を検知したら連絡する先(メールアドレス)を用意しておく。
/etc/periodic.conf
daily_status_smart_devices="/dev/ada0 /dev/ada1"
/usr/local/etc/smartd.conf
/dev/ada0 -H -m メールアドレス /dev/ada1 -H -m メールアドレス
- ドライバ種別は指定していないので、自動判定を行っている。
このケース(SATA)で、なお敢えて、指定するとしたら -d atacam になる。
HPE SmartArray Pシリーズ環境
- RAIDコントローラに接続されたストレージ(HDD/SSD)の場合の設定例。
4台のストレージがつながってるとして、個別には /dev/ciss0,n (n≧0)を指定できる場合の例を示す。
- 何かしら異常を検知したら連絡する先(メールアドレス)を用意しておく。
/etc/periodic.conf
daily_status_smart_devices="/dev/ciss0,0 /dev/ciss0,1 /dev/ciss0,2 /dev/ciss0,3"
/usr/local/etc/smartd.conf
/dev/ciss0 -d cciss,0 -H -m メールアドレス /dev/ciss0 -d cciss,1 -H -m メールアドレス /dev/ciss0 -d cciss,2 -H -m メールアドレス /dev/ciss0 -d cciss,3 -H -m メールアドレス
-d オプションでしている設定は smartmontools のドライバ名であるため、デバイス名とは違う点に注意。
VMware環境での追加インストール
- ホスト(ESXi)とゲスト(FreeBSD)間での状態を交換するためのツールです。
- 特に、安全にVモーションするためには必須のツールです。
vmblock はホストとゲスト間でのコピー&ペーストを実現するためのドライバです。
- X11上でしかコピペできない(コンソール相手にはできない)ため明示的に無効にしています。
/etc/make.conf
emulators_open-vm-tools_UNSET= DOCS FUSE LIBNOTIFY
The Open Virtual Machine Tools のインストール
cd /usr/ports/emulators/open-vm-tools && make install clean
sysrc vmware_guest_vmblock_enable="NO"
echo 'rc_quiet="YES"' > /etc/rc.conf.d/vmware_guest_vmblock
手動立ち上げ
※再起動すれば自動的に立ち上がるようになっています(デフォルトON)。
service vmware-kmod start
service vmware-guestd start
よくある質問とその答え
Q.なんで二回もリビルドしてるのですか?
A.いわゆる完全なクロスコンパイル環境では発生しえませんが、セルフビルド環境ではホストのバイナリが紛れ込むことがあるため、それを排除するために二回リビルドしています。
なので以後のリビルドは一回で十分です。もちろんCPUを変更したり、メジャーバージョンアップするなら二回リビルドした方が良いです。
究極的には Thompson hack の話を無視できないので、どこまでを許容するかという話になります。
Q./usr/bin/perl なんて今時…
A.昔作ったスクリプトや他の環境で作ったスクリプトをそのまま運用するための設定ですね。長いこと運用しているとそういうのが…。
そういう意味では /bin/bash の類いはケア(/usr/local/bin/bash でもOKなように)してるケースはあまり見かけませんね。
bash が /bin にあることを前提にしている人が多いように見受けられます。
Q.CPUTYPEなんてnativeを指定しておけば良きに計らってくれるんでね?
A.その通り。ではない(どっち?)。単純にコンパイルするという観点で言えばコンパイラがCPUを自動判定して最適化してくれます。
しかしビルドシステム(bsd.cpu.mk)ではランタイムに判定していないので、各種CPU拡張機能が未対応として処理が進みます。
CPUのことを何も考えてないアプリであればコンパイラが良き(SIMDエンジン使用するなど)に計らってくれますが、
CPUに応じて最適化の選択ができるアプリ(数値演算ライブラリ等)では、適切な選択が行われず、CPU拡張機能を使用してくれない場合があります。
もう一つ、最初に設定した時は native で良きに計らってくれても良いけど、後になってどのCPU向けであったか分からなくなることがあります。
そのことも踏まえて、自分が使用しているシステムのCPUアーキテクチャは把握しておいた方がいいです。