Skip to main content

Posts about linux (old posts, page 1)

kvm virtualization

qcow2 イメージ

作成。

qemu-img create -f qcow2 image.qcow2 xxG

シュリンク。仮想マシンを止めて実行する。

mv image.qcow2 image.qcow2.bak
qemu-img convert -O qcow2  image.qcow2.bak image.qcow2

qemu-kvm コマンドのよく使うオプション

cdイメージから起動

-cdrom image.iso -boot d

cpuとメモリの指定

-smp 2 -m 2048

kvmでwindows10を使用する時、私の環境(Core i5 650)だと下記のように指定することで、cpu負荷が落ち着いた。

-cpu core2duo,+lahf_lm

その後、試行錯誤し、現在は下記の通り指定している。

-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time

(仮想)ストレージの指定。準仮想化ドライバを利用すると、スループットが上がるらしい。 (Windows等で利用する場合は、仮想マシン上でドライバを入れる必要がある。)

-drive if=virtio,file=image.qcow2

ネットワークインターフェースの指定(従来方式)

-net nic,macaddr=xx:xx:xx:xx:xx:xx,model=virtio
-net tap,ifname=vnet0

vncコンソールとキーマップの指定。

-vnc 192.168.xx.xx:xx -k ja

コンソールのマウスカーソルの位置がずれるときは以下を指定 (WindowsではCPU負荷が高くなるらしい)

-usbdevice tablet

デーモンとして起動

-daemonize

物理デバイスのパススルー

example

boot ultra lite linux distribution microcore linux for network configure test

kvm -drive if=virtio,file=linux-microcore-6.4.img -netdev tap,id=tap0 -device e1000,netdev=tap0,mac=52:54:00:12:34:56

CentOS7 basic operation

パッケージ更新

uname -a
yum check-update
yum update

chronyの設定

yum list chrony
ls -l /etc/chrony.conf*
cp -pi /etc/chrony.conf /etc/chrony.conf.000
ls -l /etc/chrony.conf*
diff -u /etc/chrony.conf{,.000}

systemctl status chronyd.service
ps -ef | grep chronyd | grep -v grep
chronyc sources
chronyc tracking
chronyc sourcestats
chronyc -a makestep

systemctl restart chronyd.service

サービスの自動起動設定と解除

systemctl list-unit-files  -t service
systemctl is-enabled chronyd.service

systemctl disable chronyd.service
systemctl enable chronyd.service

パッケージ削除と確認

yum remove chrony
yum list chrony

パッケージ導入

yum install ntp
yum list ntp

サービス起動

systemctl status ntpd.service
systemctl start ntpd.service

x window system tools

xmodmap

Xでキーマップのカスタマイズをするコマンド

[shift]+[ins]でペースト操作をしたいのに、自宅で使っているキーボードでは、[ins]が[fn]と[del]の同時押しになっている。 そんな時に、xmodmapを活用すると便利。

設定をファイルに書き込んでおいて、下記のようにロードする。

xmodmap ~/.xmodmaprc

xrandr

Xでディスプレイの表示解像度を変更するコマンド 表示するディスプレイの切り替えもできる。

使用可能なモニターと設定の表示

xrandr

「HDMI」モニターを、「VGA」モニターの右側に表示する

xrandr --output HDMI --right-of VGA

「HDMI」モニターへの表示を停止する。

xrandr --output HDMI --off

解像度の変更

xrandr --output HDMI --mode 1366x768

デフォルトへ変更

xrandr --output HDMI --auto

cpu governor on raspbian

configure cpu governor

cpu情報の確認

cat /proc/cpuinfo

cpuクロック関連ツール導入

apt-get install cpufrequtils

現在のクロックやガバナの表示

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

状態確認

cpufreq-info
cpufreq-info -p

ガバナの変更

cpufreq-set -g ondemand

os起動時のガバナの指定

cp -pi /usr/share/doc/cpufrequtils/examples/cpufrequtils.sample /etc/default/cpufrequtils
vi /etc/default/cpufrequtils

service cpufrequtils restart

Disable swap on raspbian buster

systemctl status dphys-swapfile

systemctl stop dphys-swapfile
systemctl is-active dphys-swapfile

systemctl disable dphys-swapfile
systemctl is-enabled dphys-swapfile

rm /var/swap

Use tmpfs

mount -t tmpfs tmpfs <mount point>

or

