Debianをインストール中

Debian 9.4をクリーンインストールしました。
その備忘録デス

Debian 10でも同じです。(しょっちゅうインストールしている模様)

# インストール中

途中、Gnomeが選択されています。ここでは、それを外し、選択は、最後に表示される2つだけにしています。ssh serverと、その他のツールのみです。
Gnomeの選択を外すと、インストールが高速化される印象であり、一方で、肝心なツールがインストールされない印象。そのため、インストール後に基本的な設定が必要になります。

# インストール後

## 基本設定

### 必要なツールのインストール

```
# apt-get install -y net-tools
# apt-get install -y sudo
# apt-get install -y samba
# apt-get install -y xorg lxde-core xrdp tigervnc-standalone-server
# apt-get install -y x11vnc
# apt-get install -y rsync
# apt-get install -y qemu-kvm libvirt-clients qemu-utils libvirt-daemon-system virt-manager
# apt-get install -y mdadm
# apt-get install -y firmware-realtek
# apt-get install -y nfs-kernel-server
# apt-get install -y acpidump
# apt-get install -y task-japanese locales-all
# apt-get install -y ibus-mozc
# apt-get install -y nginx
# apt-get install -y build-essential
# apt-get install -y openvpn
# apt-get install -y sdparm
# apt-get install -y bridge-utils
# apt-get install -y lxc
# apt-get install -y freerdp
# apt-get install -y ansible sshpass
```

#### Sudoersの変更

```
#vi /etc/sudoers

# User privilege specification
root    ALL=(ALL:ALL) ALL
myid    ALL=NOPASSWD: ALL  <<==追記
```

**myid ALL=NOPASSWD: ALL**を追記
これで、sudoするときに、パスワードなしで実行できるようになります。
好みですが、パスワード不要派はドウゾ

#### sudo で、DISPLAYを正しく動かす設定

```
alias sudo='sudo XAUTHORITY=/home/myid/.Xauthority'
```

もしくは、単純に.bashrcで、exportしておく

```
export XAUTHORITY=$HOME/.Xauthority
```

これで、sudo gpartedとかいけるはず

#### sambaの変更
ユーザ登録をします。

```
$ sudo pdbedit -u myid -a
$ sudo systemctl restart smbd nmbd
```

#### xrdpの設定
とくに、難しいこともなく、単純にインストール。

```
$ sudo apt-get install -y xrdp tigervnc-standalone-server
$ sudo systemctl start xrdp 
$ sudo systemctl enable xrdp
```

このあと、お気に入りのセッション設定を、/etc/xrdp/xrdp.iniに記述します。

```/etc/xrdp/xrdp.ini
;
; Session types
;

[myhost]
name=myhost
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
#xserverbpp=24
#delay_ms=2000
```

違う端末から、同じセッションに入れるようにするには、次の"param8"と"param9"おまじないが必要
これを入れないと、クライアントAで起動した5910セッションに、クライアントBからはいれない

```/etc/xrdp/sesman.ini
[Xvnc]
param=Xvnc
param=-bs
param=-nolisten
param=tcp
param=-localhost
param=-dpi
param=96
param8=-SecurityTypes
param9=None
```
リモートデスクトップで接続する

.xsessionファイルの立ち上げ。これがないと、xrdpにつないだ後、エラーがでる。そもそもコンソールでもstartxが動かないので、設定漏れに気づくハズ。

```
$ echo "lxsession -e LXDE" > ~/.xsession
```

コンソールのログイン画面をCUIにしておくためのコマンド

```
$ sudo systemctl stop lightdm.service
$ sudo systemctl disable lightdm.service
```

#### xrdpの設定 - Ubuntu 22.04 2022 Spring
22.04のプレリリースから、2022年6月現在、apt install xrdpでインストールしたxrdpでは、動かない事象が発生中。(上記の手順でのインストールはだめ。他のは不明、たとえば、lxde以外のDEのケースなど)

```
[INFO ] error loading libvnc.so specified in xrdp.ini, please add a 
[INFO ] valid entry like lib=libxrdp-vnc.so or similar
```

このような感じで、libvnc.soが読めないようなエラーが発生。

