lsof -i:69のシンタックス

次の例はリッスンしてるポート番号、またはサービス名を指定してプロセスを一覧表示するみたい。

% sudo lsof -i:69
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd   1 root  108u  IPv6 0x4b902fe355279297      0t0  UDP *:tftp
launchd   1 root  111u  IPv4 0x4b902fe35672a667      0t0  UDP *:tftp

manページからの抜粋

Service names and port numbers may be combined in a list whose
entries are separated by commas and whose numeric range
entries are separated by minus signs. There may be no embed-
ded spaces, and all service names must belong to the specified
protocol. Since service names may contain embedded minus
signs, the starting entry of a range can’t be a seoirvice name;
it can be a port number, however.

ちなみに、rootで実行しないと結果は空になるっぽい。

また、69はTFTPのポート番号なので以下のようにサービス名を指定してもいける。

% sudo lsof -i:tftp
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd   1 root  108u  IPv6 0x4b902fe355279297      0t0  UDP *:tftp
launchd   1 root  111u  IPv4 0x4b902fe35672a667      0t0  UDP *:tftp

参考文献

WS-C3550にTFTPサーバーから設定ファイルを引っ張ってくる

RTX1200みたいにUSBから設定ファイルを読み込む、保存するなんていう便利機能は本来オプションみたいなものなんだね。。。
慣れてくるとUSBの抜き差し面倒くさいし、TFTPのほうがいいかも。

Switch#copy tftp running-config
Address or name of remote host []? 192.168.11.2
Source filename []? switch-confg
Destination filename [running-config]?
Accessing tftp://192.168.11.2/switch-confg...
Loading switch-confg from 192.168.11.2 (via Vlan1): !
[OK - 2635/5120 bytes]
2635 bytes copied in 0.612 secs

で、 running-config の内容を startup-config に保存する。

Switch#copy running-config startup-config
Destination filename [startup-config]?
Building configuration...
[OK]

Raspberry PiをTFTPサーバーにする

最近TFTPを触り始めたのですが、こんなの当たり前すぎてみんな誰も記事にしてないんですかねー・・・。
今回はRaspberry PiをTFTPサーバーにしてみました。

f:id:wnoguchi0727:20140317083245j:plain

以下のコマンドでインストール。

sudo apt-get -y update
sudo apt-get -y install tftpd-hpa

でOKの、はずが

(snip)
Setting up tftpd-hpa (5.2-4) ...
tftpd user (tftp) already exists, doing nothing.
tftpd-hpa directory (/srv/tftp) already exists, doing nothing.
insserv: warning: script 'mathkernel' missing LSB tags and overrides
[....] Starting HPA's tftpd: in.tftpdinvoke-rc.d: initscript tftpd-hpa, action "start" failed.
dpkg: error processing tftpd-hpa (--configure):
subprocess installed post-installation script returned error exit status 71
Errors were encountered while processing:
tftpd-hpa
E: Sub-process /usr/bin/dpkg returned an error code (1)

エラーになった。。。

Oh yes, there’s this Debian bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=544089
OpenMediaVault • View topic – OpenMediaVault on the Home Media CE

そのままだとipv6で見に行こうとするのでだめらしい。
--ipv4TFTP_OPTIONS に渡してあげないといけないようです。
というか、元記事にも書いてありましたね・・・。よく読まないと。

pi@raspberrypi ~ $ grep TFTP_OPTIONS /etc/default/tftpd-hpa
TFTP_OPTIONS="--secure"

たしかに --ipv4 オプションがない。
/etc/default/tftpd-hpa を編集。

TFTP_OPTIONS="--secure"
↓
TFTP_OPTIONS="--secure --ipv4"

ワンライナーは以下。

sudo sed -i -e 's/TFTP_OPTIONS="--secure"/TFTP_OPTIONS="--secure --ipv4"/g' /etc/default/tftpd-hpa

そしてぶっ壊れを修正してあげる。

pi@raspberrypi ~ $ sudo apt-get install -f
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up tftpd-hpa (5.2-4) ...
tftpd user (tftp) already exists, doing nothing.
tftpd-hpa directory (/srv/tftp) already exists, doing nothing.
insserv: warning: script 'mathkernel' missing LSB tags and overrides
[ ok ] Starting HPA's tftpd: in.tftpd.

立ち上がった。

デフォルトでは /srv/tftp/ がTFTPサーバーのルートになります。
所有権を変えておく。

