Archive for the ‘开发技术’ category

在VMware10中为Solaris11.1安装图形界面

8 5 月, 2014

在VMware10下通过官方提供的镜像安装Solaris11.1后为文本模式,本文将介绍如何在此基础上安装图形界面。

1.VMware启动Solaris11.1后,由于没有安装VMTools,系统界面不能随着虚拟机窗口大小自动调整,而且主机与客机之间的鼠标切换也需要每次通过Ctrl+Alt才能生效,这样操作十分不方便。不过由于Solaris11.1默认安装了SSH,因此可以在主机上通过secureCRT连接虚拟机;

2.安装图形界面需要下载官方提供的软件仓库镜像(Repository Image),再通过ftp传送至虚拟机;

3.在传送前,需要通过启动Solaris中的ftp服务;

svcadm enable ftp;

4.镜像文件分为a和b文件,将两个文件合而为一;

cat sol-11_1-repo-full.iso-a sol-11_1-repo-full.iso-b > sol-11_1-repo-full.iso

5.挂载镜像

lofiadm -a sol-11-1111-repo-full.iso
mount -F hsfs -o ro /dev/lofi/1 /mnt

6.将该镜像设置为本地的软件仓库

pkg set-publisher -Pe -O file:///mnt/repo/ solaris

7.安装桌面环境

pkg install solaris-desktop

8.重启即可

通过make编译多文件的内核模块

10 6 月, 2012

之前对make的使用都仅局限于单个文件,比如用make编译单个文件的内核模块。我试着将一个程序分解成多个文件,然后再通过make进行多文件的编译,途中还是遇到一些列问题,因此总结成下文。

1.文件清单

下面的文件清单类出的是一个内核模块程序,我们这里不去深究这个模块的功能。procfs_mod.c主要包含内核模块程序的主要框架,比如加载函数和卸载函数等;procfs.c包含主要的函数的实现;而procfs.h是整个程序所用到的头文件,包含函数以及变量的声明等。

edsionte@edsionte-desktop:~/proc_vfs$ ls
Makefile  procfs.c  procfs.h  procfs_mod.c

2.Makefile的组成

我们可以将Makefile看作是编译规则集合,它告诉make应该如何进行编译,最终生成目标文件。

edsionte@edsionte-desktop:~/proc_vfs$ cat Makefile
obj-m += myprocfs.o
myprocfs-objs := procfs.o procfs_mod.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

在这个Makefile中,obj-m说明最终生成的内核模块目标文件是myprofs.ko,并且它必须依赖两个文件procfs.c和procfs_mod.c。因此,通过模块名加-objs的形式可以定义整个模块所包含的文件。注意,这里定义的都是与原文件同名的目标文件。

3.头文件的引用

在本文所举例的源程序中,procfs.h包含了整个程序所需要的函数以及变量,也即是说所有.c的源程序都会引用该头文件。为了防止头文件被多次重复引用,我们应该在头文件中使用条件编译。

edsionte@edsionte-desktop:~/proc_vfs$ cat procfs.h
#ifndef _MY_PROC_FS_H
#define _MY_PROC_FS_H

#include 
…………
#endif

也就是将整个头文件的内容用头文件包围起来。上面的条件编译说明:如果没有定义符号常量_MY_PROC_FS_H,就定义该变量并且包含该头文件。

但是,即便我在头文件中使用了条件编译,在编译时还是出现了下面的错误:

edsionte@edsionte-desktop:~/proc_vfs$ make
make -C /lib/modules/2.6.32-24-generic/build M=/home/edsionte/proc_vfs modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-24-generic'
  CC [M]  /home/edsionte/proc_vfs/procfs.o
  CC [M]  /home/edsionte/proc_vfs/procfs_mod.o
  LD [M]  /home/edsionte/proc_vfs/myprocfs.o
/home/edsionte/proc_vfs/procfs_mod.o:(.bss+0x820): multiple definition of `my_proc_file'
/home/edsionte/proc_vfs/procfs.o:(.bss+0x820): first defined here
/home/edsionte/proc_vfs/procfs_mod.o:(.data+0x80): multiple definition of `my_inode_ops'
/home/edsionte/proc_vfs/procfs.o:(.data+0x80): first defined here
make[2]: *** [/home/edsionte/proc_vfs/myprocfs.o] 错误 1
make[1]: *** [_module_/home/edsionte/proc_vfs] 错误 2
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-24-generic'
make: *** [all] 错误 2

产生这种错误的原因是我之前一直在头文件对一些全局变量进行定义,这样导致进行了多次定义。正确的做法是在某一个.c中进行全局变量的定义,而在.h文件中使用extern进行外部即可。

Ubuntu下编译3.0.4内核

8 9 月, 2011

Linux内核3.0版本发布已有一段时间了,不知道这个版本号大跃进的内核是否好用。目前各个发行版的linux还仍未采用3.0的内核,因此可以自己动手编译内核来感受一下!趁着这次编译内核的机会可以再熟悉一下编译内核的步骤。

