Hatena::ブログ(Diary)

わすれないうちにメモしよう

2017-07-16

CentOS7 KVMでNVIDIAのGPUをWindowsにパススルーする

WindowsNVIDIAドライバOSKVMハイパーバイザー環境で動作していることを検知すると error 43 で動作停止するという仕様のため、回避するために以下の対策が必要。
1. libvirtドメイン設定でハイパーバイザーのベンダーIDを偽装する
2. libvirtドメイン設定で hidden state を on にする

詳細は下記
 https://wiki.archlinuxjp.org/index.php/OVMF_による_PCI_パススルー
 9.1	Windows仮想マシンNVIDIAGPU をパススルーした場合に "Error 43 : Driver failed to load"


上記対策はUEFIモードでインストールしたWindowsのみで有効。
BIOSモードでインストールしたWindowsではエラーが出る)

UEFIモードでインストールできるようにするために、OVMF(Open Virtual Machine Firmware)のインストール・設定を行う。

・OVMFのインストール
# vi /etc/yum.repos.d/kraxel.repo
include=https://www.kraxel.org/repos/firmware.repo
# yum install edk2.git-ovmf-x64


virt-installの設定
vert-install で --boot uefi オプションを指定できるようにするために、下記設定を追加する
# /usr/local/etc/libvirt/qemu.conf 
nvram = [
    "/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd:/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd",
    "/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw:/usr/share/edk2.git/aarch64/vars-template-pflash.raw"
]


virt-installUEFI を指定してインストール
# virt-install \
   --boot uefi \
  <省略>
virt-managerインストールする場合はファームウェアの指定でUEFIを選択する ※OVMFは virtioで接続したディスクからOS起動できないため、IDE もしくは virtio-scsi での接続が必要

2017-06-24

CentOS7 KVM virt-installで仮想マシンをインストールする一例

・仮想ディスク作成

# qemu-img create -f qcow2 /usr/local/var/lib/libvirt/images/vm1.qcow2 8G


virt-install
# virt-install \
 --connect qemu:///system \
 --boot uefi \  ← UEFIモードでインストールしたい場合は指定する。OVMFの事前設定が必要。
 --name vm1 \
 --vcpus=1 \
 --cpu host \
 --ram=1024 \
 --os-type=linux \
 --os-variant=virtio26 \
 --disk=/usr/local/var/lib/libvirt/images/vm1.qcow2 \
 --cdrom=/mnt/storage-1/application_installer/ISO/CentOS-7-x86_64-NetInstall-1611.iso \
 --network bridge=br0 \
 --graphics vnc,password=foobar,port=5910,listen=0.0.0.0,keymap=us
os-type は linux, windows, unix, other のいずれか ※os-variant で指定できるパラメータは下記コマンドで確認  # osinfo-query os ※指定できる cpu の種類は下記コマンドで確認  # virsh cpu-models x86_64 ※使用できるCPU機能は下記で確認  # cat /usr/share/libvirt/cpu_map.xml


VNC仮想マシンに接続
上記の例では <ホストのIP>:5910 にアクセスし、パスワード:foobar を入力


各種パラメータについては下記を参照。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/

2017-06-23

CentOS7 KVM ksmdを停止する

ksm は複数のVMが持っている同一メモリーページを集約してメモリー使用量を減らすことができる。
ただしCPUリソースをそれなりに食うのと、十分なメモリーがあればあまり恩恵がないので、不要であれば無効化する。

# systemctl stop ksmtuned
# systemctl disable ksmtuned
# systemctl stop ksm # systemctl disable ksm

2017-06-21

CentOS7 KVMをネストする

・状態確認

# cat /sys/module/kvm_intel/parameters/nested 
N
※無効化されている


・有効化
# vi /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1
# modprobe -r kvm_intel # modprobe kvm_intel ※仮想マシンはすべて停止しておくこと
# cat /sys/module/kvm_intel/parameters/nested Y