cat << END >> /etc/fstab
tmpfs           /tmp            tmpfs   defaults,size=256m,noatime,mode=1777  0       0
END
mount /tmp

basic commands usage

よく使う基本的コマンドの使用パターンを記載。

sort

IPv4アドレスのソート例

... | sort -t. -k1n -k2n -k3n -k4n

一部一致した行の行数をそれぞれ数える

awk '{print $2 $3}' filename | uniq -c

uniq

ソートして重複行を除外

... | sort | uniq

seq

通番の範囲で繰り返して実行

for num in `seq 0 7`; do
ping -c 1 192.168.0.1${num}
done

grep

ログ確認

grep -i -E "crit|emer|alert|err|warn" /var/log/messages
dmesg | grep -i -E "crit|emer|alert|err|warn"

コメント行と空行を除く

grep -E -v "^#|^$" file

出力を抑止(リターンコード: マッチしたら0、しなかったら1、エラーは2)

grep -q pattern file

出力の前にファイル名を表示しない

grep -h pattern file1 file2 ....

cat

制御文字(タブ文字、改行文字を含む)を含めて、表示する

cat -vte filename

行番号を表示

cat -n filename

script

作業ログの取得

script [-a] [-c command] filename

nohup

ジョブをバックグラウンドで動かし、ログアウトしても続行させる。(nohupさせないと、ログアウトしたらジョブが終了する。) cshの埋め込みコマンドにも同名のものがある。

nohup command arg1 arg2 ... > logfile 2>&1 &

tail

GNUのtailは複数のファイルを与えることができる

tail -n 5 file1 file2 ...

追加されたデータを表示する

... | tail -f

mkisofs

isoイメージファイル作成

mkisofs -r -J -o filename.iso dirname

col

manの出力からバックスペースを削除してテキストに出力

man man | col -b > outfile

script

scriptでログを取得し、エスケープシーケンスを適切に処理して閲覧する。

script [-c command] [-a] [logfile]
less -R logfile

date

3週間前の日付を表示

date --date "3 weeks ago" "+%Y%m%d"

昨日の日付を表示

date --date yesterday "+%Y%m%d"

or

TEMP_TZ=$TZ
export TZ=JST+15
yesterday=`date +%Y%m%d`
export TZ=$TEMP_TZ

dump and restore

dumpとrestoreは、ファイルシステムレベルでバックアップ、リストアを行います。対応してるのはext2等に限られます。

他のOS、他のファイルシステムでも、同様のアプリケーションがあります。(FreeBSDの例)

以下、使い方の例。

レベル0バックアップ(フルバックアップ) ここではdumpdatesファイルを、デフォルトの/etc配下ではなく、/dirに保存している。

dump -0u -D /dir/dumpdates -f filename.dump /dev/sdx

レベル0からの増分バックアップする際のダンプレベルの例

0 1 1 1 1 . . .

前回からの差分バックアップする際のダンプレベルの例

0 1 2 3 4 . . .

ハノイの塔アルゴリズムの例

0 3 2 5 4 7 6 9 8  1 3 2 5 4 7 6 9 8  1 3 2 . . .
レベル0のフルバックアップは長期保存。
レベル1を週次で取得し、以後のレベルを日次で実施するといった運用。

一括リストア。 フルリストアの後、適したダンプレベルのリストアを順に行う。

cd /mnt
restore -rf filename.dump
:
rm restoresymtable
ハノイの塔アルゴリズムで増分バックした場合:
レベル8までリストアする例: 0 (1) 2 4 6 8
レベル9までリストアする例: 0 (1) 2 4 6 9

特定ファイルのみリストア

restore -xf filename.dump ./file

対話モードで選択してリストア

cd /mnt
restore -if filename.dump
> cd dir
> ls
> add file
> extract

gzipで圧縮し、ssh転送してリモートホストにバックアップ

dump -0uf - /mountpoint | gzip -c | ssh user@remotehost dd of=/dir/filename.gz
ssh user@remotehost dd if=/dir/filename.gz | gzip -cd | restore -rf -

gzipで圧縮し、ssh転送してリモートホストでリストア

dump -0uf - /mountpoint | gzip -c | ssh user@remotehost 'gzip -cd | restore -rf -'
または
ssh user@remotehost 'dump -0uf - /mountpoint | gzip -c' | gzip -cd | restore -rf -

rsync

rsync は同期ツールで、バックアップをとるのにとても重宝します。

以下、使い方のメモ。