1.下载并解压内核到任意目录

从源码官网下载最新的内核源码3.0.4,可以解压至任意目录,我放在主目录下:

~$ tar xjvf linux-3.0.4.tar.bz2

2.配置内核

对内核进行配置是为了得到内核配置文件.config。通过对内核进行配置,可以使未来编译成功的内核增加或减少对一些内核特性的支持。对内核进行配置有多种方法,有基于文本的配置方式也有基于图形的用户界面。下面采用使用比较广泛的make menuconfig方式:

~/linux-3.0.4$sudo apt-get install libncurses5-dev
~/linux-3.0.4$sudo make menuconfig

由于该配置方式基于ncurses库,所以在启动配置界面前要先安装ncurses库。启动配置界面前,必须进入源码根目录,配置界面启动成功后如下图:

我们这里对内核按照默认的配置方式进行编译,因此当配置菜单启动后直接退出并保存即可。此时就在内核源码根目录下生成了.config文件。

3.编译

编译内核包含两部分的工作,其一是编译内核,即编译配置选项中标记为Y的那部分,这部分内核最终形成bzIamge镜像文件;其二是编译内核模块,即编译配置选项中标记为M的那部分内核,这部分形成以.ko结尾的内核模块目标文件。

上述两部分编译工作可以依次通过make bzImage和make modules完成,也可以通过一条make命令直接完成。编译内核的整个过程比较漫长,因此可以对make加-j参数来提高编译的效率。在make时使用该选项会为编译过程分配n个并发任务,这样可以缩短编译时间。n的取值为cpu个数的二倍。

~/linux-3.0.4$sudo make -j4

4.安装

安装过程分为两部分,首先对内核模块进行安装,这个过程会将刚刚编译内核模块时生成的内核模块复制到/lib/modules/3.0.4/目录下,其中3.0.4为对应的内核版本。使用的命令如下:

~/linux-3.0.4$sudo make modules_install

接着使用下述命令安装编译好的内核:

~/linux-3.0.4$sudo make install

安装内核的过程主要完成了以下的工作:

1.将编译内核时生成的内核镜像bzImage拷贝到/boot目录下,并将这个镜像命名为vmlinuz-3.0.4。如果使用x86的cpu,则该镜像位于arch/x86/boot/目录下(处于正在编译的内核源码下)。

2.将~/linux-3.0.4/目录下的System.map拷贝到/boot/目录下,重新命名为System.map-3.0.4。该文件中存放了内核的符号表。

3.将~/linux-3.0.4/目录下的.config拷贝到/boot/目录下,重新命名为config-3.0.4。

5.创建initrd.img文件

initrd.img即为初始化的ramdisk文件,它是一个镜像文件,将一些最基本的驱动程序和命令工具打包到镜像文件里。该镜像文件的作用是在系统还没有挂载根分区前,系统需要执行一些操作,比如挂载scsi驱动,此时将initrd文件释放到内存中,作为一个虚拟的根分区,然后执行相关脚本,运行insmod命令加载需要的模块。

具体的创建方法如下:

~/linux-3.0.4$sudo mkinitramfs 3.0.4 -o /boot/initrd.img-3.0.4

6.更新grub

最后一步则是更新grub启动菜单,使用下面的命令则可以自动更新启动菜单:

sudo update-grub2

这样会将刚才编译好的内核放在启动菜单的首位,如果需要修改启动菜单中默认系统的启动顺序,则修改/boot/grub/grub.cfg文件中的set default=的值即可。

OK,内核编译完毕。

删除ubuntu冗余的开机启动菜单

27 8 月, 2011

相信很多ubuntu的使用者对10.04情有独钟,因为该版本是一个长期支持版(Long-Term Support,LTS)。不过随着系统的更新,开机启动菜单会出现多个内核版本,这样看起来很不清爽而且还占用磁盘空间。本文将描述如何清理这些冗余的内核版本。

删除系统内多余的内核

1.查看当前系统中的内核

我们先查看当前系统中存在那些内核版本。使用如下命令即可查询:

edsionte@edsionte-desktop:~/桌面$ dpkg --get-selections | grep "linux-image"
linux-image-2.6.32-21-generic			install
linux-image-2.6.32-32-generic			install
linux-image-2.6.32-33-generic			install
linux-image-generic				install

dpkg是Debian Linux的软件包管理系统,选项–get-selections即得到匹配包的状态,包的匹配可以由gerp来完成。关于dpkg的更多内容本文稍候将详细说明。

2.查看当前系统的版本

删除其他多余内核版本时,先查看当前系统的版本号以免误删系统。使用uname命令即可查看。

edsionte@edsionte-desktop:~/桌面$ uname -r
2.6.32-33-generic

3.删除冗余的内核版本

当前的内核版本是2.6.32-33,我们删除其他的内核版本即可,使用apt-get remove命令即可。