しかたがないので、野良ビルドします。手順は、 [本家のまま](https://github.com/neutrinolabs/xrdp/wiki/Building-on-Debian-8)です。

```
wget https://github.com/neutrinolabs/xrdp/releases/download/v0.9.19/xrdp-0.9.19.tar.gz
tar xvf xrdp-0.9.19.tar.gz
cd xrdp-0.9.19
./
```




#### vncserverの設定
xrdpに乗り換えたので、xrdpの項とちょっとつじつまが合わない箇所あり

```
$ sudo apt-get install -y xorg lxde-core tightvncserver
```

このあと、.vnc/xstartupに、次の一文を加える

```
/usr/bin/startlxde &
```

lxdeをブート時に立ち上がらないようにする呪文

```
$ sudo systemctl set-default multi-user.target
```

vncserverを起動時に自動起動させる

```/etc/init.d/vncserver
#!/bin/sh -e

### BEGIN INIT INFO
# Provides:          vncserver
# Required-Start:    networking
# Default-Start:     3 4 5
# Default-Stop:      0 6
### END INIT INFO

. /lib/lsb/init-functions

case "$1" in
start)
log_action_begin_msg "Starting vncserver"
su myid -c "/usr/bin/vncserver"
;;

stop)
log_action_begin_msg "Stoping vncserver"
su myid -c "/usr/bin/vncserver -kill :1"
;;

restart)
$0 stop
$0 start
;;
esac

exit 0
```

これをサービスに登録

```
$ sudo update-rc.d vncserver default
```


#### ホストの画面をvncで流す

遠くにあるホストの画面を操作したいときの設定

```
$ sudo systemctl start lightdm
$ sudo apt-get isntall x11vnc
$ sudo x11vnc -display :0 -auth /var/run/lightdm/root/:0
```

lightdmの例ですが、次のコマンドで、どこを見ればいいかはわかる

```
$ ps wwwwaux | grep auth
(snip) /usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
```




#### kvm/qemu/libvirtの設定

```
# apt-get install -y qemu-kvm libvirt-clients qemu-utils libvirt-daemon-system virt-manager ovmf
# adduser <youruser> libvirt
# adduser <youruser> libvirt-qemu
```

uefi bootが必要なら、ovmfが必要
virt-manager (GUI) が必要なら、virt-managerが必要。

ブリッジbr0を作る

```/etc/network/interfaces
auto br0
iface br0 inet static
      address 192.168.x.y
      netmask 255.255.255.0
      network 192.168.x.0
      broadcast 192.168.x.255
      gateway 192.168.x.1
      dns-nameservers 192.168.x.1 8.8.8.8 
      bridge_ports eth0
      bridge_stp off
      bridge_maxwait 0
auto eth0
iface eth0 inet manual
```


#### mdadmの設定
mdadmで、データ用ディスクのraid1を実施します。

```
# mdadm --create /dev/md20 --level=raid1 --raid-devices=2 /dev/sdc1 /dev/sdc2
# mdadm --assemble /dev/md20 /dev/sdc1 /dev/sdc2
```

**注意**
新しく作るときは、create
既存のraidを戻すときは、assemble
assembleのときは、raidの条件は、デバイスから読みだされて設定されます

/etc/mdadm/mdadm.confへ、情報を追記

```
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
```

fstabへの登録

```
$ sudo dumpe2fs /dev/md20 | grep UUID
$ sudo ls /dev/disk/by-uuid/ <--確認用
```

ここで表示されるUUIDを利用して、fstabへ登録

**formatが必要な場合**

```
# fdisk /dev/sdx
# mkfs.ext4 /dev/sdx1
```



#### firmware-realtekの設定
そもそも、mdadmをインストールしたら、次のメッセージを受信

```
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8107e-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8107e-1.fw for module r8169
...
```

気持ち悪いので、消しにかかります。
https://unix.stackexchange.com/questions/445673/possible-missing-firmware-update-in-debian-9-4
ここの情報のまんま。いちおう、怒られているチップセットは、realtekのものなので、installは、ffirmware-realtekのみ実施。

```
#sed -i.bak 's/stretch[^ ]* main$/& contrib non-free/g' /etc/apt/sources.list
#apt-get update
#apt-get install -y firmware-realtek
#update-initramfs -u
```

debian 9.4なので、stretchを対象にしています。
debian 10では、busterになります。sed で指定しているstretchを読み替えてください。
もしくは、直接、source.listを変更してもヨシです。mainのあとに、contrib non-freeを追記していくだけです。


#### nfs-kernel-serverの設定

```
$ sudo apt-get install -y nfs-kernel-server
```
その後、/etcにexportsができるので、そこを編集

```
/home           192.168.1.0/255.255.255.0(rw,sync,no_wdelay,no_root_squash)
/mydir          192.168.1.0/255.255.255.0(rw,sync,no_wdelay,no_root_squash)
```


#### nginxの設定

設定ファイルは、次のもの
```
/etc/nginx/nginx.conf
/etc/nginx/sites-enabled/default
```

defaultのroot情報を書き換えると、任意の場所に、rootの位置を変更できる。デフォルトは、/var/www/html。
そこに、index.nginx-debian.htmlがある

phpは、別途ツールを入れないと動かない

```
$ sudo apt-get install php7.0-fpm
$ sudo systemctl start php7.0-fpm
```



(Still, To Be Filled)


#### openvpn serverの設定
複数のサーバを起動するときには、systemctrlでの指定を工夫する

```
# systemctl start openvpn@(thefirst)
# systemctl start openvpn@(thesecond)
```
thefirst.confとthesecond.confが、/etc/openvpn/配下に存在すること
これで、複数のopenvpnが1台のサーバで提供可能

TUNのときは、以下の設定を忘れないようにしましょう
- /etc/sysctl.conf: net.ipv4.ip_forward=1
- if-up.shとif-down.shを更新して、接続時にiptablesでサブネットをつなぐ


#### 外付けHDDの節電設定 (sdparm)

```
# sdparam -S 5 /dev/sdx
```

とすると、hddのスピンを止めることができるらしいが、うちの環境では動いていない


#### Bridgeの設定

以下を追記

```/etc/network/interfaces
auto br0
iface br0 inet static
        address 192.168.0.2/24
        gateway 192.168.0.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.1.1
        # br
        bridge_ports eth0
        bridge_stp off
        bridge_maxwait 0
```

もし、eth0にdhcpでアドレスが割り振られている場合は、解除することも可能

```
# ip addr del <dhcp ip> dev eth0
```

#### lxc
残念ながら、Debian (10.4も) では、lxdは、apt-getできないので、lxcをapt-getします。(snapで、lxdがはいるらしいですが、挑戦せず)

```
$ sudo apt-get install -y lxc
```

設定は面倒なので、sudoでのみ利用

```
$ sudo lxc-create -t download -n newvm
$ sudo lxc-start -n newvm
$ sudo lxc-attach -n newvm
```

もし、エラーが出たら、認証をやめることで、回避可能。自己責任でお願いします。

```
$ sudo lxc-create -t download -n newvm
Setting up the GPG keyring
ERROR: Unable to fetch GPG key from keyserver
lxc-create: newvm: lxccontainer.c: create_run_template: 1617 Failed to create container from template
lxc-create: newvm: tools/lxc_create.c: main: 327 Failed to create container newvm
$ sudo lxc-create -t download -n newvm -- --no-validate
Downloading the image index
WARNING: Running without gpg validation!
```


### システム設定
#### UID/GIDの変更
Linuxでは、UID/PIDがユーザ名で、かつ、1000:1000で登録されてしまいます。
長年、違う番号を使っていたのと、家族のGroupが1000なので、変更する。

```
# groupmod -g 1001 mygrp
# usermod -u 1001 -g 1001 myid
# groupadd -g 1000 home
```

#### Userの追加
ほかの人のIDを追加します。

```
# groupadd -g 1002 hoge
# useradd -u 1002 -g 1002 -m -d /home/hoge hoge
```

groupへ追加する

```
usermod -a -G newgrp hoge
```

グループ名そのものを変更する場合

```
groupmod --new-name newgname currentgname
```

ほかのユーザのidを参考にする手順

```
$ id -G hoge                         ; -Gで、数字のみ一覧表示
$ sudo usermod -a -G a,b,c,d,e hoge  ; -Gに、","区切りで連結できる
```

#### lxdeメニューにアプリケーションを追加する

google-chromeで、プロファイルを使い分けて、メニューに登録します。google-chrome2.desktopはお好きな名前に変えてください。

```
$ cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome2.desktop
$ vi ~/.local/share/applications/google-chrome2.desktop
```

変更箇所は、2箇所
- Name = メニュー表示時に表示される名前になる
- Exec = 実際に起動されるプログラム (3箇所ある)

たとえば、以下のような感じに変更します。

```
Name=Google Chrome2
Exec=/usr/bin/google-chrome --user-data-dir=.config/google-chrome2 --enable-crashpad
```


#### sshするとき、パスワードフリーにする

```
$ ssh-copy-id -i ~/.ssh/id_rsa.pub myid@myhost
```


#### Swapファイルの設定
パーティションを分けるのが嫌いなので、基本、swapファイルを作成して登録、運用しています。
8ギガのマシンなので、大体半分くらいとっておこう、という感じ

```
$ sudo mkdir /swap
$ sudo dd if=/dev/zero of=/swap/swap.img bs=1M count=4096
$ sudo chmod 600 /swap/swap.img
$ sudo mkswap /swap/swap.img
$ sudo swapon /swap/swap.img
```

#### ファイルのコピー
rsyncを使う。

```
rsync -av --bwlimit=10000 (from) (to)
```

Bandwidthがないと、rsyncが全力でコピーするので、ほかの作業がのろくなる。

#### ファイルのコピー2

```
$ ionice -c3 nice -n 19 sudo rsync -axHAWXS --numericids --delete --info=progress2 / /mnt/root
```

ここでのprogress2は、あまり役に立たないですが、おまじない。
また、負荷制御として、bwlimit=10000 と指定してもいいですが、サーバの負荷がないときも、律儀に帯域制限をかけてしまうので、やめた。

#### ファイルのコピー3

特定の時間以降のものをコピーする方法。rsyncとfindを組み合わせます。

```
rsync --progress  --files-from=<(find digi -mtime -3 -type f) /(from)/ /(to)
```

findでは、コマンドから下のディレクトリが参照されるので、そこに合わせて、fromとtoを設定する必要があります。話を簡単にするには、”/”ルートからたどるようにすればよい。

この例は、"-3"なので、3日前から、現在までのファイルををコピーします。


#### 大きなファイルを探し出す
duを使って掘っていく。max-depthで、掘り進める深度が指定できる。
あとは、大きい順にソートするだけ

```
sudo du -h --max-depth=1 --exclude="hoge" / | sort -hr
```

#### cpanの呪縛
perlな人なので、perlを入れる。
cpanでうまく入らない場合は、apt-getでやってみる

```
# apt-get install -y libXXX-YYY-ZZZ-perl
```
XXX, YYY, ZZZは、XXX::YYY::ZZZにそれぞれ相当。
cpan installでうまくいかなければ、apt-getか、cpanコンソールから、install。

#### crontabの再設定

```
$ crontab -e
```
で編集されるファイルは、次のところにある
```
/var/spool/crontabs/myid
```
必要なタスクをコピペすればOK


#### Node.jsのインストール
素直なaptではなかったので、こちらに記載

```
$ sudo apt-get install -y curl
# curl -sL https://deb.nodesource.com/setup_12.x | bash -
$ sudo apt-get install -y nodejs
```

#### IPv6を中止

```/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

#### umountで困ったら

```
# umount -f
# umount -l
```

"-f"でだめなら、"-l"でやってみる

#### Timezone

en-usモードでインストールすると、アメリカ時間しか設定できないので、以下の作業が必要

```
sudo timedatectl set-timezone Asia/Tokyo
```
#### 2画面、左右制御

- xrandrでデバイス名を確認
- xrandr (option)で入れ替え

```
$ xrandr 
Screen 0: minimum 320 x 200, current 4480 x 1440, maximum 8192 x 8192
HDMI-1 connected primary 1920x1080+2560+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080     60.00*+  60.00    50.00    59.94  
   1920x1080i    60.00    60.00    50.00    59.94  
   1680x1050     59.88  
   1280x1024     60.02  
   1280x960      60.00  
   1152x864      59.97  
   1280x720      60.00    60.00    50.00    59.94  
   1024x768      60.00  
   800x600       60.32  
   720x576       50.00  
   720x480       60.00    60.00    59.94    59.94  
   640x480       60.00    59.94    59.94  
HDMI-2 connected 2560x1440+0+0 (normal left inverted right x axis y axis) 280mm x 150mm
   2560x1440     59.95*+  49.96  
   1920x1080     60.00    60.00    50.00    59.94  
   1920x1080i    60.00    59.94  
   1400x1050     59.95  
   1280x1024     75.02    60.02  
   1440x900      59.90  
   1280x960      60.00  
   1280x720      60.00    60.00    59.94  
   1024x768      75.03    70.07    60.00  
   800x600       72.19    75.00    60.32    56.25  
   640x480       75.00    72.81    60.00    59.94  
   720x400       70.08  
$ xrandr --output HDMI-1 --right-of HDMI-2
```

うちの環境は、2Kが左、FHDが右にある。2K(=HDMI-2)の右にFHD(=HDMI-1)を持ってくるようにオプションを指定。コマンド投入直後に、左右が入れ替わる。

#### debianからxrdpサーバへ接続

いつもは、Windows PCから接続しますが、たまにxrdpを動かしているサーバそのものから、アクセスする必要が出てきたので、試した。

まずは、freerdpのインストール

```
$ sudo apt-get install freerdp
```

単純に起動すると、以下のエラーで、起動が妨げられる

```
$ xfreerdp 192.168.0.2
(snip)
[xx:xx:xx:308] [2596:2597] [ERROR][com.freerdp.core.update] - [0x03] Cache Glyph - SERVER BUG: The support for this feature was not announced! Use /relax-order-checks to ignore
(snip)
```

これを回避するには、いろいろとオプションをつける必要がある。
- +glyph-cache
- /relax-order-checks

また、こいつらを指定するとオプションの付け方がいろいろ変わり、最終的には、次で起動。

```
$ xfreerdp /w:1920 /h:1080 /v:192.168.0.2 +glyph-cache /relax-order-checks
```

/w: /h: 1920x1080
/v: xrdp server


#### DockerをKVM環境に同居させたら、iptablesの設定がおかしくなった

ホストマシン以外からpingを打ったり、仮想マシンからpingを打っても、通らなくなる事象が発生。ipbalesを書き換えることで対応

```
$ sudo iptables -A FORWARD -i br0 -o br0 -j ACCEPT
```

出来心でインストールしたDockerでひどい目にあった

#### lxcのあれこれ
debianでは、lxdがapt-getできないので、がんばってlxcを使います。

設定は、次のところにあるconfigを操作します。

```
/var/lib/lxc/{machine}/config
```

| 機能 | 変数名 | 値 |
|:-----------|:------------|:------------|
|自動起動の設定|lxc.start.auto           |0:off, 1:on  |
|tun生成-1    |lxc.cgroup.devices.allow|c 10:200 rwm  |
|tun生成-2    |lxc.mount.entry         |/dev/net/tun dev/net/tun none bind,create=file|
|apparmorで引っかかったら|lxc.apparmor.profile|unconfined|

tunは見にくいので、以下に参考

```
lxc.cgroup.devices.allow = c 10:200 rwm
lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file
```

これがあれば、lxc内のコンテナで、openvpnやsoftehterのようなtunを利用するvpnの構築が可能になります。

softether(client)の場合は、tunに対して、dhcpの設定も必要です。(ubuntuならnetplanに追記する)
また、忘れがちですが、/etc/sysctl.confへ、ip forwardの設定を忘れると通信しません。

インストール時、認証エラーで止まる場合は、次の呪文を追加する

```
$ sudo lxc-create -n mymachine -t download -- --no-validate
```

apparmorのエラーで引っかかった場合のおまじない

```
lxc.apparmor.profile=unconfined
```



#### watchの代わりにwhileを使う

コマンドをループさせるのに、watchがありますが、時系列に追いにくいので、whileでやる。

```
while [ 1 ]; do df | grep sda1; sleep 5;done
```

#### shell scriptのgetoptsを使う

```
#!/bin/sh
while getouts ab:c: options
do
    case $options in
      a)
        echo "option a. without an arg"
        ;;
      b)
        echo "option b. with an arg, ${OPTARG}"
        argb=$OPTARG
        ;;
      c)
        echo "option c. with an arg, ${OPTARG}"
        argc=$OPTARG
        ;;
      \?)
        echo "Unknown params. Quit!!"
        exit 1
    esac
