LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: weixiao

RH7.3最终汉化实例与RedHat软件设置

[复制链接]
发表于 2007-1-16 19:35:45 | 显示全部楼层

=== RedHat 7.3系统下 测试是否可以编译内核 ===

转换至root权限
$ su -
Password: ***********
#

1. 安装 RH7.3 内核源码包(第二张安装光盘)
内核源码包不只是包括程式代码,还有许多与系统相关的文档。除了编译内核 方便查阅资料也是好主意。

# rpm -ivh /mnt/cdrom/RedHat/RPMS/kernel-source-2.4.18-3.i386.rpm --test
# rpm -ivh /mnt/cdrom/RedHat/RPMS/kernel-source-2.4.18-3.i386.rpm

> 以下是源码树已经安装,需要重新安装内核源码包的情况,保证源码树一定干净(‘懒人’操作)
# rpm -ivh --replacepkgs /mnt/cdrom/RedHat/RPMS/kernel-source-2.4.18-3.i386.rpm --test
# rpm -ivh --replacepkgs /mnt/cdrom/RedHat/RPMS/kernel-source-2.4.18-3.i386.rpm

注: 不是系统默认安装的套件,在享受系统提供的升级服务时,提议先删除后升级。

2. 测试是否符合 编译内核
内核源码树默认安装到 /usr/src/目录,如 /usr/src/linux-2.4.18-3 。源码树scripts目录下ver_linux脚本,作用是验证‘编译和运行内核’系统是否配备相关版本的工具。

# chmod +x /usr/src/linux-2.4.18-3/scripts/ver_linux

执行脚本:
# /usr/src/linux-2.4.18-3/scripts/ver_linux
---------------------
If some fields are empty or look unusual you may have an old version.
Compare to the current minimal requirements in Documentation/Changes.
[大概意思:如果一些字段是空或看起来不正常,那么你拥有一个旧版本。你必须与源码树/Documentation/Changes文件中当前最少要求作比较,选择从文件中提供下载站点更新工具。]

Linux wei 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown

Gnu C 2.96
Gnu make 3.79.1
util-linux 2.11n
mount 2.11n
modutils 2.4.14
e2fsprogs 1.27
reiserfsprogs 3.x.0j
PPP 2.4.1
isdn4k-utils 3.1pre1
Linux C Library 2.2.5
Dynamic linker (ldd) 2.2.5
Procps 2.0.7
Net-tools 1.60
Console-tools 0.3.3
Sh-utils 2.0.11
Modules Loaded nls_iso8859-1 es1371 ac97_codec gameport soundcore binfmt_misc autofs ide-cd cdrom vmhgfs vmxnet usb-uhci usbcore ext3 jbd BusLogic sd_mod scsi_mod
---------------------

注:通常,内核属于系统套件安装,ver_linux脚本测试提示符合要求(如上)。ver_linux脚本对经常编译新版本内核十分适用。

3. 尝试编译内核
在 X 下图形界面操作(make xconfig) ,或者 采用文本界面(make menuconfig)