edsionte@edsionte-desktop:~/桌面$ sudo apt-get remove linux-image-2.6.32-21-generic linux-image-2.6.32-32-generic

然后再使用apt-get autoremove命令可以自动删除/usr/src下的源码头文件目录。重新系统后,可以看到在启动菜单中只剩一个内核版本了。

ubuntu软件包管理器

在上述清楚内核版本的过程中,我们用到了dpkg和apt-get两个包管理工具,这两个软件包管理工具有什么区别呢?

我们常用的apt-get是一个命令式的软件包管理器,该管理器从网络上下载所需软件包,并且解决软件包之间的依赖关系。比如,我们要下载安装软件包A,如果A软件包需要B软件包的支持,那么apt-get install的时候也会同时下载并安装B软件包。

而dkpg(Debian PacKaGe)则是一个底层的软件包管理器,它只用来管理本地的软件包。比如使用dpkg -i yourpkg.deb即可在本地安装软件。

关于这两个包管理器的使用方法可参见这里

使用gcc同时编译多个文件

28 7 月, 2011

平时在写C程序的时候都是将所有代码全部写入一个.c文件中,这样写对小程序来说是适合的。但是对于比较大的项目,将所有代码写在一个文件不利于代码的维护。

最近由于项目需求,将一个服务器程序按照功能整理成了几个.c文件和.h文件。该服务器程序包含以下文件:

.
|-- config_system.c
|-- generic_function.c
|-- log_system.c
|-- server.c
`-- server.h

代码整理完毕之后,开始对源文件进行重新编译。在编译的过程中遇到了一些问题,现在总结如下。

1. 自定义头文件的使用

server.h文件包含服务器程序中所有自定义函数原型的声明和一些常量定义,将该自定义函数放在当前程序的目录下即可。自定义头文件的使用方法就和普通头文件的使用方法一样,加在程序最开始的位置即可,不过要将包含头文件的尖括号<>改成双引号“ ”。

通过这个实践,也可以更好的理解包含头文件的两种方法。对于尖括号包含的头文件,gcc在系统默认的目录中(/usr/include)查找相应的头文件;对于双引号包含的头文件,编译器首先会在当前目录下或指定的目录下(如果有指定)去查找头文件,如果当前目录下没有该头文件则去默认的头文件目录下查找。

刚才我们提到了头文件的指定目录,在大型项目中,头文件可能会更多,往往将头文件单独放在一个目录当中,此时应该使用-Idirname选项来告诉编译器到指定的目录dirname中去查找头文件。比如我们将server.h放在head目录中再进行编译:

gcc -Ihead config_system.c server.c log_system.c generic_function.c -o server

选项I代表include,该选项的作用阶段是预处理阶段。

2. 多个源文件的编译

我们可以先将每个源文件编译成目标文件,最后再生成一个可执行文件。比如:

edsionte@edsionte-desktop:~/server$ gcc -c server.c
edsionte@edsionte-desktop:~/server$ gcc -c config_system.c
edsionte@edsionte-desktop:~/server$ gcc -c log_system.c
edsionte@edsionte-desktop:~/server$ gcc -c generic_function.c
edsionte@edsionte-desktop:~/server$ gcc server.o config_system.o log_system.o generic_function.o -o server

也可以直接使用 一条命令:

edsionte@edsionte-desktop:~/server$ gcc server.c generic_function.c log_system.c config_system.c -o server

不管是那种方法都可以编译源文件,最后连接成可执行文件。在第一种方法中,单独使用-c选项只是编译源文件,并不涉及链接的过程,因此源文件是否包含main函数我们并不关心。第二种方法是将编译链接通过一条命令来完成。

其实在使用gcc编译程序时,整个编译过程分为预编译、编译、汇编和链接四个步骤。上述两种方法都自动完成了前两个步骤。

3. extern的使用

按照上面的命令进行编译程序,出现了下面的错误提示:

config_system.c:80: error: ‘config_filename’ undeclared (first use in this function)

这条错误是在说明config_filename这个变量未声明。config_filename作为一个全局变量在generic_function.c文件中已经声明并定义过,那么如何让编译器知道该变量已经定义过并且可以在config_system.c文件中使用?此时extern关键字就派上了用场。

extern的作用是声明一个变量,它的作用仅仅是声明,而不是像定义该变量时那样为其分配内存空间。一个变量在整个程序中只能定义一次,但是却可以声明多次。

4. 使用脚本编译并运行服务器程序

由于将代码按照功能分离后,每次编译都需要很长一串的命令,因此写个脚本就显得很有必要了。下面的脚本先将原有的可执行文件(如果存在的话)删除,再编译程序,最后运行可执行文件。

#!/bin/bash
test server && rm server
gcc server.c config_system.c log_system.c generic_function.c -o server
echo "compliing success!"
echo "sever is running.."
./server

通过这次“分离”代码的实践,给我最大的感受就是平时看似懂的概念只有到真正使用的时候才真的开始理解。

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key