done
```

引数が必要な場合、":"を文字の後ろに入れること
上記例だと、aは引数なし。b,cは引数あり。引数ありの場合、どちらもOPTARGという名前の変数に入るので、都度、別の変数への引き渡しが必要。

引数の獲得(OPTARGが値を持つ)に":"が必要だということがわからず、ハマった。

#### bluetoothを使う

```
$ bluetoothctl devices
$ bluetoothctl remove xx:xx:xx:xx:xx:xx
$ sudo bluetoothctl scan on
$ bluetoothctl connect xx:xx:xx:xx:xx:xx
```

devicesで、接続されているものを表示。
切断するには、removeする
scanで、対象のデバイスを探せる
connectで、対象のデバイスを接続する

#### ubuntuをインストールしたら、使っている環境のせいで、default gwが引けない問題

dhcpサーバの問題で、dhcpクライアントが、default gwを引っ張ってくれない。そんなときは、netplanを改版して頑張る

```
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
      routes:
        - to: 0.0.0.0/0
          via: 192.168.0.1
```

default gwで検索をかけても見つからなかったので、素直に普通のルート追加にした。


#### 最新のカーネルを使う

ホストを入れ替えたら、ehternet(realtek r8111)もwifi(Intel AX200)も認識してくれない。Googleとbackportsを使えと出てきたので、その記録。
健気に、apt update/upgradeをしたら、上書きされるっぽいので、根気よく続ける必要がありそう。

```
echo deb http://deb.debian.org/debian buster-backports main contrib non-free | sudo tee /etc/apt/sources.list.d/buster-backports.list
sudo apt update
sudo apt install -t buster-backports linux-image-amd64
sudo apt install -t buster-backports firmware-linux
sudo apt install -t buster-backports firmware-iwlwifi
```

[ここ](https://unix.stackexchange.com/questions/545601/how-to-upgrade-the-debian-10-kernel-from-backports-without-recompiling-it-from-s/545609#545609)と[ここ](https://unix.stackexchange.com/questions/590439/wifi-driver-for-debian-10)より抜粋


#### 起動ディスクの引っ越し

起動中に、他のディスクへ引っ越し
/dev/sdaXに現運用データ、/dev/sddXがコピー先と仮定。

##### 新しいディスクの番号を確認
dmesgで表示されているのもから、対象を引っ掛ける。今回は、Samsungの2.5inchのディスクなので、"sams"で検索。その後、idが5とわかったので、"sd 5"で追加検索。

```
$ sudo dmesg | grep -i "sams\|sd 5"
[    1.685085] ata6.00: ATA-11: Samsung SSD 860 QVO 1TB, RVQ01B6Q, max UDMA/133
[    1.794282] scsi 5:0:0:0: Direct-Access     ATA      Samsung SSD 860  1B6Q PQ: 0 ANSI: 5
[    1.796952] sd 5:0:0:0: [sdd] 1953525168 512-byte logical blocks: (1.00 TB/932 GiB)
[    1.796954] sd 5:0:0:0: [sdd] Write Protect is off
[    1.796955] sd 5:0:0:0: [sdd] Mode Sense: 00 3a 00 00
[    1.796959] sd 5:0:0:0: [sdd] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    1.798308] sd 5:0:0:0: [sdd] supports TCG Opal
[    1.798308] sd 5:0:0:0: [sdd] Attached SCSI disk
[    4.446208] sd 5:0:0:0: Attached scsi generic sg3 type 0
````