CPUのパススルー設定
# virsh edit centos7
<cpu mode='host-passthrough'>

パススルーした仮想マシン上でKVM環境を構築する

2017-06-17

CentOS7 KVM 最新のQEMUとlibvirtをインストールする

どちらも yumインストールできるが、
2017/6時点で古いバージョンがインストールされる。
最新のものを使いたい場合は手動でインストールする。

インストール済みの QEMUlibvirtアンインストール

# yum -y remove qemu-kvm libvirt virt-manager


QEMUインストール
# yum -y groupinstall 'Development tools'
# yum -y install zlib zlib-devel glib2 glib2-devel ncurses-devel SDL-devel
# cd /usr/local/src/ # wget http://download.qemu-project.org/qemu-2.9.0.tar.xz # xz -dv qemu-2.9.0.tar.xz # tar xvf qemu-2.9.0.tar # cd qemu-2.9.0/ # ./configure # make # make install


libvirtインストール
# yum install -y libnl-devel libxml2-devel yajl-devel device-mapper-devel libpciaccess-devel
# cd /usr/local/src/ # wget http://libvirt.org/sources/libvirt-3.4.0.tar.xz # xz -dv libvirt-3.4.0.tar.xz # tar xvf libvirt-3.4.0.tar # cd libvirt-3.4.0/ # ./configure # make # make install
# systemctl enable libvirtd # systemctl start libvirtd


virt-installインストール
# yum install -y virt-install
virt-install は /var/run/libvirt/libvirt-sock 経由で libvirt に接続するが、 libvirt を手動インストールした場合、socket は /usr/local/var/libvirt/libvirt-sock に作成されるため、 virt-install が参照できるようにシンボリックリンクを作成しておく
# ln -s /usr/local/var/run/libvirt/ /var/run/libvirt

CentOS7 最新の安定板カーネルへの更新方法

・最新カーネルyumで追加できるようにする

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm


・最新カーネルインストール
# yum -y --enablerepo=elrepo-kernel install kernel-ml


・起動するカーネルの変更
# rpm -qa | grep "^kernel" | sort
# grub2-editenv list
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
# grub2-set-default 0
 ※デフォルトにしたいkernelの番号を指定
# grub2-editenv list
# reboot
# uname -a


・関連パッケージの入れ替え
# rpm -qa | grep "^kernel" | sort
# yum -y --enablerepo=elrepo-kernel swap kernel-headers -- kernel-ml-headers
# yum -y --enablerepo=elrepo-kernel swap kernel-tools-libs -- kernel-ml-tools-libs
# yum -y --enablerepo=elrepo-kernel swap kernel-tools kernel-ml-tools
# yum -y --enablerepo=elrepo-kernel swap kernel-devel -- kernel-ml-devel
# rpm -qa | grep "^kernel" | sort


・旧カーネルの削除
# yum -y remove kernel
# rpm -qa | grep "^kernel" | sort

2017-04-01

Zabbix で smartctl の値を監視する

・エージェント側の smartctl で値を取得できることを確認

# smartctl -A /dev/sda | grep Temperature | awk '{print $10}'
# smartctl -A /dev/sda | grep Offline_Uncorrectable | awk '{print $10}'
# smartctl -A /dev/sda | grep Reallocated_Sector_Ct | awk '{print $10}'
# smartctl -A /dev/sda | grep Current_Pending_Sector | awk '{print $10}'


・エージェント側の zabbixユーザで、リモート/パスワードなしで sudo smartctl が実行できるように設定変更
# visudo
Defaults:zabbix !requiretty
※zabbixユーザにtty接続なしで sudo 実行を許可する
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/smartctl -A /dev/sd? ※zabbixユーザにパスワードなしで sudo smartctl を実行することを許可する


・エージェント側でzabbixユーザパラメータ設定
# vi /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1
UserParameter=hdd.smart[*],sudo smartctl -A /dev/$1 | grep $2 | awk '{print $$10}'
※$$10 は $ のエスケープ処理
# systemctl restart zabbix-agent.service


