大话。。Kerberos原理。。

Kerberos是一个重要的认证协议,它为互不相识的通信双方做安全的认证工作。Kerberos这个名字的原义是希腊神话中守卫冥王大门的长有三头的看门狗。下面这篇Kerberos的文章不知是哪位老大翻译的,感谢先!

这是MIT(Massachusetts Institute of Technology)为了帮助人们理解Kerberos的原理而写的一篇对话集。里面有两个虚构的人物:Athena和Euripides,通过Athena不断的构思和Euripides不断的寻找其中的漏洞,使大家明白了Kerberos协议的原理。

  Athena: 雅典娜,智慧与技艺的女神。

  Euripides:欧里庇得斯, 希腊的悲剧诗人。

译文如下:

第一幕

在一个小工作间里。Athena和Euripides正在相邻的终端上工作。

Athena: 嗨,这个分时操作系统实在太慢了。我根本无法工作,因为每个人都登上去了。

Euripides: 不要对我报怨。我只是在这工作。

Athena: 你知道我们需要什么吗?我们需要给每一个人一台工作,这样大家就不会担心计算机的速度了。并且,我们需要一个网络把所有的计算机都联起来。

Euripides: 好。那么我们差不多要一千台工作站?

Athena: 差不多吧。

Euripides: 你知道一台普通的工作站的硬盘有多大吗?那里放不下所有的软件。

Athena: 我已经有主意了。我们可以把系统软件放到服务器上。当你登录到工作站的时候,工作站会通过网络与其中一台服务器上的系统软件联系。这样的设置让一组工作站都使用同一份系统软件,并且利于系统软件的升

瞎玩。。胡闹。。。

没课的日子很难熬啊。。。泡电脑旁边。。就是我的快乐所在。。。。。呵呵

下午很失败。。东西都没弄出来。。都玩个mplayer吧。。没弄成。。错误一大堆。。什么都没弄出来。。。感觉很没意思。。。

很多错误。。不同环境下不同的错误吧。。。网上看着都挺简单的。。实际操作起来。。很不顺利。。。比如像iiview这个软件。。。。看着挺简单的。。

等运行的时候。。傻眼了。。有错误。。百度上没有。。google上也没有。。。

最后发挥自己的聪明智慧给解决了。。呵呵。。很有成就感。。

继续玩个xine吧。。

Linux电源管理研究笔记-acpid工作原理[3800hk]

在手持设备设计中,电源管理历来为重要的研究课题之一。我们日常所说的省电就属于电源管理的范畴,这也是我们最关心的一个部分。通过挂起不必要的设备、降低CPU的频率或者其它方法,可以减少能量的消耗,达到省电的目的。电源管理实际上是一个系统工程,从应用程序到内核框架,再到设备驱动和硬件设备,都要参与进来,才能达到电源管理的最优化。本文介绍一下acpid的工作原理。

  ACPI是Advanced Configuration and Power Interface缩写,acpid中的d则代表daemon。Acpid是一个用户空间的服务进程,它充当linux内核与应用程序之间通信的接口,负责将kernel中的电源管理事件转发给应用程序。

  acpid与内核的通信方式:acpid用poll函数挂在/proc/acpi/event文件上。内核在drivers/acpi/event.c中实现了该文件的接口,一旦总线事件列表(acpi_bus_event_list)上有电源管理事件发生,内核就会唤醒挂在 /proc/acpi/event上的acpid,acpid再从/proc/acpi/event中读取相应的事件。

  acpid与应用程序的通信方式有两种,其一是通过本地socket,其文件名为/var/run/acpid.socket,应用程序只要连接到这个socket上,不用发送任何命令就可以接收到acpid转发的电源管理事件。

  其二是通过配置文件。在acpid收到来自内核的电源管理事件时,根据配置文件中的规则执行指定的命令。配置文件在/etc/acpi/events/目录下,下面是一个示例:

  event=button/power.*

  action=/sbin/shutdown -h now

  事件的格式为:device_class bus_id type data。device_class和bus_id是字符串,type和data是十六制整数。在配置文件中可以使用通配符,来匹配指定的事件。

使用 kexec 快速重启 Linux

即使您的工作不要求您每天多次重新启动您的 Linux 机器,等待系统启动也实在是一件枯燥的事情。因而有了 kexec。本质上讲,kexec 是一个让您可以重新启动到一个新 Linux 内核的快速重新引导功能部件 — 不必通过引导装载程序。更快速的重新启动即使对于正常运行时间并不是至关重要时也是有益的 — 对那些每天都要多次重新启动机器的内核和系统软件开发者来说更可谓是救生者。kexec 当前只能用在 x86 32 位平台上。

随着计算机系统变得更快更好,系统重新启动时间也需要跟上发展。实际上,随着系统的处理器速度、存储容量和资源性能变得更加先进和复杂,重新启动的时间竟变长了。虽然更长的重新启动时间对每个人来说只是一种刺激,但它对生产系统的影响是至关重要的,因为更长的重新启动时间意味着正常运行时间的减少。除了影响系统对其用户的可用性之外,更长的重新启动时间对内核和系统软件开发者来说是一个主要的瓶颈,因为他们每天都要多次重新启动他们的机器。

当系统有很多松散分布的 SCSI 总线或者 ECC 校验的物理内存时,重新启动时间特别长。测试结果显示,重新启动过程中大部分时间消耗在固件(firmware)阶段,在此阶段,连接到系统的设备被识别出来并被初始化(要深入了解,请查看本文的 参考资料部分)。自然,大部分试图减少重新启动时间的努力都瞄准重新启动过程的这个阶段。其中一项努力带来了 kexec 的发展,kexec 是一个可用于 x86 平台上 Linux 内核的功能部件。使用 kexec,您可以直接重新启动到另一个内核,不再必须通过固件和引导装载程序阶段。跳过序列中最长的部分大大减少了重新启动时间。

Linux 中的引导概述



