Skip to main content

Posts about linux (old posts, page 2)

copy boot drive

make partition

parted /dev/sdc print
parted /dev/sdc rm 1
parted /dev/sdc mkpart primary ext4 1MiB 1GiB 
parted /dev/sdc mkpart primary ext4 1GiB 100% 
parted /dev/sdc set 1 boot on

make filesystem

mkfs -t ext4 -O ^has_journal /dev/sdc1
mkfs -t ext4 -O ^has_journal /dev/sdc2
dumpe2fs /dev/sdc1
dumpe2fs /dev/sdc2

copy files

apt-get install --no-install-recommends dump

mount -o noatime /dev/sdc2 /media/chroot
cd /media/chroot
dump -0 -f - /dev/vgsaturn/lvrootura | sudo restore -rf -

mount -o noatime /dev/sdc1 /media/chroot/boot
cd /media/chroot/boot
dump -0 -f - /dev/sdb1 | sudo restore -rf -

install grub

grub-install --boot-directory=/media/chroot/boot /dev/sdc
grub-mkconfig -o /media/chroot/boot/grub/grub.cfg

lvm

for test, create some image files

dd if=/dev/zero of=file1.img bs=1M count=0 seek=5120
dd if=/dev/zero of=file2.img bs=1M count=0 seek=5120
losetup /dev/loop1 file1.img
losetup /dev/loop2 file2.img

create and remove pv

pvcreate /dev/loop1
pvs
pvdisplay
pvdisplay -m
pvremove /dev/loop1

pvmove can move extents from one pv to another

pvmove /dev/loop1

create and vemove vg

vgcreate vgname /dev/loop1
vgs
vgdisplay
vgchange -an vgname
(if you remove the disk and insert it to another system,
you can find the volume group unless you remove the volume group)
vgremove vgname

you can add/remove pv to vg

vgextend vgname /dev/loop2
vgreduce vgname /dev/loop1

create logical volume

lvcreate -L 1G -n lvname vgname
lvs
lvdisplay
mkfs -t ext4 /dev/vgname/lvname
mount /dev/vgname/lvname /mountpoint

mirror or stripe

lvcreate -L 128M -m 1 -n lvname vgname
lvcreate -L 128M -i 2 -n lvname vgname

snapshot and merge. if you don't want to merge, you can simply remove the snapshot lv

lvcreate -L 64M --snapshot /dev/vgname/lvname -n lvsnap
lvconvert --merge vgname/lvsnap

extend logical volume and filesystem

lvextend -L +512MB /dev/vgname/lvname
e2fsck -f /dev/vgname/lvname
resize2fs /dev/vgname/lvname

shrink filesystem and logical volume

e2fsck -f /dev/vgname/lvname
resize2fs /dev/vgname/lvname 500M
lvchange -an /dev/vgname/lvname
lvreduce -L -512MB /dev/vgname/lvname
lvchange -ay /dev/vgname/lvname
resize2fs /dev/vgname/lvname

remove logical volume

lvchange -an /dev/vgname/lvname
lvremove /dev/vgname/lvname

umount

fuser -vm /mountpoint
umount /mountpoint

extend pv

parted /dev/sda
parted /dev/sda print
parted /dev/sda rm 2
parted /dev/sda resizepart 1 100%

pvdisplay /dev/sda1
vgdisplay vgname
pvresize /dev/sda1

extend partition

parted /dev/sdx print
parted /dev/sdx resizepart [num] 100%
e2fsck -f /dev/sdx[num]
resize2fs /dev/sdx[num]

kernel parameter

ipv4 のルーティング設定の例

設定値確認

cat /proc/sys/net/ipv4/ip_forward
or
sysctl [-n] net.ipv4.conf.all.forwarding

全てのパラメータを表示
sysctl -a

一時設定

echo 1 > /proc/sys/net/ipv4/ip_forward
or
sysctl -w net.ipv4.conf.all.forwarding=1

恒久設定

cat << END >> /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1
END
sysctl -p

backup and restore openldap

backup

# systemctl stop slapd
slapcat > ldap.ldif
slapcat -b cn=config > ldap-config.ldif