# make xconfig
make: *** No rule to make target `menuconfig'. Stop.
注:错误提示是指没有在源码树下操作

正确:
# cd /usr/src/linux-2.4.18-3/
# make mrproper (由于源码树是干净,这步骤可以省略)
# make xconfig

Linux Kernel Configuration界面有许多选项,现在关键以下四个选项:
Save and Exit | 保存设置内容,并离开此窗口(进行下一步编译操作的必选项)
Quit Without Saving | 不保存设置内容,并离开此窗口
Load Configuration from File | 加载 配置文件
Store Configuration to File | 将目前的设置保存为 配置文件

目的是测试编译环境:点选‘Quit Without Saving’==> ‘Changes will be lost. Are you sure?’,‘OK’。

注: 在同一源码树编译多个内核,需要修改Makefile的 EXTRAVERSION 变量,例如

EXTRAVERSION = -3custom 修改成 EXTRAVERSION = "-3custom.$(date +%D | sed -e 's/\//-/g')"

EXTRAVERSION = -3custom 是直接防止编译与现在使用的内核在同一源码树,安装模块时覆盖原目录(/lib/modules/2.4.18-3)的情况。date +%D 是在这基础上添加‘年月日’标志,区分/lib/modules下的模块目录。

---------
------
回复 支持 反对

使用道具 举报

发表于 2007-1-16 19:44:18 | 显示全部楼层

== 比较 带有内核调试功能的RH内核(kernel-debug) 与 默认安装的内核 差别 ==

------------

翻阅内核配置资料,其中介绍由于影响性能不提倡配置“Kernel hacking”选项。但 RH 配置内核时选择“Kernel hacking”选项,裁减部分功能选项,只兼容开发工具的应用(相信经过测试)。另外,相应配置了一个专为“内核调试”的内核(kernel-debug)。

前提:有安装内核源码包(kernel-source)。对RH内核好奇,不是搞‘调试’。

选择的两个配置文件
kernel-2.4.18-i686-debug.config属于kernel-debug-2.4.18-3.i686.rpm中带内核调试功能的RH内核的配置文件。kernel-2.4.18-i686.config属于kernel-2.4.18-3.i686.rpm中内核(默认安装)的配置文件。

生成 作比较文件
$ diff /usr/src/linux-2.4.18-3/configs/kernel-2.4.18-i686-debug.config /usr/src/linux-2.4.18-3/configs/kernel-2.4.18-i686.config > /tmp/diff-config

简述diff命令
[ 注 diff命令的结果输出中字母a、b和c分别表示附加、删除和修改。字母前的行号是针对kernel-2.4.18-i686-debug.config,字母后的行号是针对kernel-2.4.18-i686.config ]
[ 注 以上表示形式的每一行紧跟着受到影响的若干行。‘< ’开头的行属于第一个文件(kernel-2.4.18-i686-debug.config),‘> ’开头的行属于第二个文件(kernel-2.4.18-i686.config) ]

$ more /tmp/diff-config
---------------------------------------
552c552 |修改操作
< # CONFIG_EWRK3 is not set | debug内核关闭CONFIG_EWRK3选项
---
> CONFIG_EWRK3=m |i686内核有设置。是‘Ethernet (10 or 100Mbit)’配置选项,属于EtherWORKS 3 (DE203, DE204, DE205) 网卡的驱动模块。网卡使用DEC的私有芯片

1239c1239
< CONFIG_REISERFS_CHECK=y | debug内核启用针对Reiserfs文件系统的一致性检测功能,方便调试工作。‘File systems’的配置选项
---
> # CONFIG_REISERFS_CHECK is not set

1699c1699
< CONFIG_X86_PGE=y | debug内核启用 微处理器PGE特性 的扩展功能(不包括 Cyrix/Transmeta),PGE理解成‘整体页面启用’。‘Kernel hacking’的配置选项
---
> # CONFIG_X86_PGE is not set

1717,1719c1717,1719
< CONFIG_MXT=y |debug内核支持MXT(内存扩展技术)。以下内容都属于‘Kernel hacking’的配置选项内容
< CONFIG_X86_UP_APIC=y |debug内核启用 多CPU的本地APIC功能。本地APIC(高级可编程的中断控制器)是在CPU的一个综合中断控制器,开启本地APIC功能 支持选项方便在调试期间收集硬件的消息
< CONFIG_X86_UP_IOAPIC=y |debug内核启用 多CPU的IO-APIC功能。IO-APIC(I/O 高级可编程的中断控制器)是应用在 SMP PC类型环境下。如果你的机器只有一个CPU,或者机器根本没有IO-APIC,仍然可以启动该选项,因为只有系统应用在多CPU环境下,该功能才会自动激活
---
> # CONFIG_MXT is not set
> # CONFIG_X86_UP_APIC is not set
> # CONFIG_X86_UP_IOAPIC is not set

1936,1937c1936,1937
< CONFIG_DEBUG_SLAB=y |debug内核启用 调试内存分配
< CONFIG_DEBUG_IOVIRT=y |debug内核支持 Memory mapped I/O(内存映像I/O)调试。尝试检查出有问题的I/O地址
---
> # CONFIG_DEBUG_SLAB is not set
> # CONFIG_DEBUG_IOVIRT is not set

1939c1939
< CONFIG_DEBUG_SPINLOCK=y |debug内核启用 Spinlock调试,这里是应用在SMP环境并且适应各种类Spinlock要求。Spinlock能在硬件驱动程式发生错误时中断并转换至某种资源,属于 调试 一个手段。在查找 调试 头绪时最好和NMI watchdog 一起使用,以防Spinlock僵死
---
> # CONFIG_DEBUG_SPINLOCK is not set

1944c1944
< CONFIG_X86_PGE=y |重复同上。这是kernel-2.4.18-i686-debug.config文件中‘Kernel hacking’段落描述的配置选项的编排上一个特式。属于‘Processor type and features’内容
---
> # CONFIG_MXT is not set

1947,1948d1946
< CONFIG_MXT=y |重复同上。属于‘Kernel hacking’内容
< CONFIG_REISERFS_CHECK=y |重复同上。属于‘Kernel hacking’内容

1950,1951d1947
< # CONFIG_SMP is not set |debug内核关闭CONFIG_SMP选项,属于‘Processor type and features’内容
< # CONFIG_EWRK3 is not set |重复同上。debug内核关闭CONFIG_EWRK3选项。是‘Ethernet (10 or 100Mbit)’内容

1953,1972c1949,1950 ###‘< ’行是为debug内核增添的选项 ###
< CONFIG_KERNEL_DEBUGGING=y |该功能代码实现 内核能够结合专业调试工具(调试器),并提供可调试功能,进行‘调试’工作
< CONFIG_DEBUG_KSTACK=y |启用 调试核栈(kstack)溢出
< CONFIG_KSTACK_THRESHOLD=500 |设置 触发核栈(kstack)溢出 Oops消息的阀值
< CONFIG_SOFTLOCKUP_THRESHOLD=10000000 |设置 死锁阀值
< CONFIG_DEBUG_SOFTLOCKUP=y |启用 检查软件锁定(lockups) 的功能
< # CONFIG_KSTACK_METER is not set
< # CONFIG_PROFILE_GCC is not set |没有被设置
< # CONFIG_TRACE is not set |没有被设置
< # CONFIG_PRINT_EIP is not set
< CONFIG_KDB=y |debug内核 支持KDB内核调试工具
< # CONFIG_KDB_OFF is not set
< CONFIG_KALLSYMS=y |debug内核为 debugging/kksymoops 装载所有符号标志。该功能实现在调试期间,类似ksymoops 实用工具把难理解的信息(如 Oops消息内容)转换成便于直接理解的信息。i686内核也有编入此代码
< # CONFIG_LOCKMETER is not set
< CONFIG_UP_NMI_WATCHDOG=y |debug内核在多CPU环境下支持NMI watchdog的程式代码
< CONFIG_DEBUG_KERNEL=y |debug内核启用 调试内核功能。i686内核有编入此代码
< CONFIG_DEBUG_SLAB=y |重复同上。debug内核启用 调试内存分配
< CONFIG_DEBUG_IOVIRT=y |重复同上。debug内核支持 Memory mapped I/O(内存映像I/O)调试。尝试检查出有问题的I/O地址
< CONFIG_MAGIC_SYSRQ=y |启用 "Magic System Request Key" 功能。魔术键功能允许 用于"系统请求"的特殊组合键(如 Alt+PrintScreen),处理例如 调试期间系统垮掉的应急情况。i686内核有编入此代码
< CONFIG_DEBUG_SPINLOCK=y |重复同上。debug内核启用 Spinlock调试
< CONFIG_DEBUG_BUGVERBOSE=y |内核启用‘Verbose BUG() reporting’功能,涉及Oops消息输出。Oops(也称 panic)消息包含系统错误的细节,通常Oops消息保存在一个文件中以便通过 ksymoops等实用工具运行它,进行分析排错。i686内核有编入此代码
---
> # CONFIG_X86_UP_APIC is not set
> # CONFIG_X86_UP_IOAPIC is not set
---------------------------------------

感想:
RH 给kernel-debug内核打上IKD内核补丁,并且开启了若干个内核调试的配置选项,是针对‘内核’的调试项目。IKD(integrated kernel debugger,集成的内核调试器)提供很多的内核调试工具,例如以上配置包括的 KDB工具,它跟从oss.sgi.com获取的KDB内核调试器稍有不同。

或者,我认为,安装的内核源码树没有相应补丁源码,DIY编译内核时载入kernel-2.4.18-i686-debug.config文件,在同一源码树不能编译出类似‘带有内核调试功能的RH内核’(make xconfig => Load Configuration from File )。

但载入kernel-2.4.18-i686.config文件,在同一源码树应该能够编译出与‘默认安装的内核’类同功能的DIY i686内核,区别在于没有经过 RH 调试。

--------
--------
--------
回复 支持 反对

使用道具 举报

发表于 2007-1-24 15:13:01 | 显示全部楼层

== Magic SysRq Key (Linux 魔术键)==

-----------
前提:已经安装内核源码包(kernel-source-2.4.18-3),用来查询资料。

1 探索默认安装的内核是否开启‘Magic SysRq Key’功能

$ uname -mp
i686 unknown

$ grep -i SysRq /usr/src/linux-2.4.18-3/configs/kernel-2.4.18-i686.config
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ=y
[ Magic SysRq Key 功能已经开启 ]

2 查找 Magic SysRq Key 相关资料

使用文本编辑器( 例如Linux下的VI )打开 /usr/src/linux-2.4.18-3/Documentation/Configure.help 文件,搜索CONFIG_MAGIC_SYSRQ 简介。如下:
-----------------------------
Magic System Request Key support
CONFIG_MAGIC_SYSRQ
If you say Y here, you will have some control over the system even
if the system crashes for example during kernel debugging (e.g., you
will be able to flush the buffer cache to disk, reboot the system
immediately or dump some status information). This is accomplished
by pressing various keys while holding SysRq (Alt+PrintScreen). It
also works on a serial console (on PC hardware at least), if you
send a BREAK and then within 5 seconds a command keypress. The
keys are documented in <file : Documentation/sysrq.txt>. Don't say Y
unless you really know what this hack does.
-----------------------------

3 确定 Magic SysRq Key 功能被激活

$ su - -c "echo 1 > /proc/sys/kernel/sysrq"
$ cat /proc/sys/kernel/sysrq
1

4 文本模式(黑屏)下操作

注: 在x86机器 SysRq采用 Alt+PrintScreen组合键
-----------

Alt+PrintScreen +h
显示 $ SysRq : HELP : loglevel0-8 reBoot tErm kIll saK showMem Off showPc unRaw Sync showTasks Unmount

-----------
-----------

-- 注:信号发送到进程,进程有能力采用捕获、阻塞和忽略方式处理信号,但除SIGSTOP和SIGKILL

SysRq +e = Send a SIGTERM to all processes, except for init
tErm > 发送SIGTERM终止信号到所有进程,但除init父进程。

SysRq +i = Send a SIGKILL to all processes, except for init
kIll > 发送SIGKILL终止信号到所有进程,但除init父进程,并且规定进程不能够采用捕获、阻塞和忽略方式。

SysRq +l = Send a SIGKILL to all processes, INCLUDING init
kILL > 发送SIGKILL终止信号到所有进程,包括init父进程,并且规定进程不能够采用捕获、阻塞和忽略方式。
-- 注:平时使用 kill <ID> 命令发送 SIGTERM信号 终止进程,kill -9 <ID> 命令是发送 SIGKILL信号来 终止进程。

-----------
-----------

SysRq +t = Show current task info on console
showTasks > 显示当前任务信息。

SysRq +m = Will dump current memory info to your console
showMem > 显示内存信息。

-----------
-----------

SysRq +s = Save dirty buffers on HDD
Sync > 当系统被锁起来,采用Sync方式尽量减少数据的损失。

SysRq +u = Unmount all filesystems
Unmount > 卸载所有文件系统。当系统被锁住,‘SysRq +s’、‘SysRq +u’和‘SysRq +b’属于基本的组合方式。

SysRq +b = Will immediately reboot the system without syncing or unmounting your disks
reBoot > 当你不能正常关机,‘SysRq +b’重启系统是好主意,但应该先执行‘SysRq +s’、‘SysRq +u’。这套组合方式能在 X 桌面下使用。

-----------
-----------

SysRq +o = Halt system and shutdown it
Off > 停机。‘SysRq +o’能在 X 桌面下使用。

-----------
-----------

SysRq +k = Kill all tasks ran from this console
saK > Kill掉所有运行的程序返回控制台登录界面,并能截取再次登录的密码信息(其实是影响密码信息的记录方式,查看/var/log/messages),它不是木马程式,只是方便用户操作。saK是采用程式Kill掉程序,需要区分SIGKILL终止信号。

-----------
-----------

SysRq +[0-8] = Sets the console log level, controlling which kernel messages will be printed to your console
loglevel0-8 > 设置优先级,间接控制信息的输出。

-----------
-----------

SysRq +r = Change keyboard from RAW to XLATE
unRaw > 选择修改 RAW 和 XLATE 键盘模式。(首先用showkey -s 命令查看,控制台通常是XLATE模式)

SysRq +p = Print CPU registers on console
showPc > 打印 CPU寄存器信息。操作‘SysRq +p’要注意,滚动文本可能停止不了。

-----------

--------
====
--------
回复 支持 反对

使用道具 举报

发表于 2007-1-24 15:22:52 | 显示全部楼层

一些控制台‘按键’操作笔记

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

1 简单查询控制台(类似的表示:虚拟控制台,文本模式,黑屏)

$ ps
PID TTY TIME CMD
1058 tty1 00:00;00 bash
[ /dev/tty1,/bin/bash ]

屏幕 24行 与 25行的区分
$ env | grep TERM
TERM=linux
[ 注 TERM=linux 屏幕通常显示25行,若类似 TERM=vt100 屏幕只显示24行 ]

2 满屏,清屏

满屏实验
$ cat /etc/passwd

清屏操作
Ctrl + l 快捷键

或者 输入命令 echo -e \\033c ,或者:

$ cat > /dev/tty1
^[c 按键动作:先按 ESC,再按 c ,后按 ENTER 。
^D 按键动作:快捷键Ctrl+D ,表示结束输入,该例子通常应用在多屏幕操作,这里是演示。

3 临时解决字符显示乱码

创建样本
$ cat
^N 按键动作:按 Ctrl+N ,回车。
^D 按键动作:按 Ctrl+D 结束输入

解决字符显示乱码问题
盲打 cat
^O 按键动作:按 Ctrl+O ,回车。
^D 按键动作:按 Ctrl+D 结束输入

3 控制台里的预定绑定键

a. 多屏幕转换操作:
Alt-Fn ,Ctrl-Alt-Fn | RH 默认6个虚拟控制台,即 Alt- <F1-F6> ,Ctrl-Alt-F7是X图形界面(Ctrl-Alt- <F1-F6> 是图形模式跟文本模式相对转换)。

Alt-RightArrow, Alt-LeftArrow | 6个虚拟控制台头尾相接循环转换。RightArrow 是‘右方向键’,LeftArrow是‘左方向键’,例如 现 在tty1设备,按Alt-LeftArrow转换到tty6设备。

b. 屏幕文本浏览
Shift-PageUp | 文本向后滚动。
Shift-PageDown | 文本向前滚动。

c. 跟 Scrollock键相关
注:单独按 Scrollock键,对键盘输入起 开/关 功能。键盘上ScrolLock指示灯有相应显示,或者尝试敲键输入测试。

Shift-Scrollock | 显示内存信息。
AltGr-ScrollLock | 打印CPU寄存器信息。AltGr是指 右Atl键。
Ctrl-ScrollLock | 显示当前任务信息。与 ‘SysRq +t’ 一样。

d. 其他操作
Ctrl-Alt-Del | reboot重启系统。
Ctrl-C | 最常用,是终止当前执行的任务。
Ctrl-Alt-Backspace | Kill掉 X 图形界面(在 X 操作)。

注:不同软件能够设置相应的组合键。查看 keycode 使用 dumpkeys命令。

------
------
回复 支持 反对

使用道具 举报

发表于 2007-1-25 01:02:58 | 显示全部楼层
果然是高手呀。
回复 支持 反对

使用道具 举报

发表于 2007-1-25 13:18:39 | 显示全部楼层

== RH7.3系统接触 svgalib 1 ==

--------------

一 下载并安装 svgalib-1.4.1-13.src.rpm

放置软件档
# rpm -i svgalib-1.4.1-13.src.rpm

查看操作目录
# ls -R /usr/src/redhat/

编译操作
# cd /usr/src/redhat/SPECS/
# rpm -bb svgalib.spec
在 /usr/src/redhat/RPMS/i386 目录创建 svgalib-1.4.1-13.i386.rpm 和 svgalib-devel-1.4.1-13.i386.rpm 。

安装 rpm软件包
# cd /usr/src/redhat/RPMS/i386

# rpm -ivh svgalib-1.4.1-13.i386.rpm --test
# rpm -ivh svgalib-1.4.1-13.i386.rpm
# rpm -ivh svgalib-devel-1.4.1-13.i386.rpm

[ 注:选择svgalib源码包,除包含设计程序需要的头文件(svgalib-devel里的,如vga.h和vgagl.h),还可以选择编译 /usr/src/redhat/BUILD/svgalib-1.4.1/demos目录下的示例程式。 ]

------------
------------

二 编译 threeDKit 和 demos 目录的示例文件
# cd /usr/src/redhat/BUILD/svgalib-1.4.1/

备份目录
# cp -a demos demos-bak
# cp -a threeDKit threeDKit-bak
备份原因:假如这些程式是编译顺利,RPM命令为什么不一起编译 ?

编译
# make demoprogs
threeDKit 和 demos 目录下生成执行文件。

尝试运行示例文件,要求在控制台(黑屏)操作
root权限操作
# cd /usr/src/redhat/BUILD/svgalib-1.4.1/demos
# ./vgatest
程式要求选择(1-84)代号模式,然后进入图形界面测试。按‘C’或Ctrl-C退出。

# ./fun
使用‘man fun’查看测试用途,Ctrl-C退出。

# ./scrolltest
按键测试效果。

# ./svidtune
打印当前的显示设置,按‘q’退出。

# ./printftest 0 0
输入显示测试,‘Ctrl D’退出。

# ./forktest
Ctrl-C马上退出,按Enter进入测试界面,使用方向键操作,用‘q’或‘Escape’退出。

注 demos目录还有其他的执行文件。

threeDKit目录的plane示例文件
# cd /usr/src/redhat/BUILD/svgalib-1.4.1/threeDKit

# ./plane
一个‘飞机’三维图形示例。程式提供选择分辨率代号(1-7)的图形方式,如选‘6’(800x600)。跟着选‘N’进入图形显示界面:

‘A’‘Q’---> 水平左右旋转,‘X’‘Z’---> 逆顺时针旋转,‘W’‘S’---> 缩小放大, ‘O’‘P’---> 相对翻转,‘I’---> 重置图形。
<Space> 空格 ---> 显示三维轮廓实体,‘R’---> 三维实体表面过渡。
‘F6、F7、F8、F11、F12’---> 修饰轮廓实体。
‘C’键表示退出。

注:经过以上操作,控制台字体被svgalib程式设置,想现在修改,如下:
# setfont

-------
-------
回复 支持 反对

使用道具 举报

发表于 2007-1-25 13:25:14 | 显示全部楼层

== RH7.3系统接触 svgalib 2 ==

--------------------------

a 尝试编写svgalib相关程式
-------------------

svgalib图形库接口需要root权限操作
$ su -
#

查看文档,试编写并执行程式。‘man svgalib’查看图形库文档,查看相关函数文档,如‘man vga_drawline’

# man vga_drawline

[ 该文档描述vga_drawline函数需要 vga.h 头文件,格式是vga_drawline(x1,y1,x2,y2) 。效果是在屏幕上画出一条x1,y1 至 x2,y2 的直线 。]

参考并编写程式
# vi wei_r_s1.c
-------------------------------
#include <vga.h>
int main()
{
vga_init();
vga_setmode(G800x600x256);
vga_setcolor(5);
vga_drawline(50,50,350,350);
vga_getch();
vga_setmode(TEXT);
return 0;
}
-------------------------------

编译
# gcc wei_r_s1.c -o wei_r_s1 -lvga

控制台操作
# ./wei_r_s1

注:该程式意思是需要包含vga.h头文件,vga_init初始化svgalib环境,vga_setmode设置显示模式,vga_setcolor设置颜色代号,vga_drawline画线指令,vga_getch()按任何键触发以下指令,vga_setmode(TEXT)返回控制台的文本模式。

b 尝试编写svgalib相关程式

# vi wei_r_s2.c
-------------------------------
#include <stdio.h>
#include <vga.h>
int main()
{
int i,j,w;
vga_init();
vga_setmode(G800x600x256);
for(w=1;w<8;w++)
{
vga_setcolor(w);
for(i=120;i<481;i=i+40)
{
vga_drawline(220,i,580,i);
j=i+100;
vga_drawline(j,120,j,480);
}
vga_getch();
}
vga_setmode(TEXT);
return 0;
}
-------------------------------

# gcc wei_r_s2.c -o wei_r_s2 -lvga
# ./wei_r_s2

注:该程式实现按键转换颜色,在屏幕中显示一个9x9的网格图案(程式纯属娱乐)。

[ 注:安装目录svgalib-1.4.1/demos有许多源文件提供示例研究。]

-----------
-----------
回复 支持 反对

使用道具 举报

发表于 2007-1-25 13:30:36 | 显示全部楼层

== RH7.3系统接触 svgalib 3 ==

-----------------------------

c 尝试编写svgalib相关程式

在控制台(黑屏)显示预定规格图片
===

root权限操作,编写程式:

# vi w_look_bmp.c
-------------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <vga.h>
#include <vgagl.h>

main ()
{
int fd;
char header[50];
void *image;
char *filename = "/usr/local/bin/w-320-200.bmp";
unsigned char *rgb;
unsigned char *data;
int i;
vga_init();
vga_setmode(G320x200x256);
gl_setcontextvga(G320x200x256);
gl_setrgbpalette();
image = alloca(320*200);
if((fd = open(filename,O_RDONLY)) == -1)
{printf("can not open file\n");
exit(0);
}
read(fd, header, 54);

rgb = alloca(3);
data = alloca(4);
for (i=0; i<256; i++) {
read(fd, data, 4);
rgb[0] = (char)((int)data[2] /4);
rgb[1] = (char)((int)data[1] /4);
rgb[2] = (char)((int)data[0] /4);
gl_setpalettecolors(i,1,rgb);
}
read(fd, image, 64000);
close(fd);
gl_putbox(0,0,320,200,image);
vga_getch();
vga_setmode(TEXT);
return 0;
}
-------------------------------

编译
# gcc w_look_bmp.c -o w_look_bmp -lvga -lvgagl
# cp w_look_bmp /usr/local/bin/

制作 /usr/local/bin/w-320-200.bmp 图片
===

该程式是在控制台显示 320x200像素,256色(8bpp)的图片,size大小通常是65078字节,而且画面是垂直翻转。
“w-320-200.bmp”可以是真实图片的名称,也可以是链接文件。
还有,图片及放置的目录的权限设置,保证能够让其他用户读取(如 755 ),方便下面的例子。

下面是在 /etc/bmp-320-200目录放置预定规格图片(halt-320-200.bmp),制作程式相关的链接文件的情况:

# cd /usr/local/bin
# ln -s /etc/bmp-320-200/halt-320-200.bmp w-320-200.bmp

控制台执行程式
===
# w_look_bmp

然后按任何键退出

注:显示图片后,可以选择输入 consolechars --default-font 或者 setfont 命令还原控制台默认字体。

------------
[ 注:附件有相应规格图片,自助小店(http://rhlinux.ys168.com)还有几款提供测试。 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2007-2-5 20:18:03 | 显示全部楼层

== RH7.3系统接触 svgalib 4 ==

-----------------------------

尝试解决普通用户不能执行 w_look_bmp 程式的特殊问题
===
虽然程式是由root编写,但当设置普通用户满足权限要求后,svgalib图形库提示以下错误信息:
svgalib: Cannot get I/O permissions

方法:设置 SUID 和 SGID 权限位
root权限操作

# which w_look_bmp
/usr/local/bin/w_look_bmp

# chmod 6711 /usr/local/bin/w_look_bmp
# ls -l /usr/local/bin/w_look_bmp
-rws--s--x  1 root root 15205  x xx xx:xx /usr/local/bin/w_look_bmp

现在测试普通用户在控制台执行 w_look_bmp 程式,是否能够显示预定图片。
$ w_look_bmp

-------
-------

== 谈讨一个设想 ==
====

设想前提是 普通用户能够在控制台执行 w_look_bmp 程式,并显示预定图片。

设想:系统启动过程中,在显示文本模式登录界面前执行 /usr/local/bin/w_look_bmp 程式,显示一张图片成为登录前一道屏障。意思是你必须在显示图片时触摸‘按键’退出图片,然后才能够正常输入账户、密码进行登录。

实验例子:设置图片屏障
-----
注:如果涉及系统安全,预先做好还原准备。

A) root权限修改rc.local文件,跟着‘touch /var/lock/subsys/local’语句行添加执行语句,如下:

# vi /etc/rc.d/rc.local
-------------------------------
#!/bin/sh
#
touch /var/lock/subsys/local
#add
/usr/local/bin/w_look_bmp
consolechars --default-font
#add
...............................
...............................
-------------------------------

reboot 重新启动系统,测试效果。
这实验失败居多。在‘consolechars --default-font’后追加 sleep 10 ,系统启动时屏幕显示以下错误信息:
you must be the owner of the current console to use svgalib.not running in a graphics capable console,
and unable to find one.
......................
......................

B) 设想的依据
首先,RH7.3系统默认安装而提供的服务在实验前是正常运作,从/etc/inittab配置文件分析,执行rc.local脚本时所有默认启动的rc脚本已经运作在常态,登录程式只是用户进行PAM模块的认证。从错误信息更加证明  w_look_bmp程式在该环境具备运行条件。

设置SUID和SGID,并且普通用户正常运行w_look_bmp程式。虽然程式简单,但不存在问题。

在虚拟机测试效果一样,从而排除硬件问题。

C) 设想的动力
该‘实验’在RH7.3系统保证成功的例子:在‘reboot 重新启动系统’入手,用户在文本模式输入‘exit’退回登录界面,跟着以 root 帐号重新登入,然后输入‘reboot’命令,重新启动系统。图片屏障就会成功显示。

使用‘ su - ’命令没有该效果,猜想可能 RH7.3系统给 root 帐号重新启动时,留有后门接口。

------------------
------------------
回复 支持 反对

使用道具 举报

发表于 2007-2-5 20:26:06 | 显示全部楼层

RH7.3 轮换Grub背景图片(.xpm.gz)

RH7.3 轮换Grub背景图片(.xpm.gz)
=============

GRUB使用压缩了的XPM图像格式(.xpm.gz),图片规格:640x480 ,14 colors 。
[
例如需要制作的图片grub-gnome-2-wei.bmp ,相关命令 :
$ convert grub-gnome-2-wei.bmp -colors 14 -geometry 640x480! grub-gnome-2-wei.xpm
$ gzip grub-gnome-2-wei.xpm
]
提供Grub图片 > http://rhlinux.ys168.com
子目录 > Grub-splash/grub-gnomeimages

创建用户放置Grub背景图片的目录,并确保用户‘可读’
$ mkdir ~/grub-gnomeimages
$ cp *.xpm.gz ~/grub-gnomeimages/
$ chmod 644 ~/grub-gnomeimages/*.xpm.gz

注:图片文件名称经过有规律特殊编排。例子中 grub-gnome-1-wei.xpm.gz 、grub-gnome-2-wei.xpm.gz 或 grub-gnome-8-wei.xpm.gz 等。

在 ~/grub-gnomeimages/ 目录中创建被链接文件 grub-wei.xpm.gz
$ touch ~/grub-gnomeimages/grub-wei.xpm.gz

root权限创建链接文件 splash.xpm.gz
$ su -

# cd /boot/grub
# [ -L ./splash.xpm.gz ] || cp ./splash.xpm.gz ./splash.xpm.gz.bak
注:测试splash.xpm.gz文件是否链接文件,如果不是链接文件,搞一个图片备份。

# rm splash.xpm.gz
# ln -s /home/wei/grub-gnomeimages/grub-wei.xpm.gz ./splash.xpm.gz
# exit
$ cd

编写脚本
$ [ -d ~/bin ] || mkdir ~/bin
$ vi ~/bin/s-grubimage.sh
---------------------------------
#!/bin/bash
DIR='/home/wei/grub-gnomeimages'
if [ ! -d $DIR ] ; then echo "No such directory ( $DIR )" ; exit 1 ;fi

[ -f $DIR/grub.test ] || echo 1 > $DIR/grub.test
n=$(cat $DIR/grub.test)

if [ $n -eq 0 ] ;then echo ok > /dev/null ; exit 2 ;fi

b=$[ $n+1 ]
[ -f $DIR/grub-gnome-$b-wei.xpm.gz ] || b=1
cp -f $DIR/grub-gnome-$b-wei.xpm.gz $DIR/grub-wei.xpm.gz
echo $b > $DIR/grub.test
unset n b DIR
---------------------------------


附加执行权限
$ chmod +x ~/bin/s-grubimage.sh

把 用户脚本执行语句 添加到 ~/.bash_profile 文件
$ vi ~/.bash_profile
---------------------------------
...................
...................
[ -f /home/wei/bin/s-grubimage.sh ] && /home/wei/bin/s-grubimage.sh
---------------------------------

重启系统测试效果
[ 注:以上属于用户账号为 wei 的情况。 ]

--------

操作例子:
=========
1 指定下一次启动的Grub图片,例如 grub-gnome-8-wei.xpm.gz

$ echo 7 > /home/wei/grub-gnomeimages/grub.test
$ /home/wei/bin/s-grubimage.sh

2 锁定显示一张Grub图片
$ echo 0 > /home/wei/grub-gnomeimages/grub.test


------------
------------
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表