要理解 kexec,需要先具备 Linux 中引导过程的知识。Linux 中的引导过程有两个阶段:引导装载程序阶段和内核阶段。

引导装载程序阶段主要包括硬件阶段、固件阶段、第一级引导装载程序和第二级引导装载程序。引导过程从硬件加电启动开始。一些初始化工作完成后,控制转到固件。固件在一些体系结构中也称为“BIOS”,它去检测系统上的各种设备,包括内存控制器、存储设备、总线桥和其他硬件。固件基于设置将控制移交给一个最小化的引导装载程序,即大家所知的主引导记录(master boot record),这个主引导记录可能在磁盘驱动器上,或者在可移动媒体上,或者在网络上。将控制移交给操作系统的实际工作由第二阶段引导装载程序(通常被简单地认为是“引导装载器(boot loader)” )执行。这个引导装载程序让用户可以选择要装载的内核,将内核和相关参数装载到内存,初始化内核,设置需要的环境变量,并最终“运行”内核。

引导的下一个阶段是 内核阶段,此时内核已经获得控制权。它设置需要的数据结构,检测当前在系统上的设备,装载需要的设备驱动程序,并初始化设备。引导过程的最后阶段包括用户级初始化。在这个阶段,内核检查文件系统的完整性,挂载文件系统,设置交换分区(或者交换文件),启动系统服务,设置系统终端,并完成所有其他设置。

在系统重新启动时,引导装载阶段之前要先关闭先前正在运行的系统。这涉及到停止运行的进程,将高速缓冲存储器内容写回到磁盘,?载文件系统,然后执行硬件的重启。在本文的 参考资料部分,您可以找到对 Linux 中引导过程以及常见的引导相关概念的极好的描述。






回页首



kexec 概述



kexec 是 Linux 内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。在上面描述的引导序列中,kexec 跳过了整个引导装载程序阶段(第一部分)并直接跳转到我们希望引导到的内核。不再有硬件的重启,不再有固件操作,不再涉及引导装载程序。完全避开了引导序列中最弱的一环 — 固件。这一功能部件带来的最大益处在于,系统现在可以极其快速地重新启动。对企业级系统而言,kexec 大大减少了重新启动引起的系统宕机时间。对内核和系统软件开发者而言,kexec 帮助您在开发和测试成果时可以迅速重新启动系统,而不必每次都要再经历耗时的固件阶段。

kexec 补丁是 Eric Biederman 的作品,这个项目仍处在积极的开发之中(查看 参考资料部分以深入了解此项目以及如何对它做出贡献)。

显然,由于这个功能部件涉及到操作系统如此多的敏感部分,需要特别细心以使其始终正确工作。对 kexec 来说,最大的挑战在于,在 Linux 中,要重新引导到的新内核需要位于内存中与当前正在运行的内核相同的位置。仍然在当前内核的上下文中运行时,用新内核去替换内存中现有的内核,这是件困难的工作。另一个大问题是,系统中设备的状态。固件总是将设备初始化(或重启)到已知的“sane”状态。kexec 绕过固件阶段的事实,意味着设备的状态是不可靠的。

本文接下来的几节将向您展示如何征服这些挑战,并展示如何实现到新内核的直接引导。注意,当前 kexec 只能用于 x86 32 位平台。尽管将 kexec 移植到其他平台的工作正在进行,但是还没有可以用的代码版本。因此,后面几节中的所有技术细节都只特定于 x86 平台。






回页首



使用 kexec



Kexec 有两个组件。第一个是用户空间组件,叫做“kexec-tools”。第二个是真正的内核补丁。这两部分实现 kexec 的两个主要操作:将新内核装载到内存并重新启动到它。可以容易地获得一个启用 kexec 的内核。只需要下载 kexec-tools 包和特定内核的补丁(见 参考资料部分的链接),编译 kexec-tools 包以得到 kexec工具,并将特定内核的补丁加入到内核树中并重装启动到它。当然,您在编译内核时要确保选中 CONFIG_KEXEC 选项。

如上所述,kexec 的使用包括(1)将重新启动到的内核装载到内核中,然后(2)真正重新启动到它。装载内核的语法如下:

kexec -l <kernel-image> --append="<command-line-options>"

在这里, <kernel-image> 是您想要重新启动后的内核文件, <command-line-options> 容纳的是需要传递到新内核的命令行参数。由于错误的命令行选项可能会在重新启动时引发问题,所以,确保合法值传递到重新启动的内核的安全方法是传递 /proc/cmdline 的内容。

例如,如果您希望重新启动的内核映像是 /boot/bzImage, /proc/cmdline 的内容是 "root=/dev/hda1" ,那么装载内核的命令将是:

kexec -l /boot/bzImage -append="root=/dev/hda1"

然后,为了真正重新启动已装载的内核,只需要输入:

kexec -e

系统将立即重新启动。不同于正常的重新启动过程,在重新启动之前,kexec 不去执行彻底停止系统。需要您在尝试进行 kexec 重新启动之前去杀死所有应用程序并?载文件系统。






回页首



kexec

的魔力

在 kexec 的发展过程中,最大的挑战之一来自于这样一个事实:Linux 内核要从内存中固定的地址运行。也就是说,新内核需要安放于当前内核正在运行的位置。在 x86 系统上,内核位于物理地址 0x100000(虚拟地址为 0xc0000000,也叫做 PAGE_OFFSET )。用新内核覆盖旧内核的工作分三个阶段完成:

  1. 将新内核拷贝到内核中。
  2. 将这个内核映像移到动态内核内存中。
  3. 将这个映像拷贝到真正的目标位置(覆盖当前内核),然后启动新内核。

