当前位置:  操作系统/服务器>linux
本页文章导读:
    ▪Openstack Folsom + Quantum + Openvswitch 双网卡成功安装指南       Openstack Folsom 发布好久了,但由于新的组件Quantum的加入,以及知识的跨度,比如同时需要系统管理及网络工程方面的知识,所以Folsom的安装还是挺费事的。经过几天的测试,参考各种文档.........
    ▪Linux 系统内核的调试-kgdb      转自:http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html调试是软件开发过程中一个必不可少的环节,在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题。但是,Linux 系统的开发者.........
    ▪arm-linux-ld 命令详解      本文转自《S3C2410完全开发手册》在开始后续实验之前,我们得了解一下arm-linux-ld连接命令的使用。在上述实验中,我们一直使用类似如下的命令进行连接:arm-linux-ld -Ttext 0x00000000 crt0.o led_on_c..........

[1]Openstack Folsom + Quantum + Openvswitch 双网卡成功安装指南
    来源:    发布时间: 2013-10-22
 
Openstack Folsom 发布好久了,但由于新的组件Quantum的加入,以及知识的跨度,比如同时需要系统管理及网络工程方面的知识,所以Folsom的安装还是挺费事的。
经过几天的测试,参考各种文档,终于完成了Folsom基于双网卡的安装,总结至此。
本文HTML版本见:https://github.com/888888/OpenStack-Folsom-Install-guide/blob/GRE/2NICs/OpenStack_Folsom_Install_Guide_WebVersion.rst
 
1. 需求说明
====================
 
:节点名称: NICs
:控制节点: eth0 (100.10.10.51), eth1 (192.168.100.51)
:网络节点: eth0 (100.10.10.52), eth2 (0.0.0.0)
:计算节点: eth0 (100.10.10.53)
 
**备注 1: ** 本文为双网卡安装Folsom设计,根据官方说明,网络节点最好采用三块网卡控制节点可以和计算节点合二为一.
 
**备注 2:** 本文安装指南环境为实现Folsom功能评估,力求简单方便,安全性差,不可用于生产环境。
 
**备注 3: ** 本文不适用于虚拟机环境.请使用物理计算机安装.
 
.. image:: http://i.imgur.com/4D51h.jpg
 
2. 控制节点
===============
 
2.1. 准备系统
-----------------
* 安装系统注意事项::
 
    - ubuntu-12.10-server-amd64.iso
    - 为Cinder服务预留独立分区 例如: /dev/sda5
    - 提前定义好各服务器主机名及IP,尽量别改,一定要改,请修改/etc/hosts中的对应关系
 
* 以下所有命令均在root权限下完成,所以在装好ubuntu后,请切换到root::
 
   sudo passwd
   su
 
* 更新系统(依据笔者经验,安装完Folsom环境后最好别再使用dist-upgrade,以免产生些许小问题,如虚拟机获得不了ip等..)::
 
   apt-get update
   apt-get upgrade
   apt-get dist-upgrade
   
* 因为要更新和下载的软件比较多,可以在空闲时间一次更新系统并提前安装所需要软件,以后只需要配置就行了:
  也可以使用squid代理,这样,其它几台机器不用连外网更新软件了
   
   apt-get update && apt-get dist-upgrade -y && apt-get update -y && apt-get dist-upgrade -y && apt-get install -y rabbitmq-server ntp vlan bridge-utils keystone curl openssl glance quantum-server quantum-plugin-openvswitch nova-api nova-cert novnc nova-consoleauth nova-scheduler nova-novncproxy cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms openstack-dashboard memcached python-mysqldb mysql-server 
 
2.2.配置网卡
------------
 
* 主控应该有一个外网网卡::
 
   #访问Openstack API 
   auto eth1
   iface eth1 inet static
   address 192.168.100.51
   netmask 255.255.255.0
   gateway 192.168.100.1
   dns-nameservers 8.8.8.8
 
   #管理网络和虚拟机网络合二为一
   auto eth0
   iface eth0 inet static
   address 100.10.10.51
   netmask 255.255.255.0
 
* 重启网络服务::
   
   service networking restart
 
2.3. MySQL & RabbitMQ
------------
 
* 安装 MySQL 和 RabbitMQ::
 
   apt-get install mysql-server python-mysqldb rabbitmq-server 
 
* 配置Mysql监听所有地址::
 
   sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
   service mysql restart
 
* 为了简化安装,以后所有连接mysql服务均使用 root:password登录,将root权限更改为所有主机可以访问(默认只能本机访问)
 
   mysql -uroot -ppassword
   use mysql;
   update user set host='%' where user='root' and host='localhost';
   flush privileges;
 
* 创建所有必须的数据库::
  
   create database keystone;
   create database nova;
   create database glance;
   create database cinder;
   create database quantum;
   
2.4. 节点时间同步
------------------
 
* 安装时间服务器,其它节点时间同此服务器同步::
 
   apt-get install ntp
   sed -i 's/server ntp.ubuntu.com/server ntp.ubuntu.comserver 127.127.1.0fudge 127.127.1.0 stratum 10/g' /etc/ntp.conf
   service ntp restart  
 
2.5. Others
-------------------
* 安装其它服务::
 
   apt-get install vlan bridge-utils
 
* 允许IP转发::
 
   vi /etc/sysctl.conf
 
   net.ipv4.conf.all.rp_filter = 0
   net.ipv4.conf.default.rp_filter = 0 
   sysctl net.ipv4.ip_forward=1
   
   # 检查一下
   sysctl -p 
 
2.6. Keystone
-------------------
 
 
* 安装组件::
 
   apt-get install keystone
 
 
* 编辑 /etc/keystone/keystone.conf 数据库连接::
 
   connection = mysql://root:password@100.10.10.51/keystone
 
* 重启keystone并初始化数据库::
 
   service keystone restart
   keystone-manage db_sync
 
* 使用 `自动化脚本 <https://github.com/888888/OpenStack-Folsom-Install-guide/tree/GRE/2NICs/Keystone_Scripts>`_ 创建keystone用户、服务、服务端点。为了简化,这里只创建admin一个用户,请不要修改此用户密码。 
 
    bash keystone_basic.sh
    执行一次,否则会创建多个service
    bash keystone_endpoints_basic.sh
 
* 创建/root/novarc文件,写入以下内容::
 
    export OS_TENANT_NAME=admin
    export OS_TENANT_ID=c7fb80d964a24ab1bc0fd370696c804e
    export OS_USERNAME=admin
    export OS_PASSWORD=password
    export OS_AUTH_URL="http://127.0.0.1:35357/v2.0"
    export OS_REGION_NAME=RegionOne
    export OS_IDENTITY_API_VERSION=2.0
    export SERVICE_TOKEN=ADMIN
    export SERVICE_ENDPOINT="http://127.0.0.1:35357/v2.0"
    
    各项值请根据实际情况替换
    keystone tenant-list
    将获取的tenant_id替换到novarc
    
    source /root/novarc
    echo "source /root/novarc" >> ~/.bashrc
 
 
2.7. Glance
-------------------
* 安装组件
 
    apt-get install glance
 
* 分别修改 /etc/glance/glance-api-paste.ini 和/etc/glance/glance-registry-paste.ini::
 
   [filter:authtoken]
   paste.filter_factory = keystone.middleware.auth_token:filter_factory
   auth_host = 100.10.10.51
   auth_port = 35357
   auth_protocol = http
   admin_tenant_name = admin
   admin_user = admin
   admin_password = password
 
* 分别修改 /etc/glance/glance-api.conf 和/etc/glance/glance-registry.conf ::
 
   sql_connection = mysql://root:password@100.10.10.51/glance
 
   [paste_deploy]
   flavor = keystone
 
 
* 重启glance服务并同步glance数据库::
 
   service glance-api restart; service glance-registry restart
 
   glance-manage db_sync
   
* 测试glance 服务,不输出任何结果代表成功::
 
    glance index
    
* 上传个镜像::
 
   wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img

    
[2]Linux 系统内核的调试-kgdb
    来源:    发布时间: 2013-10-22

转自:http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html

调试是软件开发过程中一个必不可少的环节,在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题。但是,Linux 系统的开发者出于保证内核代码正确性的考虑,不愿意在 Linux 内核源代码树中加入一个调试器。他们认为内核中的调试器会误导开发者,从而引入不良的修正[1]。所以对 Linux 内核进行调试一直是个令内核程序员感到棘手的问题,调试工作的艰苦性是内核级的开发区别于用户级开发的一个显著特点。

尽管缺乏一种内置的调试内核的有效方法,但是 Linux 系统在内核发展的过程中也逐渐形成了一些监视内核代码和错误跟踪的技术。同时,许多的补丁程序应运而生,它们为标准内核附加了内核调试的支持。尽管这些补 丁有些并不被 Linux 官方组织认可,但他们确实功能完善,十分强大。调试内核问题时,利用这些工具与方法跟踪内核执行情况,并查看其内存和数据结构将是非常有用的。

本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同,然后重点介绍三种 Linux 内核的源代码级的调试方法。

1. Linux 系统内核级软件的调试技术

printk() 是调试内核代码时最常用的一种技术。在内核代码中的特定位置加入printk() 调试调用,可以直接把所关心的信息打打印到屏幕上,从而可以观察程序的执行路径和所关心的变量、指针等信息。 Linux 内核调试器(Linux kernel debugger,kdb)是 Linux 内核的补丁,它提供了一种在系统能运行时对内核内存和数据结构进行检查的办法。Oops、KDB在文章掌握 Linux 调试技术有详细介绍,大家可以参考。 Kprobes 提供了一个强行进入任何内核例程,并从中断处理器无干扰地收集信息的接口。使用 Kprobes 可以轻松地收集处理器寄存器和全局数据结构等调试信息,而无需对Linux内核频繁编译和启动,具体使用方法,请参考使用 Kprobes 调试内核。

以上介绍了进行Linux内核调试和跟踪时的常用技术和方法。当然,内核调试与跟踪的方法还不止以上提到的这些。这些调试技术的一个共同的特 点在于,他们都不能提供源代码级的有效的内核调试手段,有些只能称之为错误跟踪技术,因此这些方法都只能提供有限的调试能力。下面将介绍三种实用的源代码 级的内核调试方法。

回页首

2. 使用KGDB构建Linux内核调试环境

kgdb提供了一种使用 gdb调试 Linux 内核的机制。使用KGDB可以象调试普通的应用程序那样,在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。使用KGDB调试时需要两台机器, 一台作为开发机(Development Machine),另一台作为目标机(Target Machine),两台机器之间通过串口或者以太网口相连。串口连接线是一根RS-232接口的电缆,在其内部两端的第2脚(TXD)与第3脚(RXD) 交叉相连,第7脚(接地脚)直接相连。调试过程中,被调试的内核运行在目标机上,gdb调试器运行在开发机上。

目前,kgdb发布支持i386、x86_64、32-bit PPC、SPARC等几种体系结构的调试器。有关kgdb补丁的下载地址见参考资料[4]。

2.1 kgdb的调试原理

安装kgdb调试环境需要为Linux内核应用kgdb补丁,补丁实现的gdb远程调试所需要的功能包括命令处理、陷阱处理及串口通讯3个主 要的部分。kgdb补丁的主要作用是在Linux内核中添加了一个调试Stub。调试Stub是Linux内核中的一小段代码,提供了运行gdb的开发机 和所调试内核之间的一个媒介。gdb和调试stub之间通过gdb串行协议进行通讯。gdb串行协议是一种基于消息的ASCII码协议,包含了各种调试命 令。当设置断点时,kgdb负责在设置断点的指令前增加一条trap指令,当执行到断点时控制权就转移到调试stub中去。此时,调试stub的任务就是 使用远程串行通信协议将当前环境传送给gdb,然后从gdb处接受命令。gdb命令告诉stub下一步该做什么,当stub收到继续执行的命令时,将恢复 程序的运行环境,把对CPU的控制权重新交还给内核。


2.2 Kgdb的安装与设置

下面我们将以Linux 2.6.7内核为例详细介绍kgdb调试环境的建立过程。

2.2.1软硬件准备

以下软硬件配置取自笔者进行试验的系统配置情况:


kgdb补丁的版本遵循如下命名模式:Linux-A-kgdb-B,其中A表示Linux的内核版本号,B为kgdb的版本号。以试验使用的kgdb补丁为例,linux内核的版本为linux-2.6.7,补丁版本为kgdb-2.2。

物理连接好串口线后,使用以下命令来测试两台机器之间串口连接情况,stty命令可以对串口参数进行设置:

在development机上执行:

 

stty ispeed 115200 ospeed 115200 -F /dev/ttyS0

 

在target机上执行:

 

stty ispeed 115200 ospeed 115200 -F /dev/ttyS0

 

在developement机上执行:

 

echo hello > /dev/ttyS0

 

在target机上执行:

 

cat /dev/ttyS0

 

如果串口连接没问题的话在将在target机的屏幕上显示"hello"。

2.2.2 安装与配置

下面我们需要应用kgdb补丁到Linux内核,设置内核选项并编译内核。这方面的资料相对较少,笔者这里给出详细的介绍。下面的工作在开发机(developement)上进行,以上面介绍的试验环境为例,某些具体步骤在实际的环境中可能要做适当的改动:

I、内核的配置与编译

 

[root@lisl tmp]# tar -jxvf linux-2.6.7.tar.bz2
[root@lisl tmp]#tar -jxvf linux-2.6.7-kgdb-2.2.tar.tar
[root@lisl tmp]#cd inux-2.6.7

 

请参照目录补丁包中文件README给出的说明,执行对应体系结构的补丁程序。由于试验在i386体系结构上完成,所以只需要安装一下补 丁:core-lite.patch、i386-lite.patch、8250.patch、eth.patch、core.patch、 i386.patch。应用补丁文件时,请遵循kgdb软件包内series文件所指定的顺序,否则可能会带来预想不到的问题。eth.patch文件是 选择以太网口作为调试的连接端口时需要运用的补丁

应用补丁的命令如下所示:

 

[root@lisl tmp]#patch -p1 <../linux-2.6.7-kgdb-2.2/core-lite.patch

 

如果内核正确,那么应用补丁时应该不会出现任何问题(不会产生*.rej文件)。为Linux内核添加了补丁之后,需要进行内核的配置。内核的配置可以按照你的习惯选择配置Linux内核的任意一种方式。

 

[root@lisl tmp]#make menuconfig

 

在内核配置菜单的Kernel hacking选项中选择kgdb调试项,例如:

 

[*] KGDB: kernel debugging with remote gdb
Method for KGDB communication (KGDB: On generic serial port (8250)) --->
[*] KGDB: Thread analysis
[*] KGDB: Console messages through gdb
[root@lisl tmp]#make

 

编译内核之前请注意Linux目录下Makefile中的优化选项,默认的Linux内核的编译都以-O2的优化级别进行。在这个优化级别之 下,编译器要对内核中的某些代码的执行顺序进行改动,所以在调试时会出现程序运行与代码顺序不一致的情况。可以把Makefile中的-O2选项改为 -O,但不可去掉-O,否则编译会出问题。为了使编译后的内核带有调试信息,注意在编译内核的时候需要加上-g选项。

不过,当选择"Kernel debugg

    
[3]arm-linux-ld 命令详解
    来源:    发布时间: 2013-10-22

本文转自《S3C2410完全开发手册》

在开始后续实验之前,我们得了解一下arm-linux-ld连接命令的使用。在上述实验中,我们一直使用类似如下的命令进行连接:

arm-linux-ld -Ttext 0x00000000 crt0.o led_on_c.o -o led_on_c_tmp.o

我们看看它是什么意思:

-o选项设置输出文件的名字为led_on_c_tmp.o;

“--Ttext 0x00000000”设置代码段的起始地址为0x00000000;

这条指令的作用就是将crt0.o和led_on_c.o连接成led_on_c_mp.o可执行文件,此可执行文件的代码段起始地址为0x00000000(即从这里开始执行)。

我们感兴趣的就是“—Ttext”选项!进入LINK目录,link.s代码如下:

1         .text

2 .global_start

3  _start:

4          b step1

5  step1:

6          ldr pc,=step2

7  step2:

8          b step2





Makefile 如下:

1  link:link.s

2      arm-linux-gcc –c -o link.o link.s

3      arm-linux-ld -Ttext 0x00000000 link.o -o link_tmp.o

4      #arm-linux-ld -Ttext 0x30000000 link.o -o link_tmp.o

5      arm-linux-objcopy -O binary-S link_tmp.o link

6      arm-linux-objdump –D -b binary -m arm link>ttt.s

7      #arm-linux-objdump –D -b binary -m arm link>ttt2.s

8  clean:

9      rm -f link

10     rm -f link.o

11     rm -f link_tmp.o


实验步骤:

1.进入目录LINK,运行make生成arm-linux-ld选项为“-Ttext 0x00000000”的反汇编码ttt.s

2.make clean

3.修改Makefile:将第4、7行的“#”去掉,在第3、6行前加上“#”

4.运行make生成arm-linux-ld选项为“-Ttext 0x30000000”的反汇编码ttt2.s


link.s程序中用到两种跳转方法:b跳转指令、直接向pc寄存器赋值。

我们先把在不同“—Ttext”选项下,生成的可执行文件的反汇编码列出来,再详细分析这两种不同指令带来的差异。

ttt.s:ttt2.s



6    00000000 <.data>:                                    |  6    00000000 <.data>:
7    0:   eaffffff    b   0x4                              |  7    0:   eaffffff    b   0x4
8    4:   e59ff000    ldr pc, [pc, #0]    ; 0xc       |  8    4:   e59ff000    ldr pc, [pc, #0]    ; 0xc
9    8:   eafffffe    b   0x8                              |  9    8:   eafffffe    b   0x8
10    c:   30000008    andcc   r0, r0, r8              | 10    c:   00000008    andeq   r0, r0, r8

先看看b跳转指令:它是个相对跳转指令,其机器码格式如下:

[31:28]位是条件码;[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示偏移地址。

使用B或BL跳转时,下一条指令的地址是这样计算的:

将指令中24位带符号的补码立即数扩展为32(扩展其符号位);将此32位数左移两位;将得到的值加到pc寄存器中,即得到跳转的目标地址。

我们看看第一条指令“b step1”的机器码eaffffff:

1.24位带符号的补码为0xffffff,将它扩展为32得到:0xffffffff

2.将此32位数左移两位得到:0xfffffffc,其值就是-4

3.pc的值是当前指令的下两条指令的地址,加上步骤2得到的-4,这恰好是第二条指令step1的地址。各位不要被被反汇编代码中的“b 0x4”给迷惑了,它可不是说跳到绝对地址0x4处执行,绝对地址得像上述3个步骤那样计算。您可以看到b跳转指令是依赖于当前pc寄存器的值的,这个特 性使得使用b指令的程序不依赖于代码存储的位置——即不管我们连接命令中“--Ttext”为何,都可正确运行。

//一堆废话


再看看第二条指令ldr pc,=step2:从反汇编码“ldr pc,[pc,#0]”可以看出,这条指令从内存中某个位置读出数据,并赋给pc寄存器。这个位置的地址是当前pc寄存器的值加上偏移值0,其中存放的值依赖于连接命令中的“--Ttext”选项。

执行这条指令后,对于ttt.s,pc=0x00000008;对于ttt2.s,pc=0x30000008。于是执行第三条指令“b step2”时,它的绝对地址就不同了:对于ttt.s,绝对地址为0x00000008;对于ttt.s,绝对地址为0x30000008。

ttt2.s上电后存放的位置也是0,但是它连接的地址是0x30000000。

我们以后会经常用到“存储地址和连接地址不同”(术语上称为加载时域和运行时域)的特性:

大多机器上电时是从地址0开始运行的,但是从地址0运行程序在性能方面总有很多限制,所以一般在开始的时候,使用与位置无关的指令将程序本身复制到它的连接地址处,然后使用向pc寄存器赋值的方法跳到连接地址开始的内存上去执行剩下的代码。

arm-linux-ld命令中选项“-Ttext”也可以使用选项“-Tfilexxx”来代替,在文件filexxx中,我们可以写出更复杂的参数来使用arm-linux-ld命令

 

 

/××××××××××××××××××××××××××××××××××××××××××××这是分割线××××××××××××××××××××××××××××××××××××××/

 

以下转自:http://www.tudou.com/home/diary_v3904315.html

-T选项是ld命令中比较重要的一个选项,可以用它直接指明代码的代码段、数据段、博士生、

  段,对于复杂的连接,可以专门写一个脚本来告诉编译器如何连接。

  -Ttext addr

  -Tdata addr

  -Tbss addr

  arm-elf-ld -Ttext 0x00000000 -g led_On.o -o led_on_elf ,运行地址为0x00000000,由于没有data和bss,他们会默认的依次放在后面。相同的代码 不同的Ttext,你可以对比一下他们之间会变的差异,ld会自动调整跳转的地址。

  *简单的Linker script

  (1) SECTIONS命令:

  The SECTIONS command tells the linker how to map input sections into output sections, and how to place the output sections in memory.

  命令格式如下:

  SECTIONS

  {

  sections-command

  sections-command

  ......

  }

  其中sections-command可以是ENTRY命令,符号赋值,输出段描述,也可以是overlay描述。

  (2) 地址计数器‘.’(location counter):

  该符号只能用于SECTIONS命令内部,初始值为‘0’,可以对该符号进行赋值,也可以使用该符号进行计算或赋值给其他符号。它会自动根据SECTIONS命令内部所描述的输出段的大小来计算当前的地址。

  (3) 输出段描述(output section description):

  前面提到在SECTIONS命令中可以作输出段描述,描述的格式如下:

  section [address] [(type)] : [AT(lma)]

  {

  output-section-command

  output-section-command

  ...

  } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]

  很多附加选项是用不到的。其中的output-section-command又可以是符号赋值,输入段描述,要直接包含的数据值,或者某一特定的输出段关键字。

  *linker script 实例

  ==============================

  OUTPU

    
最新技术文章:
▪linux系统中的列出敏感用户的脚本代码
▪a10 config backup for aXAPI
▪一键备份gitolite服务器的Shell脚本
▪nagios 分发文件实现代码
▪阿里云云服务器Linux系统更新yum源Shell脚本
▪一个监控LINUX目录和文件变化的Shell脚本分享
▪Linux下实现SSH免密码登录和实现秘钥的管理、...
▪Shell正则表达式之grep、sed、awk实操笔记
▪3个备份系统文件并邮件发送的Shell脚本分享
▪CentOS 6.3下给PHP添加mssql扩展模块教程
▪监控网站是否可以正常打开的Shell脚本分享
▪shell脚本编程之if语句学习笔记
▪shell脚本编程之循环语句学习笔记
▪shell脚本编程之case语句学习笔记
▪Shell脚本实现的阳历转农历代码分享
▪Shell脚本实现复制文件到多台服务器的代码分...
▪Shell脚本实现批量下载网络图片代码分享
▪Shell脚本实现检测文件是否被修改过代码分享
▪Shell脚本数组用法小结
▪Shell脚本批量重命名文件后缀的3种实现
▪C语言实现的ls命令源码分享
▪Linux下查找后门程序 CentOS 查后门程序的shell脚...
▪Shell 函数参数
▪linux shell 自定义函数方法(定义、返回值、变...
▪Shell实现判断进程是否存在并重新启动脚本分...
▪Shell脚本break和continue命令简明教程
▪Shell脚本函数定义和函数参数
▪让代码整洁、过程清晰的BASH Shell编程技巧
▪shell常用重定向实例讲解
▪awk中RS、ORS、FS、OFS的区别和联系小结
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3