Skip to content

Instantly share code, notes, and snippets.

@k16shikano
Last active February 26, 2023 10:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k16shikano/0824c5eb148f0b4a9dc21450fd380078 to your computer and use it in GitHub Desktop.
Save k16shikano/0824c5eb148f0b4a9dc21450fd380078 to your computer and use it in GitHub Desktop.
Debian作業用サーバをインストールするときのまとめ 2022.1(bullseye)

OSインストールとか

mini.isoをUSBメモリに入れて、USBブートする。 amd64向けのISOイメージは、USBメモリに直接cpするだけでブート可能なものができる。

$ curl http://ftp.jp.debian.org/dists/stable/main/installer-arch/current/images/netboot/mini.iso > mini.iso
$ cp mini.iso /dev/sda
$ sync

このUSBメモリでブートしてインストーラの指示に従う。

  • インターネットアクセスが必要
  • いまどきパーティションは分割しないほうがあとで後悔しない
  • 時刻設定が言語とキーボードの設定から類推されてしまった
  • サーバにする場合、デスクトップまわりのチェックを外して「SSHサーバ」にチェックいれる

sudo

$ su
# apt update
# apt install sudo

ユーザをsudoグループに追加すればいいはずなんだけど、毎回はまるので、個人マシンなら自分のユーザを直接指定したほうが手っ取り早い。

$ cat /etc/sudoers
...
# User privilege specification
root	ALL=(ALL:ALL) ALL
k16	ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL
...

aptで入れるやつ

最近は、はやまってaptで入れるとはまりがちな開発環境もあるが、とりあえずこのへんだけはaptでさくっと入れておかないと困る。

$ apt install -y make curl emacs git

emacs

本体はaptで入れるとして、パッケージはもうたいていはmelpaでそろうので、そちらで。