前两个阶段在内核的“装载”期间完成。第一个任务是解释内核映像文件的内容。Kexec-tools 已经被编译,因此,理论上您可以装载并引导任何(甚至是非-Linux 的)内核。当前,只能引导到 elf32 格式的内核映像。这个文件被解析,内核“段(segments)”被装载到缓存中。这些段根据代码的自然类型进行分类。例如,在使用常见的“bzImage”内核文件格式的情况下,典型的段是针对 16 位内核代码、32 位内核代码和初始 RAM 磁盘代码的段。用于追踪这些段的结构体被称为 kexec_segment ,是一个相当简单的结构体:

清单 1. kexec_segment 结构体

struct kexec_segment {
   void *buf;
   size_t bufsz;
   void *mem;
   size_t memsz;
};


结构体的前两个元素指向用户空间缓存和它的大小,接下来两个元素指明了段的最终目标位置和它的大小。

一旦特定内核文件格式的(kernel-file format-specific)模块将映像装载到用户内存,映像就会被 sys_kexec 系统调用转移到动态内核内存。这个系统调用给每个从用户空间传递而来的段分配动态内核页,并将段拷贝到这些内核页上。

kexec 还分配了一个用来存储汇编代码的小存根(small stub)的内核页,称为 reboot_code_buffer 。这个存根完成用将要重新启动到的内核来覆盖当前内核并跳转到它的实际工作。 reboot_code_buffer 是惟一的存留在其最终存放位置的缓存。换句话说,它从它最初装载到的位置开始执行。为此,在启用了 MMU 的系统上,驻留这些代码的页被 一致映射(identity mapped)。简单说,这需要用相同的物理和虚拟地址在 init_mm (内核的页表结构体)中创建一个页表条目。必须这样做才能在重新启动操作中访问这一代码段,如接下来将要论述的。

关于 reboot_code_buffer 、各种段以及其他细节的信息通过使用 kimage 结构来保持:

清单 2. kimage 结构体

struct kimage {
        kimage_entry_t head;
        kimage_entry_t *entry;
        kimage_entry_t *last_entry;
        unsigned long destination;
        unsigned long offset;
        unsigned long start;
        struct page *reboot_code_pages;
        unsigned long nr_segments;
        struct kexec_segment segment[KEXEC_SEGMENT_MAX+1];
        struct list_head dest_pages;
        struct list_head unuseable_pages;
};


当前,这个结构体中最重要的部分是指向容纳映像的内核内存中缓存的 segment[KEXEC_SEGMENT_MAX+1] 元素,和指向重新启动过程中使用的汇编存根的 reboot_code_pages

一旦内核映像被装载,系统就可以重新启动到它。使用 kexec -e 命令来开始真正重新启动到新内核。这个命令实际上是用 sys_reboot 系统调用来通知内核执行重新启动,但是使用了一个特别的 - LINUX_REBOOT_CMD_KEXEC 标志。

重新启动的系统调用遇到这个特别的标志后,将控制权移交给 machine_kexec() 函数。 machine_kexec() 执行的动作完全针对特定体系结构。在当前的 x86 实现中,动作的序列如下:

  1. 从当前进程的 mm struct 切换到使用内核的 init_mm 结构体,以访问一致映射的 reboot_code_buffer
  2. 停止 apics 并禁用中断。
  3. 将汇编存根代码拷贝到您在装载内核映像时分配的 reboot_code_buffer 中。此汇编代码可以在 relocate_new_kernel 例程中找到。
  4. 将内核数据段( __KERNEL_DS )值装载到段寄存器,并使用 GDT 和 IDT 无效。
  5. 跳转到 reboot_code_buffer 中的代码,将一些重要的信息以参数的形式传递给新内核,比如容纳有内核映像的源/目的地址的间接页,新内核的起始地址, reboot_code_buffer 页的地址,以及一个标明系统是否启用了物理地址扩展(physical address extension,PAE)的标志。

汇编存根代码执行下面的操作:

  • 自栈中读取参数,并将它们存储到寄存器中,然后禁用中断。
  • 使用以参数形式传递给自己的页地址,在页的末端设置一个栈。
  • 将新内核映像的起始地址存储到栈中,以使得存根代码的返回自动将系统引导到新的内核映像。
  • 设置 cr0 寄存器的适当位来禁用内存分页。
  • 将页目录基址寄存器 cr4 重设为 0。
  • 清空快表(Translation Lookaside Buffers,TLB)。
  • 将所有内核映像页拷贝到最终目标页。
  • 再次清空 TLB。
  • 将除了栈指针寄存器 esp(因为它指向容纳新内核起始地址的栈)以外的所有寄存器重设为 0。
  • 自存根代码“返回”。自动将系统引导到新内核。

这一系列工作完成后,新内核获得控制权,然后系统正常引导起来。






回页首



kexec 的益处



要求高可用性的系统,以及需要不断重新启动系统的内核开发人员,都将受益于 kexec。因为 kexec 跳过了系统重新启动过程中最耗时的部分(也就是固件阶段),所以重新启动变得非常快,可用性得到了提高。

kexec 在宕机转储(crash dump)工具中也得到了令人关注的应用。Linux Kernel Crash Dumps(LKCD)项目(查看 参考资料中的链接)使用 kexec 开发了一种不同的转储机制。在系统出错或者用户转储开始时,系统内存映像被压缩并转储到可用的空闲内存页中。接下来,系统使用 kexec 重新启动到另一个内核。新内核会被告知转储存储在何处,并防止任何进程使用那些内存区域。随后,内存转储可以写出到磁盘分区或者通过网络写到另一台机器。

这一设计的关键在于这样一个事实,通过避开重新启动过程中的固件阶段,LKCD 可以防止物理内存内容被固件清除掉。在宕机的时候,LKCD 也不需要依赖于一个不可靠的磁盘或者网络设备驱动器来将内存映像写出到目标位置。当重新启动执行,系统处于可靠状态后,转储通过正常的系统设备驱动器写出到目标位置。






回页首



kexec 的发展趋势



Kexec 当前只能用于 x86 32 位平台。使其可以应用于 PPC 64 和 AMD 64 等其他体系结构的平台将会有所帮助。而且,更好地与关机(shutdown)接口集成,以方便地终止进程、停止设备和?载文件系统,将使它更便于普通用户使用。

您可以为 kexec 的开发做出贡献。开始时请在一个测试用的系统上尝试 kexec。您还可以加入到“fastboot”邮件列表中,所有关于项目的技术讨论都在那里进行(查看 参考资料中的链接)。

控制台下常用软件

中文平台 — zhcon, cce

网络浏览器 — lynx, w3m

文件管理器 — mc

看图软件 — zgv

听歌软件 — mpg321, mp3blaster

irc软件 — irssi, bitchx, scrollz, epic4

文本抓图可以cat /dev/vcs > /tmp/1.txt

多媒体播放软件(rm、vcd、dvd等) — mplayer

msn、qq软件 — centericq(支持msn,icq,yahoo等), perl-oicq(支持QQ,见软件版)

屏幕保护 lockvc

一下内容摘自linuxsir

http://www.linuxsir.org/bbs/showthread.php?t=245239&highlight=centericq

下面的很多软件应该可以用apt-get来装上,如果你和我一样用的是debian或者ubuntu

0. 基础软件

基本上,下面的软件都需要的, 下面就不提了.

Linux kernel with Framebuffer :

GPM : 鼠标驱动

ncurses : 基础图形库

S-lang : 基于 ncurses 的库, 有的软件需要

newt : 另一个图形库, 有的软件需要


screen : 让一个 console 同时运行多个图形程序 ,我写的 screen 的用法, 以及在 lfs 当中的应用 , 还有人说用screen可以实现gpm的跨控制台复制粘帖 这是gentoo的帮助文件: http://gentoo-wiki.com/TIP_Using_screen


1. 中文支持

zhcon : 在LFS5.0+kernel2.6.3里安装zhcon0.2.3

cce : cce + gcc4 问题基本解决 (Final)


2. 文件管理

midnightcommander, mc : 见 BLFS Book

Midnight Commander MP : 改版的 mc http://freshmeat.net/projects/mcmp/


3. 上网浏览

lynx , w3m , links 在 BLFS book 里有

lynx : 基本的浏览器,在 cce/zhcon 下支持中文,不支持中文utf8网页(比如 本页 )

w3m : 较好的浏览器,支持表格,在 cce/zhcon 下完美支持中文, utf8 的网页也支持links : 功能比 w3m 还强大, 支持后台下载,但是完全不支持中文.

elinks : links 改版,功能比 links 还强大, 支持多Tab页,但是完全不支持中文.


4. 上网聊天
centericq : An ncurses-based client for ICQ, Yahoo!, AIM, IRC, Jabber, MSN, and LiveJournal.
http://freshmeat.net/projects/centericq/


Licq : An advanced graphical ICQ clone.
http://freshmeat.net/projects/licq/


5. 收发邮件

Mutt : A small but very powerful text-based mail client.
http://freshmeat.net/projects/mutt/


6. 音乐欣赏

mp3blaster : mepgsound 解码 http://mp3blaster.sourceforge.net/

mpg123 + playmp3list : mpg123 解码 http://rucus.ru.ac.za/~urban/projects/playmp3list/
mplayer : mplayer 的 console 前端


cmus : mad 解码 , 看起来比 mp3blaster 还好 http://onion.dynserv.net/~timo/cmus.html

为了支持更多格式,需要一下库:

flac : http://flac.sourceforge.net/

mp3 , mad : http://www.underbit.com/products/mad/

ogg , libogg, http://www.vorbis.com/

libao : http://www.xiph.org/ao/


下面不清楚,可能没有什么用
http://modplug.sourceforge.net/
http://www.musicpd.org/mpc.shtml
http://www.musicpd.org/


7. 视频播放

mplayer :

xine :

这两个在输出驱动为 fb 的情况下,可以完美播放各种格式视频.


8. 集成开发

motor : http://freshmeat.net/projects/motor/
http://thekonst.net/motor
ftp://rpmfind.net/linux/Mandrake/9.2…4-3mdk.src.rpm

有人可能更喜欢用 vi 或 emacs .


9. 上传下载

wget : http://www.gnu.org/software/wget/

curl : http://curl.haxx.se/

prozilla : 多线程 http://prozilla.genesys.ro/

lftp : 命令行 http://lftp.yar.ru/

yafc : 命令行 + 彩色 http://yafc.sourceforge.net/

mc : mc 用来ftp是很方便的


10.图形图像

fbgrab : 在 framebuffer 下截图, http://hem.bredband.net/gmogmo/fbgrab/

我的截图都是 fbgrab 做的, 依赖于 libpng .

编译时不要用 make ,它的 Makefile 调用了一个检查程序,一般都没装,也没什么用.

看一下 Makefile ,把 gcc ……….. 粘帖下来直接用.


fbv : 看图软件,可以在console 下看 png gif jepg ,依赖于 libpng, libungif ,libjepg
http://freshmeat.net/projects/fbv/


iiview : 看图, 还可显示缩略图, 可以在console 下看 png gif jepg tiff,依赖于 libpng, libungif ,libjepg, libtiff
http://freshmeat.net/projects/iiview/

fbview : 看图, 不推荐,依赖太多, 除图形库外,还有imagemagick , oFBis library


11. 其他工具

htop : 进程管理器, 更好的 top http://htop.sourceforge.net/

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

原文在这里。可以用来替代桌面应用程序。

  1. Screen a window manager for the console
  2. Pine 邮件管理器
  3. Lynx
  4. Zed 文本编辑器
  5. Oleo 电子表格
  6. TPP Text PowerPoint
  7. MySQL
  8. Midnight Commander 文件管理器和ftp客户端
  9. ZGV 图片浏览器
  10. Nethack 游戏

其他