・値取得テスト
エージェント側で実施
# zabbix_agentd -t hdd.smart[sda,Temperature]
サーバ側で実施 # zabbix_get -s <エージェントのIPアドレス> -k hdd.smart[sda,Temperature]


・Zabbix管理画面でアイテム設定
名前:$1 - Current_Pending_Sector
タイプ:Zabbixエージェント
キー:hdd.smart[sda,Current_Pending_Sector]


・Zabbix管理画面でトリガー設定
名前:sda Pre-fail
条件式
{host:hdd.smart[sda,Offline_Uncorrectable].last()}>0 | 
{host:hdd.smart[sda,Reallocated_Sector_Ct].last()}>0 |
{host:hdd.smart[sda,Current_Pending_Sector].last()}>0
深刻度:任意

2017-03-29

CentOS7 smartctlの見方と不良セクタの修復方法

smartの見方

# smartctl -A /dev/sda
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 173 3 Spin_Up_Time 0x0027 227 180 021 Pre-fail Always - 3641 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 121 5 Reallocated_Sector_Ct 0x0033 184 184 140 Pre-fail Always - 486 7 Seek_Error_Rate 0x002e 100 253 000 Old_age Always - 0 9 Power_On_Hours 0x0032 053 053 000 Old_age Always - 34589 10 Spin_Retry_Count 0x0032 100 100 000 Old_age Always - 0 11 Calibration_Retry_Count 0x0032 100 100 000 Old_age Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 121 192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 51 193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 69 194 Temperature_Celsius 0x0022 124 109 000 Old_age Always - 26 196 Reallocated_Event_Count 0x0032 191 191 000 Old_age Always - 9 197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 1 198 Offline_Uncorrectable 0x030 100 253 000 Old_age Offline - 0 199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0 200 Multi_Zone_Error_Rate 0x0008 100 253 000 Old_age Offline - 0


注目すべき値は下記項目
5 Reallocated_Sector_Ct		代替処理済みセクタ数
197 Current_Pending_Sector	代替処理保留中セクタ数
198 Offline_Uncorrectable	代替不能セクタ数
※「RAW_VALUE」を見ること
※「VALUE」や「THRESH」は値が一定範囲に収まるように正規化されている


・5 Reallocated_Sector_Ct
HDD代替セクタ(※)を上回らなければ動作には問題ない。
(メーカーやHDDによって数が違う。非公開情報だが、2TBで1000程度はある模様)
・短期間で数が増えるようであれば早急にバックアップを取って交換する。
・増えないのであれば使用は可能だが、信頼性は落ちるので、交換するかどうかは任意。


・197 Current_Pending_Sector
・198 Offline_Uncorrectable
・たまたま代替処理できなかった場合でも数が増えるため、手動で修復(※後述)すれば解消する場合がある。
・ギリギリ読み込みできているHDDに対して実施するとトドメとなる場合があるため、手動でやる場合は事前にバックアップを取ること。
・修復しても数が0にならない場合は交換した方が無難。
・修復しても数が0になっても、その後、短期間で数が増えるようであれば交換する。


不良セクタの修復
不良セクタの検出
# badblocks -vs -o badblocks.txt /dev/sda1
不良セクタの修復(マーキング) # e2fsck -y -l badblocks.txt /dev/sda1 ※不良セクタを使用しないようにマーキングしているだけなので、厳密には修復ではない
上記の2コマンドをまとめて実施 # fsck -t -y -f -c /dev/sda1

2016-12-10

CentOS7 NICオフロード機能の無効化

使用するアプリケーションによってはオフロード機能が動作に影響するので、無効化する。

・状態確認

# ethtool -k enp3s0


・変更(一時的)
# ethtool -K br0 rx off tx off sg off tso off gso off gro off