##### フォーマット
もとのファイルとおなじようになるように、partedを利用。
もとの構成。mdadmを利用しているので、raidになっていますが、気にしない。

```
$ sudo parted /dev/sda u s p
Model: ATA ST2000LM015-2E81 (scsi)
Disk /dev/sda: 3907029168s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start    End          Size         File system  Name  Flags
 1      2048s    124927s      122880s      fat32              boot, esp
 2      124928s  3907028991s  3906904064s                     raid
```

これと同じようになるように、操作していく。ただし、容量が違うので、2番目は、ディスクの最大サイズを指定する。

```
$ sudo parted /dev/sdd
GNU Parted 3.2
Using /dev/sdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u s p                                                            
Model: ATA Samsung SSD 860 (scsi)
Disk /dev/sdd: 1953525168s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End          Size         Type     File system  Flags

(parted) mklabel gpt                                                      
Warning: The existing disk label on /dev/sdd will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? yes                                                               
(parted) p                                                                
Model: ATA Samsung SSD 860 (scsi)
Disk /dev/sdd: 1953525168s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  Flags

(parted) mkpart                                                           
Partition name?  []?                                                      
File system type?  [ext2]? fat32                                          
Start? 2048s                                                              
End? 124927s                                                              
(parted) p                                                                
Model: ATA Samsung SSD 860 (scsi)
Disk /dev/sdd: 1953525168s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End      Size     File system  Name  Flags
 1      2048s  124927s  122880s  fat32

(parted) set 1 esp on                                                     
(parted) p
Model: ATA Samsung SSD 860 (scsi)
Disk /dev/sdd: 1953525168s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End      Size     File system  Name  Flags
 1      2048s  124927s  122880s  fat32              boot, esp

(parted) mkpart
Partition name?  []?                                                      
File system type?  [ext2]? ext4                                           
Start? 124928s                                                            
End? 1953525167s                                                         
Warning: You requested a partition from 124928s to 1953525167s (sectors
124928..1953525167).
The closest location we can manage is 124928s to 1953525134s (sectors
124928..1953525134).
Is this still acceptable to you?
Yes/No? yes                                                               
(parted) p                                                                
Model: ATA Samsung SSD 860 (scsi)
Disk /dev/sdd: 1953525168s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start    End          Size         File system  Name  Flags
 1      2048s    124927s      122880s      fat32              boot, esp
 2      124928s  1953525134s  1953400207s  ext4

(parted) q                                                                
Information: You may need to update /etc/fstab.

$ sudo mkfs.vfat -v -F 32 /dev/sdd1
mkfs.fat 4.1 (2017-01-24)
/dev/sdd1 has 255 heads and 63 sectors per track,
hidden sectors 0x0800;
logical sector size is 512,
using 0xf8 media descriptor, with 122880 sectors;
drive number 0x80;
filesystem has 2 32-bit FATs and 1 sector per cluster.
FAT size is 945 sectors, and provides 120958 clusters.
There are 32 reserved sectors.
Volume ID is 83eac85f, no volume label.
$ sudo mkfs.ext4 -v /dev/sdd2
mke2fs 1.44.5 (15-Dec-2018)
fs_types for mke2fs.conf resolution: 'ext4'
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
61046784 inodes, 244175025 blocks
12208751 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2392850432
7452 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Filesystem UUID: 5a4ca314-e967-42fb-bc72-825334073196
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done     
```