(require 'package)
(add-to-list 'package-archives
  '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

以下、そのほかに~/.emacs.d/init.elに入れておくと便利なやつ。

ターミナル経由で使うときにバッファをキーで操作したり情報を表示したりしたいので、このへんの設定をしてある。C-x ^C-x }は30%キーボードにはつらい。

;; バッファを広げたり縮めたりするキーバインド
(global-set-key (kbd "<M-right>") (lambda () (interactive) (enlarge-window-horizontally 1)))
(global-set-key (kbd "<M-left>") (lambda () (interactive) (enlarge-window-horizontally -1)))
(global-set-key (kbd "<M-up>") (lambda () (interactive) (enlarge-window 1)))
(global-set-key (kbd "<M-down>") (lambda () (interactive) (enlarge-window -1)))

;; スクロールの追加設定
(setq scroll-conservatively 1)
(setq scroll-margin 5)
(setq next-screen-context-lines 3)
(setq scroll-preserve-screen-position t)
(global-set-key (kbd "<C-M-down>") (lambda () (interactive) (scroll-up 10)))
(global-set-key (kbd "<C-M-up>") (lambda () (interactive) (scroll-down 10)))

;; 上または左のバッファに移動するキーバインド
(global-set-key "\C-xp" (lambda () (interactive) (other-window -1)))

;; バッファの右にスクロールバーを表示
(set-scroll-bar-mode 'right)

;; バッファの左に行番号を表示
(require 'linum)
(global-linum-mode t)
(setq linum-format "%4d ")

テキストの正規表現による検索結果をバッファ上でハイライトしっぱなしにしたいことがあるけれど、意外とそういうのなかったので、むかし書いたのをずっと使っている。

;; C-fで正規表現検索してハイライト、C-dでハイライト解除
(setq font-lock-maximum-decoration t)

(defun keep-highlight-regexp (re)
  (interactive "sRegexp: \n")
  (re-search-forward re)
  (make-face 'my-highlight-face)
  (set-face-foreground 'my-highlight-face "black")
  (set-face-background 'my-highlight-face "yellow")
  (defvar my-highlight-face 'my-highlight-face)
  (setq font-lock-set-defaults nil)
  (font-lock-set-defaults)
    (font-lock-add-keywords 'nil (list (list re 0 my-highlight-face t)))
    (font-lock-fontify-buffer))

(defun cancel-highlight-regexp ()
  (interactive)
  (setq font-lock-set-defaults nil)
  (font-lock-set-defaults)
  (font-lock-fontify-buffer))

(global-set-key "\C-f" 'keep-highlight-regexp)
(global-set-key "\C-d" 'cancel-highlight-regexp)

git

メールアドレスを登録しないとGitHubでコミットとアカウントとの紐づけがなされず困る。エディタがemacsでないと困る。diffを行単位より少し細かく見たいときがある。

$ git config --global user.email "GitHubに登録しているメールアドレス"
$ git config --global core.editor 'emacs -nw'
$ git config --global alias.difff "diff --color-words --word-diff-regex='\\w+|[^[:space:]]'"

gauche

公式のget-gauche.shで。

$ curl https://raw.githubusercontent.com/shirok/get-gauche/master/get-gauche.sh > get-gauche.sh
$ chmod +x get-gauche.sh
$ ./get-gauche.sh

text.kakasi

KAKASIを使っているので入れる。

$ sudo apt install libkakasi2-dev
$ git clone git@github.com:shirok/Gauche-text-kakasi.git
$ cd Gauche-text-kakasi/
$ ./configure
$ make
$ sudo make install

Ruby

rbenvで。

これ自体はbashスクリプトなのでRubyは不要。ただし、途中で以下がないと言われるのでインストールしておく。

$ apt install -y libssl-dev zlib1g-dev

まずはrbenv本体を以下の手順で~/.rbenv以下にインストール。

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

$ source ~/.bash_profile
$ rbenv --version

Rubyのインストールには、rbenvのプラグインruby-buildを使う。

以下の手順で~/.rbenv/plugins/ruby-buildにインストール。

$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

これでrbenv installというコマンドが使えるようになるので、以下のようにして好きなバージョンのRubyをインストールする。

$ rbenv install 3.1.0
$ rbenv global 3.1.0

Haskell

ghcとcabalはghcupで入れる。stackも入れられるけど、個人的に扱いにくいので入れない。

公式ページの指示に従って以下を実行してインストール。

$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

これで~/.ghcup/binにghcとcabalがインストールされる。

$ echo 'export PATH="$HOME/.ghcup/bin:$PATH"' >>~/.bash_profile
$ source ~/.bash_profile
$ cabal --version

cabalでPandocやParsecやHXTを入れるとだいたい入る。--libを忘れないこと。

$ cabal update
$ cabal install pandoc --lib
$ cabal install parsec --lib
$ cabal install hxt --lib

環境の管理には ghcup tui を使うこと。

emacsのHaskellまわりの設定

LHSはghcupでインストールされているので、あとはmelpaでlsp-haskellをインストールするだけですべてがうまくいくようになった。haskell-modeやlsp-modeもlsp-haskellを入れればインストールされる。補完されたいのでcompanyも入れる。

init.elにはこう書いておく。

(require 'company)
(require 'lsp)
(require 'lsp-haskell)
(add-hook 'haskell-mode-hook #'lsp)
(add-hook 'haskell-literate-mode-hook #'lsp)
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)

最後の1行はlsp-haskellのドキュメントにはないけど、ghciをemacs内でインタラクティブに使えるようにする(ようするにCtrl-c lできるようにする)ために必要。

cabalのexecutableフラグ

たまに、これをつけないとコマンドラインツールとしてインストールされないのがある。

$ cabal install -fexecutable skylighting

gpg-agent

SSH認証で毎回パスフレーズを入力したくないので一定期間覚えていてくれる仕組みがほしいが、ssh-agentはなんかいまいちなので、gpg-agentを使っている。

gpg-agentのほか、cursesでパスフレーズ入力画面を提供するpinentry-cursesが必要なので、aptで入れる。

$ apt install gpg-agent pinentry-curses

まずはssh-agentが使われないようにする。 そのためには、/etc/X11/Xsession.optionsを編集してuse-ssh-agentをコメントアウト(もしくはno-use-ssh-agentに)すればよい。

# configuration options for /etc/X11/Xsession
# See Xsession.options(5) for an explanation of the available options.
allow-failsafe
allow-user-resources
allow-user-xsession
#use-ssh-agent
use-session-dbus

SSH鍵を登録するためにはgpg-agentが起動している必要がある。

$ eval `gpg-agent --daemon --enable-ssh-support`

gpg-agentはデフォルトでssh-agentとして動作できるけれど、実際に動作するためには環境変数SSH_AUTH_SOCKにソケットファイルの場所を教えてあげる必要があり、その情報を標準出力に出してevalできるようにするのに--enable-ssh-supportオプションが必要になる。詳しくはman gpg-agentを参照。

これでSSH鍵が登録できる。ssh-agentを使うときと同様に、ssh-addをすればよい。ただし鍵は~/.gnupg/private-keys-v1.d/以下に登録される。

$ ssh-add ~/.ssh/<private key>

あとはbashの起動時にgpg-agentが立ち上がるようにすればいいんだけど、ここでちょっとトリッキーなことに、gpg-agentは自分がどのターミナルで起動されたかを知らないので、それを教える必要があるらしい。これにはGPG_TTYという環境変数に現在のttyの値を伝えつつ、gpg-connect-agentというコマンドでUPDATESTARTUPTTYという命令を実行すればいいらしい(参考 https://www.gnupg.org/documentation/manuals/gnupg/Agent-Examples.html#Agent-Examples)。

結局、以下を~/.bashrcに追記する。

eval `gpg-agent --daemon --enable-ssh-support`
export GPG_TTY=$(tty)
LANG=C gpg-connect-agent UPDATESTARTUPTTY /bye

いよいよぐちゃぐちゃになったら~/.gnupgを削除してやり直せばよい。

再起動後に使えなくなった場合

システムを再起動すると gpg-agent running and available とか言われて使えなくなることがある。すでに起動してる gpg-agent を停止してから起動し直しても無駄。

$ gpgconf --kill gpg-agent
$ gpg-agent
gpg-agent[945]: gpg-agent running and available

gpg-agent⁉ 破壊したはずでは…

これは、どうやらsystemdの配下に入れられてしまっていて、再起動後は gpg-agent を呼び出した瞬間に /usr/lib/systemd/user/gpg-agent.service 経由で gpg-agent が実行されてしまうらしい。結果、 SSH_AUTH_SOCK が設定されず、SSH鍵の管理には役立たずになってしまう。

簡単な解決法は gpgconf --list-dirs agent-ssh-socket コマンドで設定すべきソケットファイルがわかるので、~/.bashrc に記述する内容をこう変える。

# eval `gpg-agent --daemon --enable-ssh-support`
export GPG_TTY=$(tty)
LANG=C gpg-connect-agent UPDATESTARTUPTTY /bye
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"

しかし、これは気持ちが悪い。SSH鍵の管理にしか使わない場合、そもそもsystemdで管理するようなものでもないと思うから、それ自体を抑止することにする。 システム起動時にsystemd配下のサービスとして起動されてほしくないものを systemctl mask で指定すると、それが /dev/null と同義になって起動しなくなる。

$ systemctl --user mask gpg-agent
Created symlink ~/.config/systemd/user/gpg-agent.service → /dev/null.

この場合、~/.bashrc を改めて書き直す必要はもちろんない。

samba

aptで入れる。

$ apt install samba

設定ファイル/etc/samba/smb.confを編集するわけだけど、なにはともあれ以下を設定する。

[global]
  map archive = no
  map to guest = never
  usershare allow guests = no

[home]
  read only = no
  create mask = 0644
  directory mask = 755

LaTeX

TeX Live Installerで入れる。

$ wget https://texlive.texjp.org/2021/tlnet/install-tl-unx.tar.gz
$ tar xvzf install-tl-unx.tar.gz
$ cd install-tl-20220127/

ここにinstall-tlというPerlスクリプトがあるので、基本的にはこれを実行すればいいんだけど、いかんせんフルで入れると半日以上かかるし、インストール中にいろいろな設定を聞かれるので放置して寝ることもできない。そこで、「ファイルに書いた設定を-profileオプションで指定できる」という機能を使う。ただ、このファイルは過去にインストールしたときの設定を再利用できるようにinstall-tlTEXDIR/tlpkg以下に生成してくれるものなので、「-profileに指定するファイルに何をどう書けばいいか」のドキュメントはない。ここでmunepiさんの記事にmacOS用のTeX Live 2016付近の設定ファイルがあるのでこれが参考になる。

今回はドキュメントも入れることにして、こんな感じで。

selected_scheme scheme-full
#
TEXDIR /opt/texlive/2021
TEXMFLOCAL /opt/texlive/texmf-local
TEXMFSYSCONFIG /opt/texlive/2021/texmf-config
TEXMFSYSVAR /opt/texlive/2021/texmf-var
TEXMFHOME ~/texmf
TEXMFCONFIG ~/.texlive2021/texmf-config
TEXMFVAR ~/.texlive2021/texmf-var
#
binary_x86_64-linux 1
#
option_doc 1
option_src 0
#
in_place 0
option_adjustrepo 0
option_autobackup 0
option_backupdir tlpkg/backups
option_desktop_integration 0
option_file_assocs 0
option_fmt 1
option_letter 0
option_menu_integration 0
option_path 0
option_post_code 1
option_sys_bin /usr/local/bin
option_sys_info /usr/local/share/info
option_sys_man /usr/local/share/man
option_w32_multi_user 0
option_write18_restricted 1
portable 0

あとはsudo ./install-tl --profile tl2021.profileみたいにすればいいんだけど、個人用マシンだとsudoのumaskを002とかに変えておいたほうがあとではまらない。visudoして以下の設定を追記する。ついでに、インストール後にsudoでtlmgrするときPATHが通ってないと困るので、secure_pathにTeX Liveのインストール先のパスを追記しておく。

Defaults        umask = 0002
Defaults        umask_override
Defaults        secure_path="(略):/bin:/opt/texlive/2021/bin/x86_64-linux/"

ようやくインストール。ここから先は1日がかりなので注意。

$ sudo mkdir -p /opt/texlive/2021/tlpkg
$ sudo ./install-tl --profile tl2021.profile --repository http://texlive.texjp.org/2021/tlnet

install-tlはスクリプトと同じディレクトリにログを残すので、失敗しているパッケージがないか確認する。

$ grep Failed install-tl.log
TLUtils::install_packages: Failed to install mandi
TLUtils::install_packages: Failed to install siunitx
TLUtils::install_packages: Failed to install texlive-scripts
TLUtils::install_packages: Failed to install tkz-fct

どうやら今回はtexlive-scriptsのダウンロードでこけていたらしい。 texlive-scriptsにはfmtutilが含まれており、これにはmktexfmtがあって、これがないとlatexも何もかも使えないので、これだけ再インストールしておく。

$ sudo tlmgr install texlive-scripts

インストールできたらパスを設定する。

$ echo 'export PATH="/opt/texlive/2021/bin/x86_64-linux/:$PATH"' >> ~/.bash_profile

uplatexで必要なotfとかは、TeX Live本体ではなくtlcontribにあるので、これもいれる。ぼくが必要なのでhirapropとlucidabrも入れる。hirapropはむかしはtltexjpという別のリポジトリにあって地味に面倒だったけど、いまはcontrib.texlive.infoにあるのでうれしい。

$ sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
$ sudo tlmgr pinning add tlcontrib '*'
$ sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree
$ sudo tlmgr install hiraprop

あとはフォントをいれる。 フォントは /opt/texlive/texmf-local にコピーまたはシンボリックリンクして mktexlsr する。

ためしにPDFドキュメントを生成。

$ echo "\\relax Hello World! こんにちはせかい\\end" | uptex
$ dvipdfmx texput.dvi
$
$ echo "\\relax \\documentclass{jlreq}\\begin{document}Hello World! こんにちはせかい\\end{document}" | lualatex

コンソールでtexdocする

PDFからテキストを抜き出すツールを使えばよい。ここではhpdftを使う。

$ mkdir ~/texmf/texdoc -p
$ echo "viewer_pdf=hpdft" >> ~/texmf/texdoc/texdoc.cnf
$ texdoc pxjahyper | head -50

ls の色

デフォルトはやたらに太字が多く、色もきついので、調整しておきたい。 .bashrc~/.dircolors という設定ファイルを見るようになっているので、~/.dircolors のANSIカラーコードを書き換えればいいだけど、これは最初は存在しないので以下のようにして生成してあげる必要がある。

$ dircolors -p > ~/.dircolors

生成された ~/.dircolors には、画像っぽい拡張子のファイルに対する色付け設定とかまであって長大だけど、主に修正する箇所だけ抜き出すとこんな感じ。

# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.
(中略)
RESET 0 # reset to "normal" color
DIR 01;38;2;0;180;200 # directory
LINK 00;38;2;0;191;255 # symbolic link. (If you set this to 'target' instead of a
 # numerical value, the color is as for the file pointed to.)
MULTIHARDLINK 00 # regular file with more than one link
FIFO 40;33 # pipe
SOCK 0;38;2;218;112;214 # socket
DOOR 0;38;2;218;112;214 # door
BLK 00;38;2;255;250;10;40 # block device driver
CHR 00;38;2;255;250;10;40 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
MISSING 00 # ... and the files they point to
SETUID 37;48;5;124 # file that is setuid (u+s)
SETGID 30;48;5;214 # file that is setgid (g+s)
CAPABILITY 30;48;5;205 # file with capability
STICKY_OTHER_WRITABLE 30;48;2;50;205;50 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 37;48;2;50;139;50 # dir that is other-writable (o+w) and not sticky
STICKY 37;48;2;0;180;200 # dir with the sticky bit set (+t) and not other-writable
# This is for files with execute permission:
EXEC 0;38;2;200;128;96
(中略)
# archives or compressed (bright red)
.tar 0;38;2;255;105;180
(中略)
# image formats
.jpg 0;38;2;218;112;214
(以下略)

デフォルトの .bashrc にはすでにこんな感じの記述があるはずなので、こちらはとくにいじる必要はない。

# enable color support of ls
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
fi

Python

rbenv からフォークした pyenv (非推奨になったpyvenvではない)というものもあるが、これは素直に apt でよさそう。 どうせ使うのでSphinx経由で入れたが、これだけだと pip が入らない。

$ apt-get install python3-sphinx
$ sudo apt install python3-pip

pip3は ~/.local/bin に実行ファイルを配置するので、パスを通しておく。

$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile

WebDAVサーバ

DPT-S1とのデータのやり取りのためにローカルにWebDAVサーバを使っている。 Apacheやnginxでもいいんだけど、それだけにしか使っていないので、面倒なのは避けたい。 そこでPythonのWSGIWベースで実装されたWsgiDAVを使う。設定ファイルなどが不要でコマンドオプションだけで動かせるのがいい。

インストールはpip3で。cheroot も必要。

$ pip3 install wsgidav cheroot

以下のように実行するだけで http://192.168.1.10:8015 でWebDAVサーバが立ち上がる。

$ wsgidav -H 192.168.1.10 -p 8015 -r $HOME --auth anonymous

DPT-S1の設定

[設定]→[サーバーの設定]→[ネットワークドライブの設定]→[サーバー設定]で設定するのだが、ちょっとトリッキーなところがいくつかある。

まず、サーバのIPアドレスとポートは wsgidav の起動パラメーターを設定するとして、ログイン名とパスワードも入れないと設定を有効にできない。 anonymous で起動しているのでなんでもいいから、とりあえず anonymouspassword などにしておく(むかしのFTPサーバの設定を思い出す)。

もうひとつ、「同期用フォルダーパス」と「送信先フォルダー一覧用パス」という項目も設定しないといけない。 wsgidav の起動パラメーターで指定したルート(上記であれば $HOME)に相当するのは後者で、これは「/」と設定すればいい。 「同期用フォルダーパス」のほうには、そのルート以下にある何らかのディレクトリを指定することになっている。 DPT-S1からアクセスできるのは、こちらで指定したディレクトリのみになる。

Go

aptで入れてもいいが、微妙にバージョンが古いと困ることがあるので、公式のtar.gzをとってきて /opt/go 以下に各バージョンを入れるようにしてみる。

$ wget https://go.dev/dl/go1.17.7.linux-amd64.tar.gz
$ sudo tar -C /opt/go -xzf go1.17.7.linux-amd64.tar.gz
$ cd /opt/go
$ sudo mv go go-1.17.7
$ echo 'export PATH="$(go env GOPATH)/bin:/opt/go/go-1.17.7/bin:$PATH"' >> ~/.bash_profile

bashで補完が効くように、gocomplete をインストールする。

$ go install github.com/posener/complete/gocomplete@latest
$ gocomplete -install

「インストールする?」って聞かれるので、yes を手入力する。

@henrich
Copy link

henrich commented Jan 29, 2022

~/.gnupg/gpg-agent.conf にオプションを書くのはどうでしょうか

enable-ssh-support
default-cache-ttl-ssh   600    
max-cache-ttl-ssh       1800

という感じで。

@k16shikano
Copy link
Author

そのほうがいいかもですね。いずれにせよ gpg-connect-agent に暗に起動させるのはヘンな気がしているので gpg-agent の結果をevalりたいんですが、検索して出てくる記事はなぜか gpgconf の結果を SSH_AUTH_SOCK に明示的に入れさせるものが多く、なにか理由があるんでしょうか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment