インターネットへ接続できないサーバでyumを使う

インターネットへ接続できない環境にあるサーバ(以下、サーバB)で、yumを使ってパッケージのインストールをする方法。

はじめに、インターネットへの接続性のあるApacheがインストールされたHTTPサーバ(以下、サーバA)を用意する。サーバAとサーバB間で通信可能な環境(以下のような構成)を構築する。
f:id:mittsun1979:20150127223543p:plain

サーバAのhttpd.confを編集して、mod_proxyモジュールを有効化(コメントアウトを解除)およびディレクティブを以下のような感じにする。

# vi /etc/httpd/conf/httpd.conf
<snip>
LoadModule proxy_module modules/mod_proxy.so
<snip>

<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On

<Proxy *>
    Order deny,allow
    Deny from all
    Allow from 172.16.0.0/24 # 許可するIPアドレス
</Proxy>

サーバAのhttpdを再起動する。
サーバBのyum.confに編集して、proxyの設定を追加する。

# vi /etc/yum.conf
<snip>
proxy=http://サーバAのIPアドレス:ポート番号/

サーバBで# yum install mysqlとすれば、サーバA経由でパッケージを取得してインストールできるはず。

さくらのクラウドにDHCPサーバ構築してパフォーマンス測定してみた

さくらインターネットから「さくらのクラウド」の2万円分無料クーポンをいただきました。ありがとうございます。

さくらのクラウドDHCPサーバ運用すれば、自前でサーバ持ってなくていいよな。サーバ買い替えなくてもいいし。VPN張って、DHCPリレー先(helper address)をさくらのクラウドにすればいいよね。とりあえず、さくらのクラウド内でパフォーマンスを測定してみよう。」ってことでやってみた。

さくらのクラウドに2台の仮想サーバを作成する。スイッチ(dhcp-sw)経由で2台を接続する。1台をDHCPサーバ(dhcp01)、もう1台をパフォーマンス測定サーバ(dhcperf)とする。構成図は、以下の通り。
f:id:mittsun1979:20150123132927p:plain

パフォーマンス測定に使用したツールは、nominum社提供のdhcperfというやつ。
Measurement Tools - Nominum

用意したもの

  • サーバ x 2台
      • サーバプラン
        • 仮想コア 1
        • メモリ 1GB
    • ディスク
      • ディスクプラン SSDプラン
      • ディスクソース アーカイブ(簡易)
      • アーカイブ選択 [public] 20GB CentOS 7.0 64bit(基本セット)
      • 準仮想化モードを使用する(Virtio)
    • NIC
      • インターネットに接続
      • 準仮想化モードを使用する(Virtio)
  • ネットワーク
    • スイッチ(ルータ いいえ) x 1台

DHCPサーバの準備
1. インタフェースの設定

[root@dhcp01 ~]# nmcli add type eth ifname eth1 con-name eth1
Connection 'eth1' (f1fdbd45-0160-471c-9357-ff302598d36f) successfully added.
[root@dhcp01 ~]# nmcli c mod eth1 ipv4.method manual ipv4.addresses "10.0.0.1/16 10.0.255.254"
[root@dhcp01 ~]# # nmcli c down eth1
Error: 'eth1' is not an active connection.
[root@dhcp01 ~]# # nmcli c up eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@dhcp01 tmp]# ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 9c:a3:ba:30:44:16 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/16 brd 10.0.255.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe30:4416/64 scope link
       valid_lft forever preferred_lft forever

2. dhcpのインストール

[root@dhcp01 ~]# yum install dhcp
<snip>
Installed:
  dhcp.x86_64 12:4.2.5-27.el7.centos.2                                          

Complete!

3. dhcpd.confの設定

[root@dhcp01 ~]# vi /etc/dhcp/dhcpd.conf 
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

authoritative;
ddns-update-style none;

subnet 10.0.0.0 netmask 255.255.0.0 {
    default-lease-time 600;
    max-lease-time 7200;

    range 10.0.0.10 10.0.255.253;
    option routers 10.0.255.254;

    ddns-updates off;
}

#NIC
subnet 133.242.*.0 netmask 255.255.255.0 {
  not authoritative;
}

4. dhcpのリースファイル作成

[root@dhcp01 ~]# touch /var/tmp/dhcpd.leases

5. dhcpdのコンフィグファイルのテスト

[root@dhcp01 ~]# dhcpd -t -cf /etc/dhcp/dhcpd.conf -lf /var/tmp/dhcpd.leases

コンフィグにerrorがあると、以下のような感じです。