・変更(永続)
# vi /etc/udev/rules.d/50-eth.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="br0", RUN+="/sbin/ethtool -K br0 rx off tx off sg off tso off gso off gro off"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="virbr0", RUN+="/sbin/ethtool -K virbr0 rx off tx off sg off tso off gso off gro off"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="enp3s0", RUN+="/sbin/ethtool -K enp3s0 rx off tx off sg off tso off gso off gro off"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="enp0s25", RUN+="/sbin/ethtool -K enp0s25 rx off tx off sg off tso off gso off gro off"

2016-11-26

Ubuntu16.04 samba のインストール

インストール

# apt-get install samba


・設定
# vi /etc/samba/smb.conf
-----
[storage-1]
   comment = storage-1
   browseable = yes
   writable = yes
   read only = no
   valid users = hiro
   create mask = 0755
   path = /mnt/storage-1/
recycle:repository = recycle recycle:versions = yes recycle:touch = no recycle:maxsize = 0 recycle:exclude = *.tmp *.temp
[storage-2] comment = storage-2 browseable = yes writable = yes read only = no valid users = hiro create mask = 0755 path = /mnt/storage-2/
recycle:repository = recycle recycle:versions = yes recycle:touch = yes recycle:maxsize = 0 recycle:exclude = *.tmp *.temp -----


・ユーザ追加
# pdbedit -a -u <ユーザ名>


・ユーザ参照
# pdbedit -L


自動起動
# systemctl enable samba.service


再起動
# service smbd restart

Ubuntu16.04 Serviioのインストール

・java8 のインストール(Serviio の動作に必要)

# add-apt-repository ppa:webupd8team/java
# apt-get update
# apt-get install oracle-java8-installer
# java -version


・Serviio のダウンロード、設置
http://serviio.org/download
# cd /opt
# wget http://download.serviio.org/releases/serviio-1.7.1.1-linux.tar.gz
# tar zvxf serviio-1.7.1.1-linux.tar.gz
# mv serviio-1.7.1.1-linux serviio


・起動
# ./serviio/bin/serviio.sh


・設定
http://<PCのアドレス>:23423/console/ にアクセスする
・「メタデータ」で取得するメタデータを設定  → サムネイルを作成したり、メタデータを取得する設定にすると    ファイル追加に時間がかかるので、不要な場合は設定しないこと ・「ライブラリ」→「共有フォルダ」でファイルを追加  → 「内部説明メタデータを検索」にチェックを入れるとファイル追加に時間がかかるので、    不要な場合はチェックを外すこと


自動起動の設定
# vi /lib/systemd/system/serviio.service
※Serviio の設置先に合わせてパスを変更すること
-----
[Unit]
Description=Serviio daemon
[Service] Type=simple Environment=statedir=/opt/serviio #path to serviio environment ExecStart=/opt/serviio/bin/serviio.sh #path to serviio.sh on your FS
[Install] WantedBy=multi-user.targetroot -----
# systemctl enable serviio.service # service serviio stop # service serviio start


・リモートディスク内ファイルがライブラリに自動反映されない問題の対策
詳細 → http://wiki.serviio.org/doku.php?id=library_scanning_mechanism

ServiioはOS機能でファイル追加を検知してリアルタイムでライブラリを更新する(NATIVE方式)。
ただし、リモートディスクを共有フォルダに指定した場合、ファイル追加をOSが検知できないためライブラリが自動更新されない。
自動更新させるために、定期的に共有フォルダをポーリングする設定を有効にする必要がある(POLLER方式)。

# vi /opt/serviio/bin/serviio.sh
JAVA_OPTS に下記オプションを追加する
-Dserviio.forceLibraryPoller=true ※ポーリングの有効化(デフォルトは false)
-Dserviio.libraryPollerFrequency=30 ※ポーリング間隔(デフォルトは 1min)

# service serviio restart
※設定の反映

・system properties の変更
変更方法 →
http://serviio.org/index.php?option=com_content&view=article&id=21#q3
変更できる値 →
http://serviio.org/index.php?option=com_content&view=article&id=43