X-Chat-text — IRC client
Tethereral — front end for TCPdump
GNU Chess — a chess game
Vlock — a clock for the CLI
Halibut — converts text to manpage, PDF, PostScript, and other formats
Cmatrix — a screen saver
vifm — my favorite file manager
ncftp — FTP client
antiword — converts Word .DOC files to text

命令。。[man翻译]

上午也没什么事。。想不出来要做什么。。练习会常用的命令吧。。不会了先用man先生查看一下。。。实在不会了再上百度。。呵。。这种学习方法不错。。。

seq命令

seq [OPTION] … LAST

seq [OPTION] … FIRST LAST

seq [OPTION] … FIRST INCREMENT LAST

OPTION

-f, –format=FORMAT         (%g)

跟C语言里printf函数里的格式一样

-s , –separator=STRING

use STRING to separate numbers (default: n)

-w, –equal-width

    equalize width by padding with leading zeroes

我这个英语白痴都能看懂啥意思。。。。哈哈。。

关于linux下远程挂载文件系统的总结

关于linux下远程挂载文件系统的总结下面是参考资料

1>

我的机子同时装了Windows和Linux操作系统,通常情况下Linux对Windows的分区格式是不支持的。而我们个人用户用的最多的往往还是Windows系统,在学习中免不了要在两个系统之间交换文件。幸好Linux系统提供了mount命令可用于挂载Windows下的分区。为此我们可通过此命令来在Linux下挂载Windows的分区来实现两个系统之间的文件交换。(提示,目前的Linux的系统好像对NTFS分区格式的支持不是太好,所以最好用FAT32的分区格式。本例以FAT32格式为例)

  1.以root用户登录Linux。

  2.进入 mnt 目录,新建一个文件夹(用于装载下面将要挂载的Windows分区),如取名为:windisk创建文件夹的命令如下:mkdir /mnt/windisk。

  3.执行挂载命令 mount -t vfat /dev/hda5 /mnt/windisk

  *注意: 命令中的 “hda5″,数字5代表的是你的硬盘上的分区编号,一般情况下主分区的第一个盘的编号为1,第二个盘的编号为2,也就是说 c 盘可表示为:hda1,如果你的主分区不只一个C盘的话,那么其余的分区依此类推 。逻辑分区的第一个盘的编号为 5 也就是说 D 盘可表示为:hda5,E盘可表示为:had6,其余的依此类推。

  4.如果命令没有执行错误提示的话,那么现在在你的Linux下应该可以访问你的Windows系统下的分区了。执行命令: cd /mnt/windisk 回车,然后再执行命令 ls 回车。看Windows下的文件是不是已经列出来了。

  挂载U盘的方法和以上操作步骤一样。唯一的区别就是把上面第三步的 hda5 改为 sda1。原因是Linux把外接的磁盘设备都当作了scics设备来处理了。

2>

在Windows操作系统之间,可以通过映射网络驱动器的方式,将某个共享目录映射成一个磁盘文件系统,在Linux下,可以通过smbmount命令来实现相似的功能,将Windows的某个共享目录挂载到Linux下的某个目录下。
测试平台:
Red Hat Enterprise Linux AS release 3 (Taroon)
Windows 2000 Advanced Server SP4
当前测试条件:
1、 Windows和Linux共处于同一个局域网中,可以互相ping通,都未设置防火墙
2、 Windows的IP地址:192.168.60.188
3、 Linux的IP地址:192.168.60.189
4、 Windows上当前有如下共享:c$,temp(everyone具有读取权限)
5、 Windows上的用户有cmw(管理员组用户帐号),grp(管理员组用户帐号),guest(当前未启用),没有root帐号
6、Linux上安装有相关的RPM包:samba-client,它是Samba客户端工具,安装后可以使用smbmount命令
基本测试过程如下:
语法:smbmount //IP地址/共享名 挂载点 -o 选项1,选项2……
1、 挂载c$共享:
[root@rh root]# smbmount //192.168.60.188/c$ ./c$ -o username=cmw

Password:                                                       

[root@rh root]# cd c$                                            
或:
[root@rh root]# smbmount //192.168.60.188/c$ ./c$ -o username=cmw,password=cmww

lovegrp                                                                        
        [root@rh root]# cd c$
   
2、 挂载temp共享(启用guest帐户)
[root@rh root]# smbmount //192.168.60.188/temp ./temp

Password:                                           

[root@rh root]# cd temp/                            

[root@rh temp]# ls                                  

samba webmin-1.260.tar.gz                          

此时,未指定帐号和密码,则使用环境变量USER为帐号,使用环境变量PASSWD作为密码,因为Windows已经启用guest帐号,且temp共享为允许任何人读取,所以此次命令运行成功
        [root@rh root]# umount ./temp
        卸载网络文件系统
3、 挂载temp共享(未启用guest帐户)
[root@rh root]# smbmount //192.168.60.188/temp ./temp          

Password:                                                      

Anonymous login successful                                     

2068: tree connect failed: ERRDOS – ERRnoaccess (Access denied.)

SMB connection failed                                          
        此时,guest帐号被停用,所以连接失败。

3>