/etc/dhcp/dhcpd.conf line 27: expecting a declaration
};
 ^
Configuration file errors encountered -- exiting
<snip>

6. dhcpdの起動

[root@dhcp01 ~]# dhcpd -cf /etc/dhcp/dhcpd.conf -lf /var/tmp/dhcpd.leases
Internet Systems Consortium DHCP Server 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Wrote 0 leases to leases file.
Listening on LPF/eth1/9c:a3:ba:30:44:16/10.0.0.0/16
Sending on   LPF/eth1/9c:a3:ba:30:44:16/10.0.0.0/16
Listening on LPF/eth0/9c:a3:ba:30:ee:51/133.242.*.*/24
Sending on   LPF/eth0/9c:a3:ba:30:ee:51/133.242.*.*/24
Sending on   Socket/fallback/fallback-net

7. dhcpdの起動を確認

[root@dhcp01 ~]# ps axww | grep dhcp[d]
 5550 ?        Ss     0:00 dhcpd -cf /etc/dhcp/dhcpd.conf -lf /var/tmp/dhcpd.leases

8. ログを眺める

[root@dhcp01 ~]# tailf /var/log/messages
Jan 22 15:32:50 dhcp01 dhcpd: Internet Systems Consortium DHCP Server 4.2.5

dhcperfの準備
1. インタフェースの設定

[root@dhcp01 ~]# nmcli add type eth ifname eth1 con-name eth1
Connection 'eth1' (862f4a5e-e055-430e-94b5-8e5b9c2c9209) successfully added.
[root@dhcp01 ~]# nmcli c mod eth1 ipv4.method manual ipv4.addresses "10.0.0.2/16 10.0.255.254"
[root@dhcp01 ~]# # nmcli c down eth1
Error: 'eth1' is not an active connection.
[root@dhcp01 ~]# # nmcli c up eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@dhcpperf ~]# ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 9c:a3:ba:30:ef:89 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/16 brd 10.0.255.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe30:ef89/64 scope link
       valid_lft forever preferred_lft forever


2. wgetのインストール
  wgetインストール済みであれば、skip

[root@dhcpperf ~]# yum install wget
<snip>
Complete!

3. dhcperfのパッケージをダウンロード

[root@dhcpperf ~]# wget ftp://ftp.nominum.com/pub/nominum/dhcperf/1.0.1.0/dhcperf-1.0.1.0-1-rhel-4-i386.tar.gz

4. dhcperfのインストール

[root@dhcpperf ~]# tar xzf dhcperf-1.0.1.0-1-rhel-4-i386.tar.gz 
[root@dhcpperf ~]# rpm -ivh ./dhcperf-1.0.1.0-1/dhcperf-1.0.1.0-1.i386.rpm

5. dhcperfのテスト

[root@dhcpperf ~]# /usr/local/nom/bin/dhcperf --server 10.0.0.1 --one-discover
Sending DHCPDISCOVER.
Received DHCPOFFER of 10.0.128.106.
Sending DHCPREQUEST for 10.0.128.106.
Received DHCPACK of 10.0.128.106.
Acquired address: 10.0.128.106

6. dhcperfでパフォーマンス測定
  DISCOVER - OFFER - REQUEST - ACK - RELEASE の測定

[root@dhcpperf ~]# /usr/local/nom/bin/dhcperf --server 10.0.0.1 --discover --test-duration 30
Beginning DHCPDISCOVER load test.
Initial probe complete: High-water mark is 61 clients/second.
Preparing for next test run.
Beginning test run: 30 clients/second for 30 seconds.
Succeeded: 0/900 clients failed.
Preparing for next test run.
Beginning test run: 45 clients/second for 30 seconds.
Stopping run after 6 seconds; 2/109 clients failed.
Preparing for next test run.
Beginning test run: 37 clients/second for 30 seconds.
Stopping run after 16 seconds; 2/542 clients failed.
Preparing for next test run.
Beginning test run: 33 clients/second for 30 seconds.
Succeeded: 0/990 clients failed.
Preparing for next test run.
Beginning test run: 35 clients/second for 30 seconds.
Succeeded: 0/1050 clients failed.
Preparing for next test run.
Beginning test run: 36 clients/second for 30 seconds.
Stopping run after 15 seconds; 2/430 clients failed.
35 five-way handshakes per second.

7. dhcperfでパフォーマンス測定
 REQUEST - ACK の測定

[root@dhcpperf ~]# /usr/local/nom/bin/dhcperf --server 10.0.0.1 --renew --test-d
uration 30
Creating 20000 clients for renew test.
20000 clients available
Beginning DHCPRENEW load test.
Initial probe complete: High-water mark is 209 clients/second.
Preparing for next test run.
Beginning test run: 104 clients/second for 30 seconds.
Stopping run after 11 seconds; 4/935 clients failed.
Preparing for next test run.
Beginning test run: 52 clients/second for 30 seconds.
Succeeded: 0/1560 clients failed.
Preparing for next test run.
Beginning test run: 78 clients/second for 30 seconds.
Stopping run after 23 seconds; 3/1776 clients failed.
Preparing for next test run.
Beginning test run: 65 clients/second for 30 seconds.
Succeeded: 0/1950 clients failed.
Preparing for next test run.
Beginning test run: 71 clients/second for 30 seconds.
Succeeded: 0/2130 clients failed.
Preparing for next test run.
Beginning test run: 74 clients/second for 30 seconds.
Succeeded: 0/2220 clients failed.
Preparing for next test run.
Beginning test run: 76 clients/second for 30 seconds.
Succeeded: 0/2280 clients failed.
76 DHCPRENEW transactions per second.


それぞれのテストを6回実施した結果。

テスト種別 1目 2回目 3回目 4回目 5回目 6回目 平均
RENEW[回/秒] 76 74 94 71 92 59 77.6
DISCOVER[回/秒] 35 30 32 32 28 31 31.3

※RENEWは、REQUEST-ACKで1回。DISCOVERは、DISCOVER-OFFER-REQUEST-ACK-RELEASEで1回。

VPN張ってなかったり, DHCPに設定しているサブネット1つだったりと実際の利用を想定した環境と全然違って、このデータ意味あるのかという感も否めませんが。今後、下記を参考にVyOSでVPN張ってテストしてみたい。
サイト間VPN設定 | さくらのクラウドニュース

dhcperfがインストールに失敗した時の対処例

[root@dhcpperf ~]# rpm -ivh ./dhcperf-1.0.1.0-1/dhcperf-1.0.1.0-1.i386.rpm 
error: Failed dependencies:
	libc.so.6 is needed by dhcperf-1.0.1.0-1.i386
	libc.so.6(GLIBC_2.0) is needed by dhcperf-1.0.1.0-1.i386
	libc.so.6(GLIBC_2.1) is needed by dhcperf-1.0.1.0-1.i386
	libc.so.6(GLIBC_2.1.3) is needed by dhcperf-1.0.1.0-1.i386
	libc.so.6(GLIBC_2.2) is needed by dhcperf-1.0.1.0-1.i386
	libc.so.6(GLIBC_2.3) is needed by dhcperf-1.0.1.0-1.i386
	libm.so.6 is needed by dhcperf-1.0.1.0-1.i386
	libresolv.so.2 is needed by dhcperf-1.0.1.0-1.i386
[root@dhcpperf ~]# yum install glibc*
<snip>
Complete!
[root@dhcpperf ~]# yum install glibc*i686
<snip>
Complete!

Raspberry PiのGPIOを制御してLEDを点滅

Raspberry PiのGPIOを制御してLEDを点滅する方法。
※本サイトを参考にして被った損害、怪我、事故、障害、不都合、不利益等に関して責任は一切負いません。

抵抗は、GPIOが3.3VでLEDの順方向電圧が2.7Vとして、(3.3V-2.7V)/5mA=120Ωというような計算。
※120Ωの抵抗持っていないので、100Ωを使った。多少電流増えるがまぁー大丈夫だろう。

GPIO17(ピン番号11)--抵抗100Ω--(アノード)LED(カソード)--GND(ピン番号25)となるように接続する。

1. rootになって

$ sudo su

2. GPIO17(ピン番号11)を使います

# echo "17" > /sys/class/gpio/export

3. GPIO17のディレクトリが作成されて

# ls /sys/class/gpio/
export  gpio17  gpiochip0  unexport
# ls /sys/class/gpio/gpio17/
active_low  direction  edge  power  subsystem  uevent  value

4. GPIO17を出力として使います

# echo "out" > /sys/class/gpio/gpio17/direction

5. GPIO17の出力をONして、LEDが点灯

# echo "1" > /sys/class/gpio/gpio17/value

6. GPIO17の出力をOFFして、LEDが消灯

# echo "0" > /sys/class/gpio/gpio17/value

7. GPIO17を使うのをやめます

# echo "17" > /sys/class/gpio/unexport

8. GPIO17のディレクトリが削除される

# ls /sys/class/gpio/
export  gpiochip0  unexport

例えば、下記スクリプトを作成して実行すれば、LEDが10回点滅して終了する。

#!/bin/bash

echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction

for i in `seq 1 10`
do
  echo "1" > /sys/class/gpio/gpio17/value
  echo "0" > /sys/class/gpio/gpio17/value
done

echo "17" > /sys/class/gpio/unexport

次は制御するGPIOの数を増やして数個のLEDをピカピカさせるか、PWM制御で明るさ調整してみる。

Raspberry PiをWi-Fi接続する

Raspberry PiをWPA2-PSK(AES)でWi-Fi接続する時の流れ。使用したUSB2.0無線LANアダプタは、ロジテックのLAN-W150N/U2です。

1. USBデバイスの一覧で無線LANアダプタが認識されていることを確認

$ lsusb
<snip>
Bus 001 Device 005: ID 0789:0168 Logitec Corp. LAN-W150N/U2 Wireless LAN Adapter

2. wpa_passphrase コマンドでWi-Fi接続時の設定を作成

$ sudo wpa_passphrase SSIDNAME PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf

3. wpa_supplicant.confに足りない記載があれば、書き加える

$ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="SSIDNAME"
        key_mgmt=WPA-PSK #ここらへん
        proto=RSN #ここらへん
        pairwise=CCMP #ここらへん
        group=CCMP #ここらへん
        #psk="PASSPHRASE"
        psk=2b1d17284c5410ee5eaae7151290e9744af2182b0eb8af20dd4ebb415928f726
}

4. Wi-Fi接続

$ sudo wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid -i wlan0 -D nl80211,wext -c /etc/wpa_supplicant/wpa_supplicant.conf

補足
起動時にWi-Fi接続するには、/etc/network/interfacesを編集して

$ sudo vi /etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
#iface wlan0 inet manual
iface wlan0 inet dhcp
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

再起動する。

有線LANも接続されているとデフォルトゲートウェイが想定と異なることもあるので、そういった場合はrouteコマンドでデフォルトゲートウェイを変更する。

Raspberry PiにSTM32F411REを繋いでLED点滅させる

Raspberry PiにSTM32F411REを繋ぎ、mbedオンラインコンパイラコンパイルしてできた.binを書き込み、LED点滅させるまでにやったこと。
※STM32F411REに電源供給すれば、あらかじめ書き込まれているプログラムが実行されてLED点滅する。

Raspberry PiのUSBポートにSTM32F411REを接続すれば自動認識される。

$ dmesg
<snip>
[    3.386473] usb 1-1.2: Product: STM32 STLink
[    3.393662] usb 1-1.2: Manufacturer: STMicroelectronics
[    3.400817] usb 1-1.2: SerialNumber: 0673FF514951775087035535
[    3.466354] usb-storage 1-1.2:1.1: USB Mass Storage device detected
[    3.489401] scsi0 : usb-storage 1-1.2:1.1
<snip>
[    4.490367] scsi 0:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
<snip>
. It is not a modem.
[    7.146527] cdc_acm 1-1.2:1.2: ttyACM0: USB ACM device

USBデバイス一覧の中に確認できる。

$ lsusb
<snip>
Bus 001 Device 004: ID 0483:374b SGS Thomson Microelectronics

マウントもされている。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs          15104000 1865976  12588232  13% /
/dev/root       15104000 1865976  12588232  13% /
devtmpfs          219744       0    219744   0% /dev
tmpfs              44784     264     44520   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs              89560       0     89560   0% /run/shm
/dev/mmcblk0p1     57288    9904     47384  18% /boot
/dev/sda              16      16         0 100% /media/NUCLEO

オンラインコンパイラコンパイルしてできたプログラム(.bin)をコピーしたら失敗。

$ cp Nucleo_blink_led_NUCLEO_F411RE.bin /media/NUCLEO/
cp: writing `/media/NUCLEO/Nucleo_blink_led_NUCLEO_F411RE.bin': No space left on device
cp: failed to extend `/media/NUCLEO/Nucleo_blink_led_NUCLEO_F411RE.bin': No space left on device

下記ページを参考にして、firmwareのアップデートとST-Linkドライバのインストールを試みる。
Preparing the STM32 Nucleo Board - | mbed

$ unzip stlinkupgradev2j23m6.zip
Archive:  stlinkupgradev2j23m6.zip
   creating: STLinkUpgradeV2J23/
  inflating: STLinkUpgradeV2J23/ST-LinkUpgrade.exe
  inflating: STLinkUpgradeV2J23/STLinkUSBDriver.dll