restore

systemctl stop slapd
mv /etc/ldap/slapd.d{,.bak}
mv /var/lib/ldap{,.bak}
mkdir /etc/ldap/slapd.d
mkdir /var/lib/ldap
slapadd -n0 -F /etc/ldap/slapd.d -l ldap-config.ldif
slapadd -l ldap.ldif
chown openldap:openldap -R /etc/ldap/slapd.d
chown openldap:openldap -R /var/lib/ldap
systemctl start slapd

resource monitoring

top

topコマンドを一回だけ実行して終了する(バッチモード)。

top -b -n 1

sar

sarで蓄積したデータの閲覧

LANG=C sar # LANGが日本語だと時分秒が日本語表記になるので、LANG=Cで実行
-q # loadaverage
-u # CPU
-b # I/O
-r # メモリ
-S # スワップ
:
:
-n DEV  # 送受信パケットの情報
   EDEV # エラーパケットの情報
   :
   :
-f /var/log/sa/saxx # 履歴ファイルを指定
-s hh:mm # 以降のデータを表示
-e hh:mm # 以前のデータを表示
(-fではなく、[interval] [count]の指定で、リアルタイム表示できるらしい)

network commands on linux

Recently, the iproute2 package's commands are recommended instead of net-tools to show or control network settings.

確認コマンド

show mac address table

ip [-6] neigh
arp -an

show interface mac address

ip link
ifconfig

show host ip address

ip [-6] addr
ifconfig

show routing table

ip [-6] route
netstat -rn
route -n

show tcp and udp port status

ss -an
netstat -an

query domain name server

dig <@nameserver> domainname [a|any|mx|ns|...]

cat << END > list.dig
@xxx.xxx.xxx.xxx example.com
@xxx.xxx.xxx.yyy example.com
END

dig -f list.dig


nslookup domainname <nameserver>

nslookup << exit
server xxx.xxx.xxx.xxx
example.org
example.com
exit

設定コマンド

down and up the link

ip link set br0 down
ip link set br0 up

delete and add from/to interface

ifconfig eth0 0.0.0.0
ifconfig eth0 192.168.0.1 netmask 255.255.255.0
ip address delete 192.168.0.1/24 dev enp0s25    
ip address add 192.168.0.1/24 brd + dev enp0s25

delete and add default gateway

ip route delete default
ip route add default via 192.168.0.254

add static route

ip route add 10.0.0.0/24 via 192.168.0.252

operate virtual bridge

show information of virtual bridge

brctl show
ip link show master br0
bridge link show

add and delete virtual bridge

ip link add br0 type bridge
ip link del br0
brctl addbr br0
brctl delbr br0

create tap0 and set pormiscuous mode

ip tuntap add dev tap0 mode tap
ip link set tap0 up promisc on
ip link set tap0 down promisc off
ip tuntap del dev tap0 mode tap

add and delete interface to virtual bridge

ip link set dev enp0s25 master br0
ip link set dev tap0 master br0
ip link set dev enp0s25 nomaster
brctl addif br0 eth0
brctl addif br0 tap0
brctl delif br0 eth0

write below to network config file and execute service networking restart

auto eth0
iface eth0 inet static
  address 0.0.0.0
auto br0
iface br0 inet static
  address 192.168.0.1
  netmask 255.255.255.0
  bridge_ports eth0

Alternatively you can use systemd-networkd for handling virtual bridge. At first put these 3 files in /etc/systemd/network

eth0.network

[Match]
Name=eth0

[Network]
Bridge=br0
## if you want to use this interface, comment out above line
## and specify dhcp or static address
#DHCP=ipv4
#Address=192.168.0.1
#Gateway=192.168.0.254
#DNS=192.168.0.254

br0.netdev

[NetDev]
Name=br0
Kind=bridge

br0.network

[Match]
Name=br0

[Network]
# DHCP=ipv4
Address=192.168.0.1
Gateway=192.168.0.254
DNS=192.168.0.254

then enable and start systemd-networkd

