MoのWebLog

思ったことをテキトウに。

memtest86でメモリーのテスト

MemTest86というテストツールを使用して,メモリーの正常性チェックを行いました。

MemTest86とは

公式サイト
MemTest86 - Official Site of the x86 Memory Testing Tool


無償版,有償版(MemTest86 Pro)がある。

  • 無償版には,Windows用,Linux/Mac用に対して,それぞれCDブート用のイメージと,USBブート用のイメージが用意されている。
  • 有償版には,USBにインストールがされた状態のUSBや,ダウンロード版などが用意されている。


有償版では,レポート機能や自動テスト機能に追加要素があったりするらしいです。
詳しい機能比較は,Overviewの隣の「Features」タブから一覧が見れます。

動作要件は x86 (64bit)。

やったこと

今回は,Macを使って「USBブートするMemTest86」を作りたいので,無償版のLinux/Mac版,USBブート用のイメージをダウンロードしました。
Topページ右側の「Download now!」から飛んで,
Linux/Mac Downloads:
 Image for creating bootable CD (ISO format)
 Image for creating bootable USB Drive  ←これをダウンロード

ダウンロードした「memtest86-usb」の中には

MemTest86_User_Guide_UEFI.pdf
memtest86-usb.img
README

が入ってました。
ユーザーガイド「MemTest86_User_Guide_UEFI.pdf」が結構丁寧に書かれているので基本的にこれを読めばOKな感じでした。
ユーザーガイドに「Macでブート用USB作る場合はREADMEに書いてある通りやってね」と書いてあったので,
ブート用に使用するUSBメモリ(256MB以上)を用意してREADMEを読みました。Unix実行ファイルなんだけど,普通にエディタで開けると思う。私はlessで読みました。

このファイルに,USBメモリの必要容量とかも書いてあります。

For Mac:

から始まる手順のセクションを読むと

  • USBを差し込む
  • 以下のコマンド実行して,USBがどこにマウントされたか確認する(容量とか,USBとかで分かる)。

$ diskutil list
こんかいは /dev/disk5 とします。

  • 以下のコマンドでUSBをアンマウント

$ diskutil unmountDisk /dev/disk5

  • 以下のコマンドで,イメージを焼く

$ sudo dd if=memtest86-usb.img of=/dev/disk5
imgのパスはもちろんカレントディレクトリに依ります。

READMEには,他にも実行時の注意事項とか書いてあるから,ちゃんと読んだ方が良いですね。

これでddが完了したら,USBをメモリテストしたいマシンに刺して,USBからブートする。
ブート前に,BIOSATA設定で,SATA ModeはAHCIに,Boot ModeはUEFIにしておきました。SATAモードはあまり関係ないかも?

あとは,MemTest86が起動するので,画面にしたがって設定したり,テストしたり。マウス使えますが,キーボードオンリーでもちゃんと(分かりやすく)操作できます。
起動時の画面。Configからメニューへ。
f:id:motsuo_p:20181122011222j:plain
メモリテスト中の画面。
f:id:motsuo_p:20181122011202j:plain

Here Document (ヒアドキュメント) に感動した話

今までパラメータの多い文書を作成する際には,
pythonで .replace を使用した自作スクリプトを用いて

creat.py template parameters values

みたいな感じで三つのテキストファイルを引数として置換していたのですが,
Here Documentという表記法を教えていただいたので,そちらを使用してみました。
今回私はPythonで書きましたが,Here Document自体は様々な言語で対応されていて,
シェル( sh, csh, tcsh, ksh, bash, zsh,...)やPerl, PHP, Rubyなどでも記述可能です。

環境
motsuo$ python -V
Python 2.7.10
motsuo$
コード例