##### ファイルをコピー

```
$ sudo mkdir /mnt
$ sudo mount /dev/sdd2 /mnt
$ sudo rsync -avP --exclude='/backup' --exclude='/home/kvm' --exclude='/boot/efi/EFI' --exclude='/dev' --exclude='/mnt' --exclude='/proc' --exclude='/sys' --exclude='/tmp' / /mnt
$ sudo mount /dev/sdd1 /mnt/boot/efi
$ sudo rsync -avP /boot/efi/ /mnt/boot/efi
$ sudo mkdir /mnt/dev
$ sudo mount --bind /dev /mnt/dev
$ sudo mkdir /mnt/dev/pts
$ sudo mount --bind /dev/pts /mnt/dev/pts
$ sudo mkdir /mnt/proc
$ sudo mount --bind /proc /mnt/proc
$ sudo mkdir /mnt/sys
$ sudo mount --bind /sys /mnt/sys
$ sudo chroot /mnt
# grub-install /dev/sdd
Installing for x86_64-efi platform.
Installation finished. No error reported.
# update-grub
Generating grub configuration file ...
(snip)
# exit
$ findmnt
$ sudo umount /mnt/sys/fs/fuse/connections
$ sudo umount /mnt/sys
$ sudo umount /mnt/proc
$ sudo umount /mnt/dev/pts
$ sudo umount /mnt/dev
$ lsblk -f /dev/sdd
NAME FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sdd                                                                   
├─sdd1
│    vfat         83EA-C85F                                           
└─sdd2
     ext4         5a4ca314-e967-42fb-bc72-825334073196  496.4G    41% /mnt
$ sudo vi /mnt/etc/fstab    # update uuid in fstab
$ sudo umount /mnt
```