systemctl enable  systemd-networkd
systemctl restart systemd-networkd

openvswitch

show information of virtual bridge

ovs-vsctl show

add and delete virtual bridge

ovs-vsctl add-br br0
ovs-vsctl del-br br0

add and dlete interface to virtual bridge

ovs-vsctl add-port br0 eth0
ovs-vsctl add-port br0 tap0
ip link set br0 up
ovs-vsctl del-port br0 tap0
ovs-vsctl del-port br0 eth0

expect

自動ログインマクロというとTeratermマクロを思い浮かべがちだが、un*x の expect コマンドを使うこともできる。

マクロはホームディレクトリ等に保存してchmod 700 しておく。

expect を使ったssh自動ログインbashスクリプトの簡単な例(一部抜粋)

sshで自動ログインだけ考えたら、パスフレーズなしの秘密鍵を使えば済むが、マクロならその後の処理も自動化できる。

expect -c "
spawn ssh ${user}@${addr}
expect {
  \"s password: \" {
  send   \"${pass}\n\"
  }
}
interact
"

exit 0

expect をインタープリタとして使ったtelnet自動ログインスクリプトの簡単な例

#! /usr/bin/expect

set addr "hostname"
set user "username"
set pass "password"

spawn telnet ${addr}
expect {
  "login: "  {
  send "${user}\n"
  expect "Password: "
  send "${pass}\n"
  }
}
interact

archive and compress

compress

gzip

gzip filename
gunzip -lv filename.gz
gunzip filename.gz

gzip -c filename > filename.gz
gunzip -c filename.gz > filename

zless filename.gz

bzip2

bzip2 filename
bunzip2 filename.bz2

bzip2 -c filename > filename.bz2
bunzip2 -c filename.bz2 > filename

bzless filename.bz2

xz

xz filename
unxz filename.xz

xz -c filename > filename.xz
unxz -c filename.xz > filename

xzless filename.xz

Archive

tar

tar cf filename.tar filename.0
tar cf filename.tar dirname
tar tvf filename.tar
tar xv filename.tar [path/to/dir/targetfile]

zip

zip filename.zip filename
zip -r filename.zip dirname
unzip -lv filename.zip
unzip filename.zip [path/to/dir/targetfile]

7zip

7z a filename.7z filename
7z a -r filename.7z dirname
7z l filename.7z
7z x filename.7z [path/to/dir/targetfile]

tarとgzip

GNU版tarが使えない時のtar.gzファイルの圧縮

tar cf - file or dir ... | gzip -c > archive.tar.gz

同じく展開

gzip -cd archive.tar.gz | tar xf -

tar、gzipからbase64でエンコード。デコード・展開の確認

tar cf - file or dir ... | gzip -c | base64 - | base64 -i -d - | gzip -cd | tar tvf -
tar cf - file or dir ... | gzip -c | openssl enc -a | openssl enc -a -d | gzip -cd | tar tvf -

ログがローテートされてgzipで圧縮されると、いちいち展開して読むのがめんどくさい と思ってた。 以下のようなツールがあり、gzipで固められたテキストファイルをいちいち展開せずに処理することができる。超便利。

zcat zgrep zdiff zless

for bzip2

bzcat bzgrep bzdiff bzless

for xz

xzcat xzgrep xzdiff xzless

for zip

zipgrep

tar の圧縮オプション

  • Z: compress (Z)
  • z: gzip (gz)
  • j: bzip2 (bz2)
  • J: xz (xz)

zip

microsoft系osでもおなじみの形式

tarでアーカイブしてzip圧縮。展開の確認

tar cf - file or dir ... | zip - - | funzip | tar tvf -

無圧縮zipアーカイブ

zip -0r archive.zip dirname

暗号化

zip -e archive.zip filename

zipの標準的な暗号化方式は強度が弱い。また、アーカイブヘッダが暗号化されず、ファイル名等は隠匿できない。

  • 一定期間経てば保護する必要がなくなる内容を暗号化する用途であれば問題ない。
  • 見られても困らないファイル名になっているなら問題ない。