pi@raspberrypi ~/stm32 $ unzip stlinknucleodriversigned.zip
Archive:  stlinknucleodriversigned.zip
  inflating: STLinkNucleoDriverSigned/dpinst_amd64.exe
  inflating: STLinkNucleoDriverSigned/dpinst_x86.exe
<snip>

Windows環境でないとダメそうなので、あきらめて別の方法を探して有益な情報にたどりつく。
Uploading .bin files to STM32 Nucleo in Linux. | mbed
Programming STM32 Microcontroller Flash in Linux

1. libusbをインストール

$ sudo apt-get install libusb-1.0.0-dev
<snip>

2. stlinkをインストール

$ git clone https://github.com/texane/stlink stlink.git
もしくは
$ wget https://github.com/texane/stlink/archive/master.zip
<snip>
$ unzip master.zip
<snip>
$ cd stlink-master/
$ ./autogen.sh 
autoreconf: Entering directory `.'
<snip>
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
<snip>
$ make 
Making all in .
<snip>
$sudo make install
Making install in .
<snip>
$ sudo cp *.rules /etc/udev/

3. st-flashコマンドで書き込む

$ sudo st-flash write Nucleo_blink_led_NUCLEO_F411RE.bin 0x8000000
2015-01-04T16:36:21 INFO src/stlink-common.c: Loading device parameters....
2015-01-04T16:36:21 INFO src/stlink-common.c: Device connected is: F4 device (low power) - stm32f411re, id 0x10006431
2015-01-04T16:36:21 INFO src/stlink-common.c: SRAM size: 0x20000 bytes (128 KiB), Flash: 0x80000 bytes (512 KiB) in pages of 16384 bytes
2015-01-04T16:36:21 INFO src/stlink-common.c: Attempting to write 13408 (0x3460) bytes to stm32 address: 134217728 (0x8000000)
EraseFlash - Sector:0x0 Size:0x4000
Flash page at addr: 0x08000000 erased
2015-01-04T16:36:21 INFO src/stlink-common.c: Finished erasing 1 pages of 16384 (0x4000) bytes
2015-01-04T16:36:21 INFO src/stlink-common.c: Starting Flash write for F2/F4
2015-01-04T16:36:21 INFO src/stlink-common.c: Successfully loaded flash loader in sram
size: 13408
2015-01-04T16:36:21 INFO src/stlink-common.c: Starting verification of write complete
2015-01-04T16:36:21 INFO src/stlink-common.c: Flash written and verified! jolly good!

4. ピカピカ。やったね。

プログラムが反映されなければ、STM32F411RE上のRESETボタン(黒いスイッチ)を押してみたり。
尚、./autogenを実行したときに"autoreconfがないよ"って言われたら、autoconfをインストールする。

$ ./autogen.sh
./autogen.sh: 2: ./autogen.sh: autoreconf: not found
$ sudo apt-get install autoconf
<snip>

Raspberry Pi のソフトウェアを更新

Raspberry Pi のソフトウェア(パッケージ)を更新した。

1. リポジトリを更新

# apt-get update
0% [Connecting to mirrordirector.raspbian.org (5.153.225.207)] 
<snip>

30秒程度で完了。

2. ソフトウェア(パッケージ)を更新

# apt-get upgrade
Reading package lists...
<snip>

20分弱で完了。

リポジトリの更新を実施せず、ソフトウェア(パッケージ)を更新を実施しても意味ないんだよね。たぶん。

Excelファイルをシート毎に分割する

Excelファイル(ブック)をシート毎に分割して保存したいということが稀にある。

1. 分割したいExcelファイル(ブック)に以下のマクロを登録する。
2. マクロを実行する。
3. シート名がファイル名になったExcelファイル(ブック)ができあがる。

Sub 分割()
    Dim i As Integer
    Dim N As Integer 'ファイル作成数のカウンタ
    Dim Filename As String '保存するファイル名

    Application.ScreenUpdating = False '画面更新を停止

    i = 1
    Do While i <= Worksheets.Count
        Filename = Worksheets(i).Name
        Worksheets(i).Copy
        With ActiveWorkbook
            .SaveAs ThisWorkbook.Path & "\" & Filename & ".xls" '元ファイルと同フォルダに保存する
            .Close
            N = N + 1
        End With
        i = i + 1
    Loop
    
    Application.ScreenUpdating = True '画面更新を再開
    MsgBox N & " 個のブックを作成しました。"
End Sub

デスクトップで実行して、デスクトップがExcelアイコンで埋まった...。