/src配下のdirディレクトリを、/dst配下のdirディレクトリとしてコピー。 (/src/dirの内容を、/dst/dirの中にコピー。)

rsync -av /src/dir /dst
or
rsync -av /src/dir/ /dst/dir

コピー元で削除されたファイルを、コピー先で削除する。

rsync -av --delete /src/dir /dst

sshを介して、remotehostの内容をローカルにコピーする。

rsync -av -e ssh user@remotehost:/dst /src/dir 
(この場合、リモート側にもrsyncをインストールする必要がある。)

その他オプション

-n          # テスト実行
--bwlimit=n # 帯域制限(kbps)

参考: scp の帯域制限は -l n(kbps)

dd

dd はディスクイメージを保存・リストアするのに便利なコマンドです。

ifを指定しなければ標準入力を使用。同様に、ofを指定しなければ標準出力を使用します。

以下、使い方をメモしておきます。 (コピー&ペーストで利用する場合は充分気をつけて利用してください)

ディスクイメージをfilename{へ保存, リストア}する例。 (リストアのコマンドは、ベンダ等から配布されているisoイメージ等をusbメディア等 に書き込む際等によく使用されます)

dd if=/dev/sdx of=filename bs=1M
dd if=filename of=/dev/sdx bs=1M

gzipで圧縮して{保存, リストア}する例。

dd if=/dev/sdx bs=1M | gzip -c filename.gz
gzip -cd filename.gz | dd of=/dev/sdx bs=1M

ディスクイメージを、gzipで圧縮・転送し、remotehostのfilename.gz{へ保存, からリ ストア}する例。

dd if=/dev/sdx bs=1M | gzip -c | ssh user@remotehost dd of=filename.gz
ssh username@remotehost dd if=filename.gz | gzip -cd | dd of=/dev/sdx bs=1M

ディスクイメージを、gzipで圧縮・転送し、remotehostのディスク{へ, から}直接リス トアする。

dd if=/dev/sdx bs=1M | gzip -c | ssh user@remotehost 'gzip -cd | dd of=/dev/sdx bs=1M'
または
ssh user@remotehost 'dd if=/dev/sdx bs=1M | gzip -c' | gzip -cd | dd of=/dev/sdx bs=1M

create empty file

dd if=/dev/zero of=file.img bs=1M count=512
mkfs -t ext4 file.img
mount -o loop file.img /mnt

sparse file

dd if=/dev/zero of=file.img bs=1M count=0 seek=512
ls -lhs file.img
tar cSf tarfile.tar file.img

These image files could be used as block devices by loopback device. At first find available loop device. Then use it.

$ losetup -f
$ losetup /dev/loop0 file.img
$ losetup -a

$ mkfs -t ext2 /dev/loop0 100
$ mount -t ext2 /dev/loop0 /mnt
$ umount /dev/loop0
$ losetup -d /dev/loop0

When you mount an image backup file which has partition table, it need to specify offset:

$ fdisk -l file.img
$ mount -o loop,ro,offset=$((sector_size*start_position)) file.img /mountpoint

or

$ kpartx -a -v file.img 
$ mount /dev/mapper/loop0p1 /mountpoint
$ umount /mountpoint
$ kpartx -d -v file.img

wipe a disk

$ dd if=/dev/zero of=/dev/sdx bs=4096
$ dd if=/dev/urandom of=/dev/sdx bs=4096

or you can use shred command.

$ shred --verbose --random-source=/dev/urandom -n 1 /dev/sdx

docker life cycle

ライフサイクルをざっと。

dockerデーモンの起動と動作確認。ubuntuの場合。

$ sudo service docker status
$ sudo service docker start
$ sudo docker run --rm hello-world

リポジトリに登録されているイメージを取得する。

$ sudo docker pull debian:latest
Pulling repository debian
6845b83c79fb: Download complete
575489a51992: Download complete
Status: Downloaded newer image for debian:latest
$ 
$ sudo docker images debian
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian              latest              6845b83c79fb        13 days ago         125.1 MB
$

コンテナを作成して実行。コンソール接続してbashを実行する例。

$ sudo docker run -it debian:latest /bin/bash
root@06e1a850e923:/# 
root@06e1a850e923:/# w
 22:20:47 up 29 days, 14:32,  0 users,  load average: 0.36, 0.29, 0.24
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root@06e1a850e923:/#
root@06e1a850e923:/# uname -a
Linux 06e1a850e923 3.13.0-63-generic #103-Ubuntu SMP Fri Aug 14 21:42:59 UTC 2015 x86_64 GNU/Linux
root@06e1a850e923:/#
root@06e1a850e923:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="https://bugs.debian.org/"
root@06e1a850e923:/#