1、挂载点必须是一个目录。

  

  2、一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。

  对于其他操作系统建立的文件系统的挂载也是这样。但是需要理解的是:光盘、软盘、其他操作系统使用的文件系统的格式与linux使用的文件系统格式是不一样的。光盘是ISO9660;软盘是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。

  

  

  挂载时使用mount命令:

  格式:mount [-参数] [设备名称] [挂载点]

  

  其中常用的参数有

  -t<文件系统类型> 指定设备的文件系统类型,常见的有:

  minix linux最早使用的文件系统

  ext2 linux目前常用的文件系统

  msdos MS-DOS的fat,就是fat16

  vfat windows98常用的fat32

  nfs 网络文件系统

  iso9660 CD-ROM光盘标准文件系统

  ntfs windows NT 2000的文件系统

  hpfs OS/2文件系统

  auto 自动检测文件系统

  -o<选项> 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有

  codepage=XXX 代码页

  iocharset=XXX 字符集

  ro 以只读方式挂载

  rw 以读写方式挂载

  nouser 使一般用户无法挂载

  user 可以让一般用户挂载设备

  

  提醒一下,mount命令没有建立挂载点的功能,因此你应该确保执行mount命令时,挂载点已经存在。(不懂?说白了点就是你要把文件系统挂载到哪,首先要先建上个目录。这样OK?)

  

  例子:windows98装在hda1分区,同时计算机上还有软盘和光盘需要挂载。

  # mk /mnt/winc

  # mk /mnt/floppy

  # mk /mnt/cdrom

  # mount -t vfat /dev/hda1 /mnt/winc

  # mount -t msdos /dev/fd0 /mnt/floppy

  # mount -t iso9660 /dev/cdrom /mnt/cdrom

  现在就可以进入/mnt/winc等目录读写这些文件系统了。

  

  要保证最后两行的命令不出错,要确保软驱和光驱里有盘。(要是硬盘的磁盘片也可以经常随时更换的话,我想就不会犯这样的错误了 :-> )

  如果你的windows98目录里有中文文件名,使用上面的命令挂载后,显示的是一堆乱码。这就要用到 -o 参数里的codepage iocharset选项。codepage指定文件系统的代码页,简体中文中文代码是936;iocharset指定字符集,简体中文一般用cp936或gb2312。

  

  

  当挂载的文件系统linux不支持时,mount一定报错,如windows2000的ntfs文件系统。可以重新编译linux内核以获得对该文件系统的支持。关于重新编译linux内核,就不在这里说了。

  

  四 、自动挂载

  每次开机访问windows分区都要运行mount命令显然太烦琐,为什么访问其他的linux分区不用使用mount命令呢?

  其实,每次开机时,linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区,如windows分区,以实现文件系统的自动挂载呢?

  这是完全可以的。在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。我的/etc/fstab文件如下:

  

  /dev/hda2 / ext3 defaults 1 1

  /dev/hda1 /boot ext3 defaults 1 2

  none /dev/pts devpts gid=5,mode=620 0 0

  none /proc proc defaults 0 0

  none /dev/shm tmpfs defaults 0 0

  /dev/hda3 swap swap defaults 0 0

  /dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0

  /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0

  /dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0

  /dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0

  

  

  在/etc/fstab文件里,第一列是挂载的文件系统的设备名,第二列是挂载点,第三列是挂载的文件系统类型,第四列是挂载的选项,选项间用逗号分隔。第五六列不知道是什么意思,还望高手指点。

  

  在最后两行是我手工添加的windows下的C;D盘,加了codepage=936和iocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:

  

  rw 以可读写模式挂载

  suid 开启用户ID和群组ID设置位

  dev 可解读文件系统上的字符或区块设备

  exec 可执行二进制文件

  auto 自动挂载

  nouser 使一般用户无法挂载

  async 以非同步方式执行文件系统的输入输出操作

  

  大家可以看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(如果你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)

                         

PS:在实际应用中,本机本系统的挂载用第1中方法可以轻松实现。但通过Linux服务器与WinXP的挂载时,选用第2个方法测试成功,具体命令为:# smbmount //192.168.60.188/aaa /mnt/aaa -o username=域\UserName(回车后会提示输入密码), 但服务器端只具有读的权限,是否可以通过修改命令行参数来改变权限未知。

挂载资源的卸载:# smbumount /mnt/aaa   (需要注意命令smbumount中间不是unmount,挂载点必须是已经共享了的文件夹名称)

几个概念。。

atlorca2:~ # iostat

Linux 2.6.5-7.97-default (atlorca2)    05/09/05


avg-cpu: %user   %nice    %sys %iowait %idle

           0.00    0.01    0.02    0.08 99.89


Device:     tps      Blk_read/s      Blk_wrtn/s   Blk_read   Blk_wrtn

sdj           0.06        57.76              0.00        15222123         72

sdj           0.00         0.00                 0.00              0             0

sdj           0.00         0.00              0.00               0              0

sdj          98.00     102400.00         0.00       102400           0

sdj         298.00    305152.00         0.00       305152           0

sdj         303.00    309248.00         0.00       309248           0

sdj         303.00    311296.00         0.00       311296           0

sdj         301.00    307200.00         0.00       307200           0

sdj         302.00    309248.00         0.00       309248           0

sdj         302.00    309248.00         0.00       309248           0

sdj         141.00    143360.00         0.00       143360           0

几个概念。。

tps:Transfer per second

Blk_read/s:blk read per second

Blk_Wrtn/s:blk write per second

Blk_read:从开机至now总共读了多少Blk

每次读多少K可以这样计算

每秒钟读多少块/每秒钟传输多少次=每次传输多少块

每次传输的块数x 512 bytes/block =每次传输的Bytes

每次传输的Bytes/1024byte/k=每次读多少K

311296 Blk_read/s / (303 tps) = 1027.3 blocks

1027.3 blocks x 512 bytes/block = 526018 bytes

/526018 bytes 1024 bytes/KB = 513KB

约等于512K

裸设备的概念。。。

裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备。本文收集裸设备和Oracle问答20例。


  1.什么叫做裸设备?


  裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备。它由应用程序负责对它进行读写操作。不经过文件系统的缓冲。


  2.如何辨别裸设备?


  在Unix的/dev 目录下,有许多文件,其中有两个大类:字符设备文件和块设备文件。


  字符设备特殊文件进行I/O操作不经过操作系统的缓冲区,而块设备特殊文件用来同外设进行定长的包传输。字符特殊文件与外设进行I/o操作时每次只传输一个字符。而对于块设备特殊文件来说,它用了cache机制,在外设和内存之间一次可以传送一整块数据。裸设备使用字符特殊文件。在/dev 目录下,你可以看到许多这样的文件。


  3.使用裸设备的好处


  因为使用裸设备避免了再经过Unix操作系统这一层,数据直接从Disk到Oracle进行传输,所以使用裸设备对于读写频繁的数据库应用来说,可以极大地提高数据库系统的性能。当然,这是以磁盘的 I/O 非常大,磁盘I/O已经称为系统瓶颈的情况下才成立。如果磁盘读写确实非常频繁,以至于磁盘读写成为系统瓶颈的情况成立,那么采用裸设备确实可以大大提高性能,最大甚至可以提高至40%,非常明显。


  而且,由于使用的是原始分区,没有采用文件系统的管理方式,对于Unix维护文件系统的开销也都没有了,比如不用再维护I-node,空闲块等,这也能够导致性能的提高。


  4.如何决定是否应该使用裸设备?


  判断是否使用裸设备要从以下方面进行考虑:首先,数据库系统本身需要已经被比较好的经过了优化。优化是一门很有些技术的话题,很难简单地讲述。其次,使用Unix命令来辨别是否存在磁盘读写瓶颈。比如Unix的vmstat, sar 等命令都可以较好的进行鉴别。如果决定采用裸设备,需要磁盘上还有空闲的分区。否则,就要新添磁盘,或者对原有系统重新规划。


  5.什么系统必须使用裸设备?


  如果使用了Oracle 并行服务器选项,则必须采用裸设备来存放所有的数据文件,控制文件,重做日志文件。只有把这些文件放到裸设备上,才能保证所有Oracle 实例都可以读取这个数据库的文件。这是由Unix操作系统的特性决定的。


  还有一种情况是,如果你想使用异步I/O,那么在有些Unix上也必须采用裸设备。这个需要参考具体Unix的相关文档。


6.能够使用一个磁盘的第一个分区作为裸设备吗?


  可以,但是不推荐。在Unix的比较旧的版本是银行,磁盘的第一个分区常常包含这个磁盘的一些信息,以及逻辑卷的一些控制信息。若这些部分被裸设备覆盖的话,磁盘就会变得不可识别,导致系统崩溃。


  较新的Unix版本不会发生这样的情况,因为它们采用了更复杂的技术来管理磁盘,逻辑卷的一些信息。


  但是,除非很确信不要使用磁盘的第一个分区来作为裸设备。


  7.我可以把整个裸设备都作为Oracle的数据文件吗?


  不行。必须让数据文件的大小稍微小于该裸设备的实际大小。至少要空出两个oracle块的大小来。


  8.裸设备应该属于那个用户?


  应该由root来创建裸设备,然后再分配给Oracle用户以供使用。同时还要把它归入Oracle用户所在的那个组里边(通常都是DBA)。


  9.在创建数据文件时如何指定裸设备?


  和普通文件没有什么太大的区别,一样都是在单引号里边写上裸设备的详细路径就可以了。举一个例子:要在创建一个表空间,使用两个裸设备,每个分别为30M的大小,Oracle块的大小为4K,可以用下面的命令:

  CREATE TABLESPACE RAW_TS

  DATAFILE ‘/dev/raw1′ size 30712k

  DATAFILE ‘/dev/raw2′ size 30712k;


  10.Oracle块的大小和裸设备有什么关系吗?


  Oracle会必须是裸设备上物理块大小的倍数。


  11.如何在裸设备上进行备份?


  在裸设备上,不能使用Unix实用程序来进行备份,唯一的办法是使用最基本的Unix命令:DD来进行备份。比如:dd if=/dev/raw1 of=/dev/rmt0 bs=16k。dd的具体语法可以参考unix手册,或者联机帮助。你也可以先用dd把裸设备上的数据文件备份到磁盘上,然后再利用Unix实用程序进一步处理。


  12.如果我没有使用Oracle并行服务器选项,我可以在数据库上让一部分数据文件使用文件系统,另一部分使用裸设备吗?


  可以。但是这样的话,会使备份过程更加复杂。


13.我应该把联机重做日志文件放到裸设备上吗?


  这是一个极好的选择。联机重做日志文件是写操作非常频繁的文件,放到裸设备上非常合适。如果你使用了并行服务器选项,那么联机重做日志文件必须放到裸设备上面。


  14.可以把归档日志文件放到裸设备上吗?


  不行。归档日志文件必须放到常规的Unix文件系统上面,或者直接放到磁带上面去。


  15.我可以在裸设备上边放置多个数据文件吗?


  不行。所以你必须在设置裸设备时非常小心。太小的话,会导致空间很快用完,太大的话,空间就白白浪费了。


  16.因应该把几个裸设备放到同一个物理磁盘上吗?


  这样做不好。因为使用裸设备就是为了提高磁盘读写速度。而把多个裸设备放到同一个物理磁盘上会导致读写竞争,这样对于提高I/O速度是不利的。应该尽量分散裸设备到不同的物理磁盘上,最好是分散到不同的磁盘控制器上。这是最佳选择。


  17.需要把所有裸设备都定义成同样的大小吗?


  这不是必须得,但是划分成同样的大小对于管理数据库比较有利。


  18.为了在Unix上使用裸设备,我需要改变Unix核心参数吗?


  不需要。但可以选择减小缓冲区的大小,如果没有别的应用也在同一台Unix机器上运行。因为运用了裸设备以后,不再使用Unix的系统缓冲区。


  19.为了提高读写速度,在操作系统级别上,还有什么办法可以采取吗?


  使用RAID(廉价冗余磁盘阵列)也是非常有效的办法,尤其实那种读写非常频繁的系统。


  20.在考虑了以上所有方面后,还能有什么办法可以提高性能的吗?


  这就需要对Oracle 进行优化,并且购买更多的磁盘和磁盘控制器,来分散I/O到不同的磁盘上。

Linux内核中的进程组及会话




将阐述Linux内核中的如下几个概念

1) 进程组

2) 会话

3) 控制终端

前面的概念来源于前人,我只是站在前人的肩膀上结合内核中的实现加深概念理解。


1.概念:


