読者です 読者をやめる 読者になる 読者になる

ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

LinuxでUSBシリアル変換ケーブルを使ってシリアル接続する

USBシリアル変換ケーブルはスイッチやルーターの設定をするときに使うと思います。 たいていの場合、Windows + TeraTermの組み合わせで使うと思うのですが、この組み合わせの欠点はドライバーをインストールしなければいけないという点が挙げられると思います。

稀にOS標準のドライバーで認識するか、接続すると勝手にインターネットからドライバーを取得して認識するものもあるようですが、そうでなければ対応するドライバーを探すのに苦労することも多いようです。

また、USBシリアル変換ケーブルで使われているチップの都合で古いバージョンのドライバーを使わないと動作しないといったことも手持ちのUSBシリアル変換ケーブル(URS232GF)でよく起きます。セットアップ直後は動作するのに、久しぶりに使おうとするとWindows Updateで新しいドライバーに更新されて認識しないとか。たまに。

このような問題児や、対応OSがWindowsしか書かれていないUSBシリアル変換ケーブルでも、Linuxで使うと割と動くのを最近知りました。今回は Ubuntu 16.04.1 Desktopを使いましたが、割と新しいLinux Kernelで動くLinuxであればなんでも同じように動くと思います。

www.ubuntu.com

ちなみにLinuxは物理マシンでも仮想マシンでも動作するようです。私はParallels Desktop上のUbuntu 16.04.1 Desktopで接続しました。USB接続で仮想マシンと接続できればいいので、大抵のデスクトップ用仮想マシンソフトウェアだったら動作するはずです。VMware WorkstationとかVMware Fusionだとか、Parallelsとか。

Linuxで動作したUSBシリアル変換ケーブル

手持ちのだけですが。。

動かすまでの流れ

ご家庭によくある、Cisco Catalyst 2940に接続してみます。

  • 機器とUSBシリアル変換ケーブルを接続
  • Linuxを起動
  • USBシリアル変換ケーブルをLinuxマシンに接続
  • dmesgコマンドでttyUSB0みたいにマウントされたのを確認

f:id:ytooyama:20170130222930p:plain

  • dialoutグループに操作するユーザーを追加(-aGなので注意 ! aを忘れるべからず)
$ sudo usermod -aG dialout ytooyama
  • cuコマンドツールをインストールします。
$ sudo apt update
$ sudo apt install cu
  • cuコマンドで接続
$ cu -l ttyUSB0

ちなみに変換ケーブル無しにサーバーと機器を接続する場合はcu -l ttyS0でOKです。

f:id:ytooyama:20170130223309p:plain

  • ~.と入力してEnterキーを押すと接続を切断

そんな感じで接続できました。USBシリアル変換ケーブルを使った接続はWindowsよりもLinuxでやったほうが簡単みたいですね。 Windowsしか対応していないUSBシリアル変換ケーブルがあったら試してみては?

参考にしたサイト

「Vagrant was unable to mount VirtualBox shared folders.」というエラーが出た時の対処方法

yumやaptコマンドなどでLinuxシステムを更新後、下記のようなmount.vboxsfエラーが出る場合、 対応方法としてvagrant-vbguestプラグインを使う方法があるようです。

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

このプラグインは非常に便利なプラグインです。しかし、デフォルトのままの設定だと「vagrant upした時に古いGuestAdditionsだと更新」されてしまい、OSの起動に時間がかかってしまうので「config.vbguest.auto_update = false」を設定しておいた方がいいようです。

参考

qiita.com

プラグインのインストールとシステム更新の流れ

まずはvagrant-vbguestプラグインをインストールする。

$ vagrant plugin install vagrant-vbguest

vagrant upコマンドでサーバーを起動する。

$ vagrant up sl7n1

起動後にSSHログイン。

$ vagrant ssh sl7n1

システムをアップデートする。

$ sudo yum update

アップデート後はrebootコマンドで起動するのではなく、vagrant reloadコマンドを利用する。

$ exit
$ vagrant reload sl7n1

そうするとvboxsfが出ることがある(Linuxカーネルの更新があった場合)。

    sl7n1: /vagrant => /Users/ytooyama/vagrant/standard
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

vagrant-vbguestプラグインを使ってGuestAdditionsを更新する。

$ vagrant vbguest sl7n1

終わったら再起動する。

$ vagrant reload sl7n1

vbguestを確認する。

$ vagrant vbguest sl7n1 --status
[sl7n1] GuestAdditions 5.1.12 running --- OK.

これで起動毎に「/sbin/mount.vboxsf: mounting failed with the error: No such device」というエラーは出なくなるはずです。

以上で表題にあげた問題は回避可能ですが、このようなメッセージが出るということはVagrant Boxが古くなっているということですので、新しいVagrant Boxがないか確認した方がいいと思います。