(日本語を使用する前提なので# -*- coding: utf-8 -*-を書いています。)

motsuo$ cat heredoc-template.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

string = ('''\
A & B = {A_B}
next is {C}
D\
''').format(A_B="ab", C="c")
print(string)
motsuo$
出力結果
motsuo$ ./heredoc-template.py
A & B = ab
next is c
D
motsuo$
まとめ

string = '''
改行もそのまま扱いたい長い文章
アイウエオ
'''
とすることで'''で括った中をHere Documentとして扱うことができます。
例の様に,パラメータを使用したい場合はヒアドキュメント内で{param}と書き,
.format(param="value")とすることで置換してくれます。(これは別に変数展開なのでHere Documentどうこうは関係ない)
注:パラメータ名に"-" ハイフンは使用できません(自分はこれを知らず長い時間詰んでしまった。。。)


これだと,自分の書いたスパゲッティーコードで読み込んで置換しているわけじゃないから,置換ミスの心配が減るし,
パラメータと値を,直感的に管理しやすいから楽でいいなと感じました。
pythonでのformat()を用いた変数置換は,この記事の記述以外にも,リストとかタプルとか辞書とか使えるので,
好きなの選べて素敵ですね。
変数置換の書式についてはこちら(リンクは最新版3.6のドキュメント。2.7の同項目についてはページ左上のプルダウンから見られます)
6.1. string — 一般的な文字列操作 — Python 3.6.5 ドキュメント

LinuxでLinuxのISOイメージからインストールDVD作成

環境

[motsuo@localhost ~]$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core) 
[motsuo@localhost ~]$

Apple USB SuperDriveを使用したので、事前準備

$ sudo yum =y install sg3_utils
$ sg_raw /dev/sr1 EA 00 00 00 00 00 01 

正しくドライバーが認識されれば、以下の様なメッセージ。
[motsuo@localhost ~]$  sg_raw /dev/sr1 EA 00 00 00 00 00 01 
SCSI Status: Good 

[motsuo@localhost ~]$ 

DVDに書き込み

$growisofs -dvd-compat -Z /DVD Driverのパス=/ISOファイルのパス

表示されるメッセージはこんな感じ

[motsuo@localhost ~]$ growisofs -dvd-compat -Z /dev/sr1=/home/motsuo/Downloads/debian-9.5.0-amd64-DVD-1.isoExecuting 'builtin_dd if=/home/motsuo/Downloads/debian-9.5.0-amd64-DVD-1.iso of=/dev/sr1 obs=32k seek=0'
/dev/sr1: "Current Write Speed" is 8.2x1352KBps.
   14057472/3629989888 ( 0.4%) @2.9x, remaining 21:26 RBU 100.0% UBU  11.8%
   29949952/3629989888 ( 0.8%) @3.4x, remaining 18:01 RBU 100.0% UBU  99.3%
.......中略.......
builtin_dd: 1772464*2KB out @ average 5.2x1352KBps
/dev/sr1: flushing cache
/dev/sr1: updating RMA
/dev/sr1: closing disc
/dev/sr1: reloading tray
[motsuo@localhost ~]$ 


参考
Use Apple's USB SuperDrive with Linux | techtalk - Christian Moser

CentOSがネットにつながらなかった

  • ip a で適切なインターフェイスに適切なIPアドレスが割り当てられている
  • 同じセグメント内からはpingが届く
  • NetworkManagerは停止している
  • インターネットへpingを打とうとすると
[motsuo@localhost ~]$ ping 1.1.1.1
connect: ネットワークに届きません
[motsuo@localhost ~]$

こんな感じ。

対応:
デフォルトゲートウェイが設定されていないせいで、外へ通信できないので、
デフォルトゲートウェイを設定する。

いつもの環境確認

[motsuo@localhost ~]$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core) 
[motsuo@localhost ~]$ 

routeの確認

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 wlp0s20u3
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@localhost ~]#
// デフォルトゲートウェイの設定が無いことがわかる

default gatewayの設定

[root@localhost ~]# route add default gw 192.168.0.1
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 wlp0s20u3          <----追加されました
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 wlp0s20u3
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@localhost ~]# 


インターネットへの到達性げっと

[root@localhost ~]# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=54 time=7.63 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=54 time=6.87 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=54 time=16.4 ms
^C
--- 1.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 6.872/10.313/16.437/4.341 ms
[root@localhost ~]# ping yahoo.com
PING yahoo.com (72.30.35.9) 56(84) bytes of data.
64 bytes from media-router-fp1.prod1.media.vip.bf1.yahoo.com (72.30.35.9): icmp_seq=1 ttl=43 time=167 ms
64 bytes from media-router-fp1.prod1.media.vip.bf1.yahoo.com (72.30.35.9): icmp_seq=3 ttl=43 time=172 ms
64 bytes from media-router-fp1.prod1.media.vip.bf1.yahoo.com (72.30.35.9): icmp_seq=3 ttl=43 time=172 ms (DUP!)
64 bytes from media-router-fp1.prod1.media.vip.bf1.yahoo.com (72.30.35.9): icmp_seq=4 ttl=43 time=164 ms
64 bytes from media-router-fp1.prod1.media.vip.bf1.yahoo.com (72.30.35.9): icmp_seq=4 ttl=43 time=164 ms (DUP!)
^C
--- yahoo.com ping statistics ---
4 packets transmitted, 3 received, +2 duplicates, 25% packet loss, time 3002ms
rtt min/avg/max/mdev = 164.907/168.373/172.323/3.325 ms
[root@localhost ~]# 

IPアドレスの割り振り方


  1. ホスト数(IPアドレスを割り当てる可能性があるものの数)を数える

  2. ホスト数に一番近い,長いマスクを考える

     ex)
    必要なIPアドレスが20個だったら,一番長いマスクは/27 (ホスト数30)



  3. 拡張性を考えて,将来増えそうな予感がすれば,必要に応じて余丁を用意する(マスクを短くする)


  4. マスクの短い空間から順に,(もしくは,それ以外のポリシー,例えば「xxxに使用するマスクは後ろから使う」などがあればそのポリシーにしたがって)アドレス空間を消費していく。

参考:
『インターネットルーティング入門』
https://www.amazon.co.jp/インターネットルーティング入門-第3版-ネットワーキング入門-友近-剛史/dp/4798134813/ref=sr_1_1?ie=UTF8&qid=1534093021&sr=8-1&keywords=インターネットルーティング入門

SSHのポートを変更

手順

  1. sshされる側(sshd)のポート設定を変更
  2. sshされる側のfirewalldの設定を変更
  3. sshされる側のsshdとfirewalldの再起動
  4. sshする側からポート解放の確認とログインできることの確認

sshされる側のOS version

[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# 

される側のIPアドレス: 192.168.1.1 9
Port 22→99に変更

sshされる側のsshdのポート設定を変更

sshd_configのPort 22をコメントアウトし、好きなポート番号の設定を追記

[root@localhost ~]# vim /etc/ssh/sshd_config
[root@localhost ~]# 
[root@localhost ~]# cat /etc/ssh/sshd_config |grep --color Port
#Port 22
Port 99
#GatewayPorts no
[root@localhost ~]# 
sshされる側のfirewalldの設定を変更
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-port=99/tcp
[root@localhost ~]# firewall-cmd --list-ports
99/tcp
[root@localhost ~]# firewall-cmd --reload
    • permanent がないと、設定してもreloadしたらリセットされてしまう。

firewall-cmd --permanent --zone=public --remove-port=99/tcp
だと許可ポート削除。あと、firewall-cmd --list-hogehoge で基本的にhogehogeの設定確認できる。

sshされる側のsshdとfirewalldの再起動
[root@localhost ~]# systemctl restart firewalld.service 
[root@localhost ~]# systemctl restart sshd.service 
状態確認
[root@localhost ~]# systemctl status firewalld.service 
[root@localhost ~]# systemctl status ssd.service 
(active, runningと表示されればおK)

起動時有効化するなら、systemctl enable hogehoge

sshする側からポート解放の確認とログインできることの確認
[motsuo@remote-pc ~]$ telnet 192.168.1.1 99
(正しくポート解放できていれば、refuseされない)
[motsuo@remote-pc ~]$ ssh motsuo@192.168.1.1 -p 99


コメント;firewall-cmdは書式というか、コマンドのパターンを覚えれば、直観的に設定できるかも。