##### 再起動
uuidの変更ができたら、おしまい。あとは、biosから、こちらの新しいhdd(sdd)を選択して、起動。正しく設定できていれば、こちらから起動するはず。(/dev/sddXがroot(/)になっていることが確認できます。)

```
$ sudo reboot
(snip)
$ df | grep sdd
/dev/sdd2       960321244  390952068  520517788  43% /
/dev/sdd1           60479       3330      57150   6% /boot/efi
```



## 番外編

### サブネット間をつなぐ

自宅(eth0):192.168.0.0/24 と 接続先(vpn0):172.16.0.0/16 とをつなぐ際の設定。中継するサーバに、次の設定をします。

```
# iptables -A FORWARD -i eth0 -o vpn0 -j ACCEPT
# iptables -t nat -A POSTROUTING -o vpn0 -s 192.168.0.0/24 -j MASQUERADE
# iptables -A FORWARD -i vpn0 -o eth0 -j ACCEPT
# iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j MASQUERADE
```

同一サブネットにいる他のPCでは、routeの設定が必要。192.168.0.1は、中継サーバのIPアドレス

```
# route add -net 172.16.0.0/16 gw 192.168.0.1
```


### 仮想イメージの容量変更

```
$ qemu-img resize -f raw <filename> <size>G/M/K
<attach to some vm>
$ sudo fdisk /dev/vdx
fdisk> p
fdisk> d
fdisk> n (p/1/2048/<max>/no)
fdisk> p
fdisk> w
$ sudo e2fsck /dev/vdxy
$ sudo resize2fs /dev/vdxy
```