Raspberry Piをヘッドレスモードで利用する

モニター、キーボードなしでMacでなんとかする方法を教えてもらったので追記しました。

Raspberry Piにモニター、キーボードなしで接続することを「ヘッドレスモードで利用」すると言うようです。 Zeroconf (Mac OS XではBonjourLinuxではavahi-daemon) により実現しているものです。

www.aymerick.com

WindowsマシンとRaspberry Piを接続したいときは、次を参考にしてください。

raspi.seesaa.net

しかし、Raspberry Piで最もよく利用されている最近のRaspbianでは、セキュリティを考慮してデフォルトではSSHサーバーが起動しないようになりました。

www.raspi.jp

従って、SDメディアにRaspbianを書き込んでMacRaspberry Piを有線LANケーブルでつないでもssh接続はできないのですが、次の手順を実施するとできるようになります。ちなみにRaspbian以外のOSでは多分、クライアントとRaspberry Piを直結するだけで接続可能です。

キーボードとモニターを用意できる場合

(1) SDにRaspbianを書き込み

(2) MacからSDメモリーを取り外す

(3) Raspberry PiにSDメモリーを取り付ける

(4) モニター、キーボードを接続

(5) 電源を接続して起動

(6) ユーザーpi/パスワードraspberryでログイン

(7) SSHを有効化するために以下を実行

$ sudo touch /boot/ssh

キーボードとモニターを用意できない場合

(1) SDにRaspbianを書き込み

(2) Macでboot/sshを作る

$ touch /Volumes/boot/ssh

(3) MacからSDメモリーを取り外す

(4) Raspberry PiにSDメモリーを取り付ける

(5) 電源を接続して起動

起動後の設定(共通)

(1) LANケーブルでMacRaspberry Piを接続

(2) RasPiの設定をする

$ sudo raspi-config

(3) 以下を実行

  • Expand Filesystem
  • Change User Passsword(推奨)
  • reboot

(4) MacからSSH接続可能になる

sshコマンドでraspberrypi.localに接続

% ssh pi@raspberrypi.local

The authenticity of host 'raspberrypi.local (fe80::fbcb:b1c2:db6a:793a%en0)' can't be established.
ECDSA key fingerprint is SHA256:XXX.
Are you sure you want to continue connecting (yes/no)?  yes
Warning: Permanently added 'raspberrypi.local,fe80::fbcb:b1c2:db6a:793a%en0' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password:  ←パスワードを入力(初期パスワードはraspberry)

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 25 17:57:17 2016

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $
(接続できた)

(5) ホスト名を変更

デフォルトのホスト名はraspberrypi.localなので別の名前に変えてみましょう。

$ sudo hostnamectl set-hostname raspberrypi1.local
$ sudo nano /etc/hosts
127.0.1.1       raspberrypi1

(6) 変更を保存して閉じる

  • 保存 [CTRL]+[O] → [Enter]
  • 閉じる [CTRL]+[X]

(7) 再起動

以上で新しいドメイン名.localでSSHアクセスできる。

% ssh pi@raspberrypi1.local

このあとの作業

とはいえ、このままではどちらにしろ外のネットワークと接続できないので、パッケージのインストールとかアップデートができません。なので、既存のネットワークにRaspberry Piを接続してIPアドレスを設定します。IPアドレスの固定化の方法は以下の手順を参考に。

qiita.com

有線LANの方にIPアドレスを割り当てるもよし、Wi-Fiの設定をするもよし。ちなみにRaspberry Pi 3のWi-Fiは2.4GHz帯の方にしか接続できないので注意。

なお、有線及び無線LANネットワークから切断して、クライアントとRaspberry Piを直結するとIPアドレスを設定していても引き続きドメイン名.localSSHアクセスできます。

Linux(CentOS 7)と直結したRaspbianに接続する方法

WindowsMacIPv4 Allの働きにより、任意のネットワークに接続されていないと適当なアドレスを振る仕様になっているため、LANケーブルで直結するとアクセスできます。しかし、LinuxではデフォルトではIPv4 Allが働きません。

以下の手順でそれぞれのサーバーで適当なネットワークIPアドレスを割り振った上でLANケーブルで直結するとサーバーにSSH接続できるようになるようです。

(0) 一旦、それぞれのサーバーを直結するのをやめて、インターネットに接続するように設定を変える

(1) クライアントとしてCentOS7(おそらくFedoraも)を使う場合、NetworkManagerからnetworkサービスに切り替える

(2) avahi-autoipdパッケージをクライアント、サーバーにそれぞれインストール

(3) avahi-dnsconfdとavahi-toolsパッケージをクライアントにインストール

(4) avahi-dnsconfdサービスを起動する

# systemctl enable avahi-dnsconfd && systemctl enable avahi-dnsconfd 

(5) クライアントの/etc/nsswitch.confのhostsの設定に[NOTFOUND=return]の手前にmdns4を記述する