sudo chown pi. /srv/tftp/

テストとして、WS-C3550のスイッチ設定ファイルをTFTPサーバーと化したRaspberry Pi(192.168.11.7)に送り込んでみる。

まずはTFTPサーバー側に空ファイルを用意しておく。こうしないとnot foundエラーになる。

pi@raspberrypi /srv/tftp $ touch switch-confg && chmod 666 switch-confg

Telnetでスイッチ(192.168.11.50)に接続。

% telnet 192.168.11.50
Trying 192.168.11.50...
Connected to 192.168.11.50.
Escape character is '^]'.
User Access Verification
Password: Kerberos: No default realm defined for Kerberos!
Password:
Switch>enable
Password:
Switch#copy run
Switch#copy running-config tftp
Address or name of remote host []? 192.168.11.7
Destination filename [switch-confg]?
!!
2635 bytes copied in 7.320 secs (376 bytes/sec)

送れたっぽいですね。
Raspberry Pi側で確認。

pi@raspberrypi /srv/tftp $ cat switch-confg | head
!
version 12.1
no service pad
service timestamps debug uptime
service timestamps log uptime
no service password-encryption
!
hostname Switch
!

見れました。
こういう省電力で静音なマシンにわざわざ大層なサーバーをこしらえるまでもない、ちょっとしたユーティリティ的な仕事させるのっていいですね。

参考文献

WS-C3550の設定ファイルをTFTPサーバーに保存する

はじめに、TFTPサーバー側に受け入れるファイルを用意しておきます。

% touch switch-confg && chmod 666 switch-confg

これをやらないと

TFTP: error code 1 received - File not found

となってしまいます。では、 192.168.11.2 をTFTPサーバーに見立ててトライ。

Switch#copy running-config tftp
Address or name of remote host []? 192.168.11.2
Destination filename [switch-confg]?
!!
2635 bytes copied in 3.200 secs (878 bytes/sec)

最初 not found になってしまったんですが、ファイル名って switch-config じゃなくて switch-confg なんですね。。。

WS-C3550のIOSをTFTPサーバーにバックアップする

今までの前口上で一番やりたかったのはこのIOS(Internetwork Operating System)のTFTPバックアップだったんですが、いろいろと手間取ってしまいました。
ですが、ここのエントリを書くまでに出荷時設定からTelnetの設定のところまでだいぶいい感じにこなれてきました。

ここまででスイッチにIPアドレスが設定されていることを前提にします。

まずはIOSのイメージの場所を調べる。

Switch#show flash
Directory of flash:/
2  -rwx           0   Jan 01 1970 00:01:28  env_vars
3  -rwx         342   Jan 01 1970 00:01:29  system_env_vars
9  drwx         192   Mar 01 1993 00:03:40  c3550-i5q3l2-mz.121-8.EA1c
15998976 bytes total (10893824 bytes free)
Switch#cd c3550-i5q3l2-mz.121-8.EA1c
Switch#show flash
Directory of flash:/c3550-i5q3l2-mz.121-8.EA1c/
10  drwx         640   Mar 01 1993 00:02:33  html
21  -rwx     3290242   Mar 01 1993 00:03:40  c3550-i5q3l2-mz.121-8.EA1c.bin
22  -rwx         252   Mar 01 1993 00:03:40  info
15998976 bytes total (10893824 bytes free)

最初はflashのルートに置いてあるもんだとばかり思っていたのですが、どうも違うみたいでした。
今回は以下の場所においてありました。

/c3550-i5q3l2-mz.121-8.EA1c/c3550-i5q3l2-mz.121-8.EA1c.bin

では、TFTPサーバーにコピーしてみます。
192.168.11.2 はTFTPサーバーのIPアドレスです。
FWが空いていることを確認するのを忘れずに。

Switch#copy flash tftp
Source filename [/c3550-i5q3l2-mz.121-8.EA1c/]? /c3550-i5q3l2-mz.121-8.EA1c/c3550-i5q3l2-mz.121-8.EA1c.bin
Address or name of remote host []? 192.168.11.2
Destination filename [c3550-i5q3l2-mz.121-8.EA1c.bin]?
TFTP: error code 1 received - File not found
%Error opening tftp://192.168.11.2/c3550-i5q3l2-mz.121-8.EA1c.bin (Undefined error)

ファイルが見つかりませんって言われてエラーになってしまいました。
ファイルがないって言うからコピー元のファイルのパスの指定の仕方が間違っていたのかと思って小一時間調べてしまいましたが、