a)进程组

Shell 上的一条命令行形成一个进程组

每个进程属于一个进程组

每个进程组有一个领头进程

进程组的生命周期到组中最后一个进程终止, 或加入其他进程组为止

getpgrp: 获得进程组 id, 即领头进程的 pid

setpgid: 加入进程组和建立新的进程组

前台进程组和后台进程组


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

#include <unistd.h>


int setpgid (pid_t pid, pid_t pgid);

pid_t getpgid (pid_t pid);

int setpgrp (void);

pid_t getpgrp (void);

——————————————————————————-

进程只能将自身和其子进程设置为进程组 id.

某个子进程调用 exec 函数之后, 就不能再将该子进程的 id 作为进程组 id.

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


b)会话

一次登录形成一个会话

一个会话可包含多个进程组, 但只能有一个前台进程组.

setsid 可建立一个新的会话

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

#include <unistd.h>


pid_t setsid(void);

——————————————————————————-

如果调用进程不是进程组的领头进程, 该函数才能建立新的会话.

调用 setsid 之后, 进程成为新会话的领头进程.

进程成为新进程组的领头进程.

进程失去控制终端

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


c)控制终端

会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端 (SVR4/Linux)

与控制终端建立连接的会话领头进程称为控制进程 (session leader)

一个会话只能有一个控制终端

产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程

终端上的连接断开时 (比如网络断开或 Modem 断开), 挂起信号将发送到控制进程(session leader)


2. Linux中的实现举例,用以验证上述规则:


asmlinkage long sys_getpgid(pid_t pid)

{

if (!pid) {

return current->pgrp;

} else {

int retval;

struct task_struct *p;


read_lock(&tasklist_lock);

p = find_task_by_pid(pid);


retval = -ESRCH;

if (p)

retval = p->pgrp;

read_unlock(&tasklist_lock);

return retval;

}

}


/*

* This needs some heavy checking …

* I just haven’t the stomach for it. I also don’t fully

* understand sessions/pgrp etc. Let somebody who does explain it.

*

* OK, I think I have the protection semantics right…. this is really

* only important on a multi-user system anyway, to make sure one user

* can’t send a signal to a process owned by another. -TYT, 12/12/91

*

* Auch. Had to add the ‘did_exec’ flag to conform completely to POSIX.

* LBT 04.03.94

*/


asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)

{

struct task_struct * p;

int err = -EINVAL;


if (!pid)

pid = current->pid;

if (!pgid)

pgid = pid;

if (pgid < 0)

return -EINVAL;


/* From this point forward we keep holding onto the tasklist lock

* so that our parent does not change from under us. -DaveM

*/

read_lock(&tasklist_lock);


/*第一前提: 先要验证要设定的进程是否存在,不存在的话不能做事*/

err = -ESRCH;

p = find_task_by_pid(pid);

if (!p)

goto out;


/* 第二前提: 先要检查做这个操作的权限:

当前进程只能将自身和其子进程设置为进程组id,并且

当前进程和其子进程必须属于同一次会话

(同组的进程一定属于同一次会话)

*/

if (p->p_pptr == current || p->p_opptr == current)

{

err = -EPERM;


/*如果不属于同一次会话(同一次控制台),不可以*/

if (p->session != current->session)

goto out;

err = -EACCES;


/*某个子进程调用 exec 函数之后, 就不能再将该子进程的 id 作为进程组 id*/

if (p->did_exec)

goto out;

}

else if (p != current)

goto out;


err = -EPERM;


/*boolean value for session group leader */

/*如果是一次会话的leader,也不可以

注意进程组的首领进程也是可以改变组id的*/

if (p->leader)

goto out;


/*好!几个前提条件全满足了,要做正事了:

但是是不是组号的合法性还没有验证?见后话!*/


/*要设进程号不是要设定的组号,如果是,直接设,因为这

意味着是增加了以自己的pid作为新的组号的进程组,这个

进程也将成为新进程组的首领进程,所以在此根本不用比较

会话号,自己对自己肯定是同一次会话.如果条件不满足,则

要做这些判断*/

if (pgid != pid)

{

struct task_struct * tmp;

for_each_task (tmp)

{

/*能不能找到一个进程,组号正好是要设定的组号,

并且和要设定的进程属于同一个控制台(同一个会话)

找到才可以设定,其实这里就是要判定组号的合法性,

即必须是一个已经存在的组,而且和当前同一次会话才

可以操作,这个也不能忘记,其实就是说:同组的进程

一定属于同一次会话*/

if (tmp->pgrp == pgid &&

tmp->session == current->session)

goto ok_pgid;

}


goto out;

}


ok_pgid:

p->pgrp = pgid;

err = 0;

out:

/* All paths lead to here, thus we are safe. -DaveM */

read_unlock(&tasklist_lock);

return err;

}


asmlinkage long sys_getsid(pid_t pid)

{

if (!pid) {

return current->session;

} else {

int retval;

struct task_struct *p;


read_lock(&tasklist_lock);

p = find_task_by_pid(pid);


retval = -ESRCH;

if(p)

retval = p->session;

read_unlock(&tasklist_lock);

return retval;

}

}


asmlinkage long sys_setsid(void)

{

struct task_struct * p;

int err = -EPERM;


read_lock(&tasklist_lock);

for_each_task(p)

{

/*如果当前进程是一个进程组的首领进程,

则不能建立一个新的会话*/

if (p->pgrp == current->pid)

goto out;

}


/*将新创建会话的leader设定为创建者就是当前进程*/

current->leader = 1;


/*清楚看见一个新的进程组诞生了

当前进程成为新进程组的首领进程

新会话的id 是当前进程号,也是新会话的leader

*/

current->session = current->pgrp = current->pid;


/*当前进程失去控制终端*/

current->tty = NULL;

current->tty_old_pgrp = 0;

err = current->pgrp;

out:

read_unlock(&tasklist_lock);

return err;


}