# nano /etc/nsswitch.conf
...
hosts:          files mdns4 [NOTFOUND=return] dns
...

(6) クライアント、サーバーでavahi-autoipd <NIC-Device> -Dを実行してアドレスを確保 <NIC-Device>にはランダムなIPアドレスを振るNICを指定する(ex. em1,eth0,eno1...)

(7) クライアントで以下のように実行して、ノードが見えることを確認

# avahi-resolve -4 --name raspberrypi1.local

(8) ping raspberrypi1.local で応答が返ってくることを確認

(9) ssh pi@raspberrypi1.local で接続

参考にした情報

Macのディスクユーティリティーコマンドで外部ストレージをフォーマット

macOS Sierraのディスクユーティリティはバグが多くて使えない(最近報告済み)ので、 コマンドラインを使う方法を調べました。

以下のサイトにまとまっていました。

osxdaily.com

以下に必要なところだけピックアップしてみます。

ディスクデバイスを確認

% diskutil list

フォーマットする

  • 使い方
% diskutil eraseDisk

Usage:  diskutil eraseDisk format name [APM[Format]|MBR[Format]|GPT[Format]]
        MountPoint|DiskIdentifier|DeviceNode

Completely erase an existing whole disk.  All volumes on this disk will be
destroyed.  Ownership of the affected disk is required.

Format is the specific file system name you want to erase it as (HFS+, etc.).
Name is the (new) volume name (subject to file system naming restrictions),
or can be specified as %noformat% to skip initialization (newfs).
You cannot erase the boot disk.

Example: diskutil eraseDisk JHFS+ UntitledUFS disk3

以下、/dev/disk3を対象としてフォーマットしてみます。誤って必要なデバイスをフォーマットしないように気をつけてください。

  • ジャーナルなし
% diskutil eraseDisk HFS+ USB2GB /dev/disk3
  • ジャーナルあり
% diskutil eraseDisk JHFS+ USB2GB /dev/disk3
% diskutil eraseDisk ExFAT USB2GB /dev/disk3
  • FAT32
% diskutil eraseDisk MS-DOS USB2GB /dev/disk3

利用するCentOS 7のバージョンを固定するには

CentOS 7でLinux Kernelと同じバージョンのkernel-headersをインストールしたい時、

# uname -r
3.10.0-327.36.3.el7.x86_64

次のように実行することができます。

# yum install "kernel-headers-$(uname -r)"

...そのはずでした。

ところが、実際に実行すると「パッケージは利用できません。エラー:何もしません」 と言われてしまいます。しろよ。

# yum install "kernel-headers-$(uname -r)"
読み込んだプラグイン:fastestmirror
base                                                               | 3.6 kB  00:00:00
extras                                                             | 3.4 kB  00:00:00
updates                                                            | 3.4 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                      | 155 kB  00:00:00
(2/4): extras/7/x86_64/primary_db                                  | 183 kB  00:00:00
(3/4): updates/7/x86_64/primary_db                                 | 1.2 MB  00:00:00
(4/4): base/7/x86_64/primary_db                                    | 5.6 MB  00:00:02
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
パッケージ kernel-headers-3.10.0-327.36.3.el7.x86_64 は利用できません。
エラー: 何もしません

なぜか。実は上の出力にあるように、CentOSはバージョン7の最新版(つまり現在だと7.3.1611と同等)の下にあるパッケージを参照してその中からインストール候補を探します。

普段、最新版しか使わないならこれでも問題ないですが、何かの検証でバージョンを固定したい場合にこれだと困りますよね。

これまではyumリポジトリーファイルの$releaseverを手動で変えていたのですが、これをやるとたまにパッケージバージョンの依存関係を解決できないとかで、エラーになったりしていました。

# vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
...

この問題を解決するヒントが次のドキュメントに書かれていました。

つまり、releaseverを固定するには次のようにコマンドを実行します。

# $SHELL -c "echo 7.2.1511 > /etc/yum/vars/releasever"
# yum clean all

そのあと、各yumリポジトリーファイルのmirrorlist行をコメントアウトして、baseurlのコメントを外す必要があります。

ちなみにIPv6をオフにする設定も一緒に行っておくといいと思います。

# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf

もう一度実行すると、今度は目的のパッケージを見つけることができるようになったはずです。

# yum install "kernel-headers-$(uname -r)"
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel-headers.x86_64 0:3.10.0-327.36.3.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

==========================================================================================
 Package                アーキテクチャー
                                       バージョン                   リポジトリー     容量
==========================================================================================
インストール中:
 kernel-headers         x86_64         3.10.0-327.36.3.el7          updates         3.2 M

トランザクションの要約
==========================================================================================
インストール  1 パッケージ

総ダウンロード容量: 3.2 M
インストール容量: 3.2 M
Is this ok [y/d/N]:

よかったですね。

ただし、この方法が可能なのは最新版の一つ前のバージョンまでです。例えば7.1.1503のディレクトリーを開いてみましょう。ポツンとreadmeファイルが一つあるだけになっています。

なぜなら古いバージョンは http://vault.centos.org にお引越ししてしまうためです。 どうしても古いバージョンのCentOSが必要なら独自ミラーを作るべきでしょう。

まあ、こうやって対処したりCentOS-Vault.repoを使ってもいいですね。

baseurl=http://mirror.centos.org/centos/7.1.1503/(以下略)
↓
baseurl=http://vault.centos.org/centos/7.1.1503/(以下略)

さらにCentOSの場合、新しいマイナーバージョンがリリースされると新しいバージョンのパッケージは古いマイナーバージョンのリポジトリーには提供されなくなるので、バージョン固定するとセキュリティパッチすら充てられなくなります。

そういったサポートが必要なら、RHELサブスクリプション契約を行なってRHELを利用するか、そういったサポートをしているベンダーと契約するか、自分で頑張る必要があります。

ディストリビューションのリリースバージョンを更新するには

簡単です。バージョンを上書きするだけです。

# $SHELL -c "echo 7.3.1611 > /etc/yum/vars/releasever"
# yum clean all

そうだ、CentOS7でOVS+DPDKな環境を作ろう(前編??)

以前、こういった記事を会社のブログに書きました。

tech.virtualtech.jp

tech.virtualtech.jp

では、「CentOS 7ではどうなの?」ということで調査開始。

まずは公式のドキュメントの確認から

まず公式サイトを確認。 GCC 4.9以降が必要なのかー。

http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html

CentOS 7.3だと4.8.5までしか入らない。惜しい!

gcc-4.8.5-11.el7.x86_64.rpm      20-Nov-2016 17:46     16M

試しに駄目元でCentOS 7.3のGCC 4.8.5でDPDKをビルドしたのですが、未定義のエラーがいろいろ出てしまってコンパイルが通ることはありませんでした。

GCC 4.9をソースからビルドする

そこでGCC 4.8.5を含めて必要なパッケージをインストールしたのち、GCC 4.9.4をビルドすることにしました。GCCをビルドするためにGCCをインストールするとか、なんか変な感じです。

GCCのビルドには時間がかかるので、先のドキュメントの「2.2. Compilation of the DPDK」にあるパッケージを全てインストールした状態で、以下の通り実行して帰ってきました。

# yum groupinstall -y "Development Tools"
# yum install -y epel-release glibc-devel* gcc-c++* zip wget

# curl -LO http://ftp.jaist.ac.jp/pub/GNU/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz
# tar zvxf gcc-4.9.4.tar.gz
# cd gcc-4.9.4
# ./contrib/download_prerequisites
# ./configure --disable-multilib && make && make install && touch /root/buildend

ビルドが終わったら、/rootディレクトリーにbuildendというからのファイルが作られるはず。

...はず。。

ちなみにdevtoolset-3というのを入れるとGCCの新しいものを使えそうなのですが、DPDKをコンパイルしてインストールするように使っても動くのだろうか?...とか思いましたが、今回はソースからビルドをすることにしました。

Devtoolset-3 — Software Collections

いろいろ調べていたら次のようなドキュメントを発見。

Installing Operations Monitor Probe on Oracle Linux

え、Oracle LinuxでDPDK、割と簡単に動くの!? Oracle LinuxってCentOSと比べるとライブラリの新しいのが提供されていたりして動いちゃいそうな気はしますが、ねえ...といった感じ。

というところで本日の調査は終了。

ちなみに、Fedora 23のgccを上書きするというパワープレイも見つけましたが、yum updateコマンドを実行すると全て終わるような気がしたので、この方法は不採用としました。

serverfault.com

GCCから自前で用意しなくてはいけないようで非常に面倒だと感じました。 Ubuntuだったら、GCCの4も5も6もaptコマンドで入りますからね。もちろん、DPDKもOVSも。

手順が確定したら、会社と相談してどこかわかるところで公開したいと思います。

[追記] ビルド完了後の処理のログ。

...
ldconfig: /usr/local/lib/../lib64/libstdc++.so.6.0.20-gdb.py is not an ELF file - it has t
he wrong magic bytes at the start.

(注)上のエラーは無視して良さそう
https://gcc.gnu.org/ml/gcc-help/2014-08/msg00053.html

----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib/../lib64

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.


# /usr/local/bin/gcc --version
gcc (GCC) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# vi /root/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

#PATH=$PATH:$HOME/bin
PATH=/usr/local/bin:$PATH:$HOME/bin

export PATH

# source /root/.bash_profile
# gcc --version
gcc (GCC) 4.9.4
...

この後の流れはこちらに