put コマンドで対象ファイル名を指定し、アップロードします。ただし、TFTP でファイルをアップロードする場合、アップロードしようとしているファイルが存在している必要があります(上書きしか出来ません)。TFTP サーバとして公開しているディレクトリに tmp.txt というファイルが無い状態で、tmp.txt をアップロードしようとすると、以下のエラーとなってしまいます。
TFTP サーバを起動する – えこ日記

とのことで、ターゲットにファイルが存在しないとそもそもエラーになってしまうようです・・・。

ところで、今回のTFTPサーバはMacを使用しています。
なので、Mac側で所望のファイル名で空ファイルを作成します。

% touch /private/tftpboot/c3550-i5q3l2-mz.121-8.EA1c.bin

今度はエラーメッセージが変わりました。

TFTP: error code 2 received - Access violation

おそらくパーミッションがないだろうことなので

% chmod 666 /private/tftpboot/c3550-i5q3l2-mz.121-8.EA1c.bin

再度トライ。

Switch#copy flash tftp
Source filename [/c3550-i5q3l2-mz.121-8.EA1c/c3550-i5q3l2-mz.121-8.EA1c.bin]?
Address or name of remote host []? 192.168.11.2
Destination filename [c3550-i5q3l2-mz.121-8.EA1c.bin]?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(snip)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3290242 bytes copied in 13.352 secs (253095 bytes/sec)

うまくいきましたー。

スイッチだけだけど、これでGNS3が使えるようになるかな?

参考文献

WS-C3550を工場出荷時設定にする

Switch#write erase
Erasing the nvram filesystem will remove all files! Continue? [confirm] ←エンター
[OK]
Erase of nvram: complete
Switch#reload ←エンター
System configuration has been modified. Save? [yes/no]: no
Proceed with reload? [confirm] ←エンター
00:21:57: %SYS-5-RELOAD: Reload requested

ポイントは “System configuration has been modified. Save?” の質問に no と答えること。
こうしないと running-config にメモリ上にある設定外書き込まれてまた再起動されてしまう?

WS-C3550でTelnetログインできるようにする

スイッチにIPアドレスも設定したし、よし、Telnet接続するぞって思いました。
(ほんとはSSHしたい。)

% telnet 192.168.11.50
Trying 192.168.11.50...
Connected to 192.168.11.50.
Escape character is '^]'.
Password required, but none set
Connection closed by foreign host.

蹴られました。Telnetのパスワード設定しないといけないようです。

シリアルコンソールで接続。回線の一覧を表示。
ちなみにコンソールポートの0番以外全部バーチャルターミナルみたい。
VTYがTelnetで使用される。

Switch>enable
Switch#show line
Tty Typ     Tx/Rx    A Modem  Roty AccO AccI   Uses   Noise  Overruns   Int
*    0 CTY              -    -      -    -    -      0       0     0/0       -
1 VTY              -    -      -    -    -     17       0     0/0       -
2 VTY              -    -      -    -    -      0       0     0/0       -
3 VTY              -    -      -    -    -      0       0     0/0       -
4 VTY              -    -      -    -    -      0       0     0/0       -
5 VTY              -    -      -    -    -      0       0     0/0       -
6 VTY              -    -      -    -    -      0       0     0/0       -
7 VTY              -    -      -    -    -      0       0     0/0       -
8 VTY              -    -      -    -    -      0       0     0/0       -
9 VTY              -    -      -    -    -      0       0     0/0       -
10 VTY              -    -      -    -    -      0       0     0/0       -
11 VTY              -    -      -    -    -      0       0     0/0       -
12 VTY              -    -      -    -    -      0       0     0/0       -
13 VTY              -    -      -    -    -      0       0     0/0       -
14 VTY              -    -      -    -    -      0       0     0/0       -
15 VTY              -    -      -    -    -      0       0     0/0       -
16 VTY              -    -      -    -    -      0       0     0/0       -

設定方法は以下。

line vty 0 15
password hello
login
exit
enable password hello
exit

一番最後の enable password がないとTelnetログインできても特権EXECモードへは移行できない。
本当は暗号化したほうがいい。

参考文献

Mac OS XでTFTPサーバーを起動する

Mavericksです。

初めにサービスの設定ファイルを見てみる。

% cat /System/Library/LaunchDaemons/tftp.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>com.apple.tftpd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/libexec/tftpd</string>
<string>-i</string>
<string>/private/tftpboot</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<true/>
</dict>
<key>InitGroups</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>tftp</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>

