AXP(Application eXtension Platform)/LKMについて

バージョン 1

    AXP(Application eXtension Platform)へ戻る

     

    AXPでは、Loadable kernel module (LKM) をサポートしています。

    ここでは、LKMの指定方法、サードパーティーLKMの作成、追加のLKM作成について記載します。

     

     

     

    Cisco LKMとLKMの指定方法

    Ciscoが提供しているLKM (Cisco LKMs) は、AXPのベースイメージにあります。そのため、capabilities configuration ファイルの@MODULESセクションにLKMのリストを記載することで、ロードすることができます。

    以下に、Cisco LKMsのリストを記載します。

    • ip_tables.ko
    • iptable_filter.ko
    • iptable_mangle.ko
    • ip_queue.ko
    • tun.ko

    ※AXP1.5.2以降では、ip_queue.ko, crc32.ko, bitrev.ko は、Cisco LKMsから除外されています。

    これらLKMを使用する場合は、pkg_buildのパラメータ cap-config に、コンフィグレーションファイルとして指定します。以下に、例を示します。

    [example]$ cat > build/capabilities.cfg <<EOT
    @MODULES=
    ip_tables.ko
    iptable_filter.ko
    EOT
    [example]$ pkg_build.sh --source-dir '/opt/axp/apps/example/build' \
    ~省略~
    --cap-config '/capabilities.cfg'

    ※コンフィグレーションファイルは、パッケージソースディレクトリ内に配置する必要があります。

     

     

     

    サードパーティーLKMの作成

    サードパーティーLKMを作成するには、LKM SDKを使用します。

    LKMをビルドする場合、基本開発パッケージをインストールしたLinuxワークステーションで作業する必要があります。たとえば、CentOS 5.2 では以下のRPMが必要です。

    • gcc-4.1.2-42.el5.i386.rpm
    • make-3.81-3.el5.i386.rpm
    • bison-2.3-2.1.i386.rpm
    • flex-2.5.4a-41.fc6.i386.rpm
    • texinfo-4.8-14.el5.i386.rpm

    LKM SDKは、Debian, Fedora, OpenSuse でテスト済みです。

     

     

    以下に、サードパーティーLKMの作成の手順を示します。ここでは、以下の条件下で作業をしているものとします。

    LKM SDK インストールパス/opt/axp/axp-lkm-sdk.1.6.1
    作成するLKM名sample.ko
    AXPモジュールNME
    LKMを使用するパッケージ情報

    パッケージ名 : example

    パッケージパス:

    /opt/axp/apps/example/
                         build/・・・ソース
                               capabilities.cfg・・・cap-configファイル
                               mymodule/・・・LKM保存先

     

     

    1. LKM SDKを入手します。Cisco Developer CommunityのAXPより、axp-lkm-sdk.1.6.1.tar.gzをダウンロードします。
    2. LKM SDKを展開し、プラットフォーム用のイメージを作成します。
      [~]$ cd /opt/axp
      [axp]$ tar zxvf axp-lkm-sdk.1.6.1.tar.gz
      [axp]$ cd axp-lkm-sdk.1.6.1
      [axp-lkm-sdk.1.6.1]$ make tools PLATFORM=nme

      ※ISM/SMサービスモジュールの場合は、make tools PLATFORM=smeとします。

      作成が成功すると、ディレクトリ内にimageディレクトリが作成されます。

    3. サードパーティーLKMのソースを作成します
      1. ここでは例として、sampleというLKMを作成します。
        [axp-lkm-sdk.1.6.1]$ mkdir sample
        [axp-lkm-sdk.1.6.1]$ cd sample
        [sample]$
      2. ソースを作成します。
        [sample]$ cat > sample.c <<EOT
        #include <linux/module.h>
        #include <linux/kernel.h>
        #include <linux/init.h>

        MODULE_DESCRIPTION("Sample Module");
        MODULE_LICENSE("GPL");
        MODULE_AUTHOR("cisco");

        static int sample_init(void) {
             printk("hello world!\n");
             return 0;
        }

        static void sample_exit(void) {
             printk("bye!\n");
        }

        module_init(sample_init);
        module_exit(sample_exit);
        EOT
        [sample]$
      3. Makefileを作成します。
        [sample]$ cat > Makefile <<EOT
        LKMSDK := /opt/axp/axp-lkm-sdk.1.6.1/image
        obj-m := sample.o
        --include-dir=$(LKMSDK)/linux/include
        KDIR := $(LKMSDK)/kernel-2.6.22/linux

        all:
                 make -C $(KDIR) M=$(PWD) ARCH=i386 modules

        clean:
                 rm -f *.o *.ko *.mod.c

        EOT
        [sample]$

         

      4. makeします。
      5. 作成された sample.ko を、example パッケージにコピーします。          
        [sample]$ cp sample.ko /opt/axp/apps/example/build/mymodule/sample.ko
    4. コンフィグレーションファイルの、@MODULESセクションに /mymodule/sample.ko を記載し、パッケージを作成します。
      [~]$ cd /opt/axp/apps/example
      [example]$ cat > build/capabilities.cfg <<EOT
      @MODULES=
      /mymodule/sample.ko
      ip_tables.ko
      iptable_filter.ko
      EOT
      [example]$ pkg_build.sh --source-dir '/opt/axp/apps/example/build' \
      ~省略~
      --cap-config '/capabilities.cfg'

      ※lsmodで確認をする場合は、third_party_rpms_repositoryに module-init-tools-3.3-0.pre3.1.37.el5.i386.rpm を指定してください。

    5. パッケージをインストールします。
    6. AXP CLIから、Kernel Moduleがロードされたか、確認します。          
      AXP# app-service example
      AXP(exec-example)# show tech-support  | begin Kernel
      Kernel Module:
               ip_tables.ko
               iptable_filter.ko
               /mymodule/sample.ko

     

     

     

    追加のLKM作成

    1. LKM SDKを入手します。Cisco Developer CommunityのAXPより、axp-lkm-sdk.1.6.1.tar.gzをダウンロードします。
    2. LKM SDKを展開し、プラットフォーム用のイメージを作成します。
      [~]$ cd /opt/axp
      [axp]$ tar zxvf axp-lkm-sdk.1.6.1.tar.gz
      [axp]$ cd axp-lkm-sdk.1.6.1
      [axp-lkm-sdk.1.6.1]$ make tools PLATFORM=nme

      ※ISM/SMサービスモジュールの場合は、make tools PLATFORM=smeとします。

      作成が成功すると、ディレクトリ内にimageディレクトリが作成されます。

    3. {LKM SDK}/gplCore/kernel-2.6.22 に移動します。    
      [linux]$ cd ../../../gplCore/kernel-2.6.22
    4. make modules を実行します。    
      [kernel-2.6.22]$ make modules
      ~省略~
         Building modules, stage 2.
         MODPOST 15 modules
         CC      drivers/usb/serial/pl2303.mod.o
         LD [M]  drivers/usb/serial/pl2303.ko
         CC      drivers/usb/serial/usbserial.mod.o
         LD [M]  drivers/usb/serial/usbserial.ko
      [kernel-2.6.22]$
    5. moduleが作成されたか確認します。    
      [kernel-2.6.22]$ cd ../../image/kernel-2.6.22/linux/drivers/
      [drivers]$ find -name *.ko
      ./usb/serial/usbserial.ko
      ./usb/serial/pl2303.ko
      [drivers]$
      目的のLKMが見つからない場合は、以下の手順でmoduleを作成します。
      1. {LKM SDK}/image/kernel-2.6.22/linuxに移動し、.configのバックアップを作成します。
        [axp-lkm-sdk.1.6.1]$ cd image/kernel-2.6.22/linux
        [linux]$ cp .config .config.bak
      2. make menuconfig で、目的のLKMを作成する指定をします。
        [linux]$ make menuconfig
        ※例えば、USB Prolific 2303 Single Port Serial Driverを指定する場合は、
        1) Device Drivers を選択
        2) USB support を選択
        3) USB Serial Converter support を選択
        4) USB Prolific 2303 Single Port Serial Driver を選択し、Mを押す。
            ※< > USB Serial Converter support の場合は、Mを押す。
        5) Eを3回押して(Exitを3回選択)、Save an Alternate Configuration File を選択。
        6) .config であることを確認し、OK
        7) Exit
      3. {LKM SDK}/gplCore/kernel-2.6.22 に移動します。    
        [linux]$ cd ../../../gplCore/kernel-2.6.22
      4. make modules を実行します。    
        [kernel-2.6.22]$ make modules
        ~省略~
           Building modules, stage 2.
           MODPOST 15 modules
           CC      drivers/usb/serial/pl2303.mod.o
           LD [M]  drivers/usb/serial/pl2303.ko
           CC      drivers/usb/serial/usbserial.mod.o
           LD [M]  drivers/usb/serial/usbserial.ko
        [kernel-2.6.22]$
      5. LKMが作成されたか確認します。    
        [kernel-2.6.22]$ cd ../../image/kernel-2.6.22/linux/drivers/
        [drivers]$ find -name *.ko
        ./usb/serial/usbserial.ko
        ./usb/serial/pl2303.ko
        [drivers]$
    6. moduleをコピーします。    
      [axp-lkm-sdk.1.6.1]$ cp image/kernel-2.6.22/linux/drivers/usb/serial/usbserial.ko /opt/axp/apps/example/build/mymodule/.
      [axp-lkm-sdk.1.6.1]$ cp image/kernel-2.6.22/linux/drivers/usb/serial/pl2303.ko /opt/axp/apps/example/build/mymodule/.
    7. コンフィグレーションファイルの、@MODULESセクションに記載し、パッケージを作成します。      
      [~]$ cd /opt/axp/apps/example
      [example]$ cat > build/capabilities.cfg <
      @MODULES=
      /mymodule/usbserial.ko
      /mymodule/pl2303.ko
      EOT
      [example]$ pkg_build.sh --source-dir '/opt/axp/apps/example/build' \
      ~省略~
      --cap-config '/capabilities.cfg'

     

     

    USBシリアルポートの利用

    ここでは、USBシリアル変換機をAXPのUSBポートへ接続し、Cisco Siwtchに接続する手順を紹介します。

    今回、使用するUSBシリアル変換機は、Arvel SRC06-USM で、FTDIのシリアルチップを使用しています。そのため、当カーネルモジュールとしては試験中となっていますが、 他の場合でも、同様の手順を踏むことで、AXPゲストOSからUSBの使用ができますので、参考としてください。

    1. 追加のLKM作成を参考に、usbserial.ko, ftdi_sio.ko を用意し、build/mymodules にコピーします。
    2. ttyUSB0の作成と、LKMの指定をします。 
      [~]$ cd /opt/axp/apps/example
      [example]$ cat > build/capabilities.cfg <<EOT
      @DEVFS=
      /dev/ttyUSB0 c 188 0

      @MODULES=
      /mymodule/usbserial.ko
      /mymodule/ftdi_sio.ko
      EOT
      [example]$
    3. third_party_rpms_repository に、以下のRPMをコピーします。
      lockdev-1.0.1-10.i386.rpm
      uucp-1.07-12.i386.rpm
      module-init-tools-3.3-0.pre3.1.37.el5.i386.rpm
    4. パッケージを作成し、AXPにインストールします。 
      [example]$ pkg_build.sh --source-dir '/opt/axp/apps/example/build' \
      ~省略~
      --cap-config '/capabilities.cfg'
    5. 正しくロードされたか、show tech-supportで確認します。 
      AXP(exec-example)# show tech-support  | begin Capabilities
      ------------- Capabilities and Flags --------------

      UseCnt: 12
      Tasks:  4
      Flags:  00000014020f0210
      BCaps:  00000000354c65ff
      CCaps:  0000000000000101
      Spaces: 0c020200

      ------------------ Application Capabilities------------------
      Dev FS:
               /dev/ttyUSB0 c 188 0
      Kernel Module:
               /mymodules/usbserial.ko
               /mymodules/ftdi_sio.ko

      ------------------ example/techsupport ------------------

      AXP(exec-example)# con con
      bash-3.2# lsmod
      Module                  Size  Used by
      ftdi_sio               31624  0
      usbserial              28200  1 ftdi_sio

      bash-3.2#
    6. USBシリアルをAXPに接続し、CiscoのSwitchに接続します。
    7. Cisco Switchのコンソールに、AXPのゲストOSから接続します。 
      bash-3.2# cu -l /dev/ttyUSB0 -s 9600
      Connected.

      Switch>
      Switch>en
      Password:
      Switch#
      Switch#~.

      Disconnected.

      bash-3.2#