ならよいが、そうでなければ下記の対応が必要となる。

  • zipファイルを他のツール(gpg等)で暗号化する。
  • 他のアーカイブツール(7z等)を使う。

7z

zipよりも高い圧縮率をサポート。暗号化方式としてAES256をサポート。アーカイブヘッダの暗号化をサポート。 7zではファイルのuid/gidは保持しない。

(ubuntuのp7zipパッケージに含まれる7zrでは、暗号化できなかった。 p7zip-fullパッケージの7zを使うことで、暗号化することができた。)

7z形式で暗号化して圧縮(アーカイブヘッダも暗号化)。

7z a -t7z -p -mhe=on archive.7z dirname

lコマンドの-sltオプションで、暗号化されているか確認することができる。

7z l -slt archive.7z

ファイルの場合、悪意ある人の手に渡ったら、高性能の計算機で長時間パスワード解析されてしまう。 (キャッシュカードのPINコードのように、一定時間に一定回数失敗したら保護される、ということはない。) 内容が漏れたら困る暗号化ファイルには長いパスワードを使う。

圧縮音声など、さらなる圧縮を望まない場合、zipや7z等ではアーカイブのみで圧縮しないこともできる。

zip -0 ....
7z a -mx=0 ....

sed and awk

簡単な使い方の例を記載する。

sed

2行目以降で、fooをbarに全て置換

sed -e '2,$ s/foo/bar/g' filename

20行目の次に「(タブ)added text」を追加、10行目を削除

sed -e '20i\\tadded text' -e '10d' filename

exprを含まない行だけ表示

sed -ne '/expr/! p' filename

後方参照

df /tmp | grep ^/ | awk '{print $5}' | sed -e 's/\([0-9]\{1,2\}\)%/\1/'

df /tmp | sed -ne 's/.* \([0-9]\{1,2\}\)% .*/\1/ p'

replace CR + LF to LF

sed  -e  's/\r$//' -i.bak textfile
perl -pe 's/\r$//' -i.bak textfile

replace LF to CR + LF

sed  -e  's/$/\r/' -i.bak textfile
perl -pe 's/$/\r/' -i.bak textfile

連続した空白文字をタブに置換

sed  -e   's/\s\s*/\t/g' test
perl -ple 's/\s+/,/g'    test

置換先文字列としてシェル変数を使う。

sed  -e 's/^/'"${foo}"'/' test

削除、挿入、置換を実行するsedスクリプトの例

#! /bin/sed -f

3,5d
8i \
# inserted comment\
inserted line # this is inserted
20 s/^/#/

awk

2行目から3行目までを表示

awk '(NR>=2 && NR<=3) {print $0}' filename

行番号を表示

awk '{printf "%02d: %s\n", NR, $0}' filename

IPv4アドレスの第1オクテットが192のものの第2オクテットを抜き出す

awk -F. '$1~/192/ {print $2}' filename
perl -F"\." -alne '{print $F[1]}' filename

コマンドにシェル変数を使う。

awk '{print '"${foo}"', $1}' test
(fooが2017-08のような文字列だと、数値として扱われて演算結果が表示される)

awk -v var=${foo} '{print var, $1}' test
(こちらの例では、そのようなことはない)

スクリプトファイルにコマンドを記載して実行

awk -f script.awk textfile

下記の場合、shebangとして、#! /path/to/awk -f などと記載

chmod u+x script.awk
./script.awk textfile

行頭に2桁の行番号をつけて出力するawkスクリプト

#! /bin/awk -f

BEGIN{
  print "script begin"
}
{
  printf "%02d: %s\n", NR,$0
}
END {
  print "script end"
}

nfs

$ service nfs-kernel-server status
nfsd running

$ service rpcbind status
rpcbind start/running, process xxx

$ rpcinfo -p <hostname>

export infomation

$ showmount -e
Export list for xxxxxx:
/mnt  192.168.1.2

client information

$ showmount -a
All mount points on yyyyyy:
192.168.1.1:/mnt
192.168.1.2:/mnt

allow

$ vi /etc/hosts.allow
portmap : 192.168.1.0/255.255.255.0