まずはサンプルのファイルを用意。

% cat <<EOF | >/private/tftpboot/hello.txt
Hello, and
GoodBye.
EOF

まずはつないでみる。

% tftp localhost
tftp> status
Connected to localhost.
Mode: netascii Verbose: off Tracing: off
Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
tftp> quit

Connected って出ておっ、つながったかなっておもうじゃないですか。

% tftp localhost
tftp> get hello.txt
Transfer timed out.
tftp> quit

つながったと思った?残念、つながってませんでした!

% sudo lsof -i:69

空っぽなのです。

サービスを立ち上げます。

% sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
% sudo lsof -i:69                                                (git)-[master]
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd   1 root  108u  IPv6 0x4b902fe356b26297      0t0  UDP *:tftp
launchd   1 root  110u  IPv4 0x4b902fe35704aec7      0t0  UDP *:tftp

今度こそ立ち上がったっぽいです。

% tftp localhost
tftp> get hello.txt
Received 26 bytes in 0.0 seconds
tftp> quit

中身を確認。

% pwd
/Users/noguchiwataru/
% cat hello.txt
Hello, and
GoodBye.

用が済んだらサービスを停止する。

% sudo launchctl unload -w /System/Library/LaunchDaemons/tftp.plist
% sudo lsof -i:69

参考文献

WS-C3550のIPアドレスを設定する

出荷時設定の段階から

conf ter でもいける。

enable
configure terminal
interface Vlan 1
ip address 192.168.11.50
no shutdown
exit
ip route 0.0.0.0 0.0.0.0 192.168.11.1

no shutdown を忘れると全くつながらないので注意。

同じサブネットの場合はデフォルトゲートウェイを指定しなくてもいける。

ping 192.168.11.2

awscliからEC2インスタンスを作成する(Amazon Linux + EBS + Elastic IP)

  • jqコマンドがあるととても便利です。
  • 事前にセキュリティグループとキーペア、Elastic IPは作成・割り当て済みとします。

インスタンスの作成

aws ec2 run-instances --image-id ami-0d13700c --count 1 --instance-type t1.micro --key-name default --security-groups webserver | jq '.'

インスタンスIDを調べる

さっき起動したインスタンスインスタンスIDを調べます。

aws ec2 describe-instances | jq '.Reservations [] .Instances [] .InstanceId'

Elastic IPの一覧を調べる

aws ec2 describe-addresses| jq '.'

インスタンスにElastic IPを割り当て

aws ec2 associate-address --instance-id i-12345678 --public-ip 111.111.111.111

インスタンスのAZ(Availability Zone)を調べる

EBSを作成するときにインスタンスのAZが違うとアタッチできないようです。

% aws ec2 describe-instances --instance-ids i-12345678 | jq '.Reservations [] .Instances [] .Placement .AvailabilityZone'
"ap-northeast-1a"

EBSボリューム作成

2GBのボリュームをap-northeast-1aに作成します。

aws ec2 create-volume --size 2 --availability-zone ap-northeast-1a

作成されたボリュームのIDを調べる

2番目(1)のボリュームIDを参照します。

aws ec2 describe-volumes | jq '.Volumes [1] .VolumeId'
"vol-b5d722ab"

EBSボリュームのアタッチ

aws ec2 attach-volume --volume-id vol-b5d722ab --instance-id i-12345678 --device xvdf

EC2インスタンスSSH接続してボリュームをフォーマットしてext4ファイルシステムを作成します。

パーティション作成。

fdisk /dev/xvdf
n
p
1
Enter
Enter
w

ext4ファイルシステムを作成。

mkfs.ext4 /dev/xvdf1

マウント先を /data にします。

mkdir /data

fstab編集。

vi /etc/fstab
/dev/xvdf1  /data       ext4    defaults,noatime  1   1

マウント実行。

mount -a

マウントされたか確認します。

[root@ip-172-31-5-123 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.9G  1.2G  6.7G  16% /
tmpfs           298M     0  298M   0% /dev/shm
/dev/xvdf1      2.0G   35M  1.9G   2% /data

おわりに

大体終わりました。
ここではswapを作成していないのが問題です。

インスタンスを停止する

aws ec2 stop-instances --instance-ids i-12345678 | jq '.'

インスタンスを起動する

aws ec2 start-instances --instance-ids i-12345678 | jq '.'