### virshでusbを接続する

usbだけに、hotplugしたい衝動にかられます。簡単にできたので、記録。

接続したいusbの情報を確認する

```
$ lsusb
Bus 002 Device 001: ID XXXX:XXXX Linux Foundation 3.0 root hub
Bus 001 Device 005: ID XXXX:XXXX Logitech, Inc. Unifying Receiver
Bus 001 Device 016: ID abcd:0123 ABCD, My Target
Bus 001 Device 001: ID XXXX:XXXX Linux Foundation 2.0 root hub
```

lsusbで、まず、ターゲットのid情報を入手。ここでは、"abcd:0123"。これを、xmlに仕立てる。

```myusb.xml
<hostdev mode='subsystem' type='usb' managed='yes'>
	<source>
		<vendor id='0xabcd'/>
		<product id='0x0123'/>
	</source>
</hostdev>
```

このファイルを用いて、attach, detachすればOK

```
# virsh attach-device <vmname> --file myusb.xml
# virsh detach-device <vmname> --file myusb.xml
```

デバイスIDが変わっても有効なので、便利です。

### /usr/local/lib にパスを通す

LD_LIBRARY_PATHでもいいのですが、別のやり方をメモ

```
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig
```

### Qtが入っていないと怒られた

厳密には、Ubuntuの話になります (Debian -> KVM -> ubuntu 20.04 でUbuntu入っています)