コンソール接続したコンテナから一旦切断する例。

root@xxxxxxxxxxxx:/# [Ctl+p]-[Ctl+q]
$ 
$ sudo docker ps | grep debian
xxxxxxxxxxxx        debian:latest       "/bin/bash"         About a minute ago   Up About a minute                       berserk_mayer
$

再接続する例。

$ sudo docker attach xxxxxxxxxxxx
root@xxxxxxxxxxxx:/#

コンテナを終了する例。

root@06e1a850e923:/# exit
exit
$

終了したコンテナを再起動する例。

$ sudo docker ps -a | grep debian
xxxxxxxxxxxx        debian:latest            "/bin/bash"            13 minutes ago      Exited (0) 13 seconds ago                                          berserk_mayer
$
$ sudo docker start -i xxxxxxxxxxxx
root@xxxxxxxxxxxx:/# 
root@xxxxxxxxxxxx:/# exit
exit
$

コンテナの状態確認。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ 
$ sudo docker ps -a | grep debian
06e1a850e923        debian:latest            "/bin/bash"            2 minutes ago       Exited (0) 47 seconds ago                                      evil_kowalevski

$

copy file from/to docker container

$ sudo docker cp xxxxxxxxxxxx:/dirname/filename destination
$ sudo docker cp source xxxxxxxxxxxx:/dirname/filename

コンテナの削除。

$ sudo docker rm 06e1a850e923
06e1a850e923
$ 
$ sudo docker ps -a | grep debian
$

イメージの削除。

$ sudo docker rmi debian:latest
Untagged: debian:latest
Deleted: 6845b83c79fb642ed6af06cceaca042e155717ca8eb0b5cffa9c43f1f7f70348
Deleted: 575489a51992d5d30976ff5ba7f7eabdc134acfb51c79ff48883089009594e64
$
$ sudo docker images debian
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
$

dockerイメージの作成

$ mkdir project && cd project
$ 
$ vi Dockerfile
$ 
$ sudo docker build -t imagename:tagname . | tee build.log
$ 
$ sudo docker images imagename
$

When you want to use proxy, use --build-arg option like bellow

$ sudo docker build --build-arg http_proxy=http://192.168.xxx.xxx:3142/ -t imagename:tagname . | tee build.log

When new image name is , then rename it as below

$ sudo docker tag xxxxxxxxxxxx imagename:tagname
$ 
$ sudo docker images imagename

不要なイメージの一括削除

sudo docker images | awk '$1~/<none>/ {print}'
sudo docker images | awk '$1~/<none>/ {print $3}' | xargs sudo docker rmi

使用するdockerfileの簡単な例。

From debian:latest
RUN apt-get update && apt-get install -y \
    screen \
    openssl \
    vim \
   make \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

removal of old kernel packages in ubuntu

新しいカーネルをインストールした後、元のカーネルパッケージを削除せずそのままにしておくと、/bootを小さく切っている場合など、ディスク領域を圧迫してくる場合があります。 そんな時は、使用していない古いカーネルを削除することで、ディスクに空きを作ることができます。

以下、Ubuntuで、使用していない古いカーネルを削除する流れです。

現在のディスク使用状況を確認

$ df -h /boot

現在のカーネルの情報を確認

$ uname -a

インストールされているカーネルパッケージのバージョンを確認し、不要なバージョンがどれなのかを調べる。

$ dpkg -l | awk '$2~/^linux/ {print}'

バージョンを指定して、削除対象のパッケージを抽出する (カーネルだけでなく、カーネルソース等の関連パッケージも削除対象とする)

$ dpkg -l | awk '$2~/^linux/ {print $2}' | grep x.xx.x-xx

削除を実行

$ dpkg -l | awk '$2~/^linux/ {print $2}' | grep x.xx.x-xx | xargs sudo aptitude -y purge

不要なパッケージが削除されたことを確認

$ dpkg -l | awk '$2~/^linux/ {print $2}' | grep x.xx.x-xx

現在のディスク使用状況を確認

$ df -h /boot

以上、不要なバージョンを全て削除するまで繰り返して実行する。

自分は、現在使っているカーネルの他に、何か問題が発生した際の保険として、一世代前のカーネルも削除せずに残すようにしています。