2016-08-14

Ubuntu16 Chinachuのインストール

・必要パッケージのインストール

# apt-get install autoconf build-essential curl git-core libccid libpcsc-perl libpcsclite-dev libpcsclite1 libssl-dev libtool linux-headers-`uname -r` mercurial pcsc-tools pcscd pkg-config yasm


・カードリーダの動作確認
# pcsc_scan


・PT3ドライバインストール
# cd /usr/local/src/
# git clone https://github.com/m-tsudo/pt3.git
# cd pt3/
# make
# make install
# echo "blacklist earth-pt3" >> /etc/modprobe.d/blacklist.conf # modprobe pt3_drv # reboot
# ls /dev/ | grep pt3 ※デバイスが存在することを確認


・arib25(放送波のデコード)のインストール
# cd /usr/local/src/
# wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
# unzip c44e16dbb0e2.zip
# cd pt1-c44e16dbb0e2/arib25
# make
# make install


・recpt1のインストール
# cd /usr/local/src/
# git clone https://github.com/stz2012/recpt1.git
# cd recpt1/recpt1
# ./autogen.sh
# ./configure --enable-b25
# make
# make install
# recpt1 --b25 --strip 22 10 /var/test.ts --device /dev/pt3video2 ※録画できることを確認  デバイス:video0/1:衛星放送       video2/3:地上デジタル  チャネル:22ch  録画時間:10秒


・chinachuの実効ユーザの作成
# adduser chinachu


・chinachuのインストール
インストール方法 公式ページ:https://github.com/kanreisa/Chinachu/wiki
# su - chinachu
$ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
$ cd ~/chinachu/
$ ./chinachu installer
※1を選択 Auto(full)


・起動前設定
$ echo "[]" > rules.json
$ cp config.sample.json config.json
$ vi config.json
  下記を追記
  "schedulerEpgRecordTime": 180,
  "operSchedulerSleepStartHour": 0,
  "operSchedulerSleepEndHour": 5,
 → 4行目あたりに下記を追加(EPGの取得時間(デフォルト:60秒)を長くして、番組表の歯抜けを防止する
 → 0時〜5時の間は番組表を更新しない
下記を編集 "channels":  → 地域に合わせてチャンネルを設定
不要であれば「FSUSB2」のチューナー設定を削除


・起動
$ ./chinachu service operator execute
$ ./chinachu service wui execute


・WebUIアクセス
http://<サーバのIPアドレス>:10772
※ユーザ名:パスワードは config.jsonの「wuiUs」の項目を確認


EPG取得テスト
$ ./chinachu update -f


自動起動設定
$ ./chinachu service operator initscript > /tmp/chinachu-operator
$ ./chinachu service wui initscript > /tmp/chinachu-wui
$ exit
# cd /tmp # chown root:root chinachu-* # chmod 755 chinachu-* # mv chinachu-* /etc/init.d/ # update-rc.d chinachu-operator defaults # update-rc.d chinachu-wui defaults # service chinachu-operator start # service chinachu-wui start
# ps ax | grep chinachu ※起動していることを確認


CLIコマンド
$ chinachu rules
自動予約ルール確認
$ chinachu reserves 予約済み番組の確認
$ chinachu recording 録画中番組の確認
$ chinachu reserves recorded 録画済み番組の確認
$ chinachu updater Chinachuのアップデート
$ chinachu update 番組表手動更新
$ chinachu update -f 番組表の作り直し


・ファイル名のフォーマット

<date:日付フォーマット> 日時(dateformatが使われる)
<id> 番組ID
<type> 放送波の種類
<channel> チャンネル番号
<channel-id> チャンネルID
<channel-sid> SID
<channel-name> チャンネル名
<tuner> チューナー名
<title> タイトル
<fulltitle> EPGで受信したタイトル
<subtitle> サブタイトル
<episode> 話数
<category> ジャンル