```
During initialization the error "/lib/x86_64-linux-gnu/libQt5Core.so.5: version `Qt_5.15' not found (required by /home/ubuntu/.local/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so)" occurred in /usr(snip)
```
という形でエラーが出たときの解決方法デス

```
$ pip3 uninstall PyQt5
$ sudo apt-get install python3-pyqt5
```

これでエラーは解消します。

### ansibleでセットアップする

```
$ ansible-playbook -i (target)  (ansible.yaml)
```



# 機械学習関係

venvを使う場合は、先にpython3-venvをインストールしましょう

```
$ sudo apt-get install python3-venv
```

## OpenCV

```
$ python3 -m pip install -U opencv-python
$ python3 -m pip install -U opencv-python-headless
$ python3 -m pip install -U opencv-contrib-python
```

### 自己ビルドの場合

```
$ wget https://github.com/opencv/opencv.git
$ wget https://github.com/opencv/opencv_contrib.git
$ cd opencv
$ mkdir build
$ cd build
$ cmake -DWITH_CUDA=ON -DWITH_CUFFT=ON -DWITH_CUBLAS=ON -DWITH_NVCUVID=ON -DWITH_TBB=ON -DMKL_WITH_TBB=ON \
 -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../
$ make -j N (N = num of cpu core)
```

CUDAを利用するには、CUDA系のパラメータをONにする必要がある

## Tensorflow

```
$ python3 -m pip install -U tensorflow-gpu
```

GPUが動くかは、本家にプログラムがあるので、それで確認しましょう。

```
$ python3
>>> import tensorflow as tf
>>> gpu_available = tf.test.is_gpu_available()
>>> print("GPU: ", gpu_available)
GPU:  True
>>> is_cuda_gpu_available = tf.test.is_gpu_available(cuda_only=True)
>>> print("CUDA:", is_cuda_gpu_available)
CUDA: True
```

## 複数のCUDAをインストールした場合

/usr/local 配下に複数のCUDAが現れます。

```
$ ls -1F /usr/local/ | grep cuda
cuda@
cuda-12@
cuda-12.1/
cuda-12.3/
```

update-alternativesで管理されているか確認

```
$ update-alternatives --display cuda
cuda - manual mode
  link best version is /usr/local/cuda-12.3
  link currently points to /usr/local/cuda-12.1
  link cuda is /usr/local/cuda
/usr/local/cuda-12.1 - priority 121
/usr/local/cuda-12.3 - priority 123
```

ここでは、12.1と12.3で管理されていることが確認できます。

```
$ update-alternatives --config cuda
There are 2 choices for the alternative cuda (providing /usr/local/cuda).

  Selection    Path                  Priority   Status
------------------------------------------------------------
  0            /usr/local/cuda-12.3   123       auto mode
* 1            /usr/local/cuda-12.1   121       manual mode
  2            /usr/local/cuda-12.3   123       manual mode

Press <enter> to keep the current choice[*], or type selection number: 
```

ここで、変更する際は、番号を入れます。今回は、cuda-12.1を選択中となります。