日记

  1. 最新日记

  2. 日记

    1. 我的日记
    2. 我的文章
    3. 网上转载
 

最新日记

大家是不是为了不会设置bios而烦恼,不用怕,以后我们不用bios了,我们用EFI。windows7系统能全面支持EFI,那么什么是EFI呢。
EFI的英文全称是Extensible Firmware Interface,中文名是可扩展固件接口,早在2006年的上半年,Intel曾经在IDF上进行过EFI的演示。要使用EFI系统,必须主板和操作系统都支持EFI功能,目前支持EFI功能的操作系统有Mac OS X、Vista和Server 2003。
EFI工作原理简介
EFI在开机时的作用和BIOS一样,就是初始化PC,但在细节上却又不一样。BIOS对PC的初始化,只是按照一定的顺序对硬件通电,简单地检查硬件是否能工作,而EFI不但检查硬件的完好性,还会加载硬件在EFI中的驱动程序,不用操作系统负责驱动的加载工作。 EFI的最革命之处,是颠覆了BIOS的界面概念,让操作界面和Windows一样易于上手。在EFI的操作界面中,鼠标成为了替代键盘的输入工具,各功能调节的模块也做的和Windows程序一样,可以说,EFI就是一个小型化的Windows系统。
对于操作系统来说,如果主板使用的是BIOS,那么操作系统就必须面对所有的硬件,大到主板显卡,小到鼠标键盘,每次重装系统或者系统升级,都必须手动安装新的驱动,否则硬件很可能无法正常工作。而基于EFI的主板则方便很多,因为EFI架构使用的驱动基于EFI Byte Code。EFI Byte Code有些类似于Java的中间代码,并不由CPU直接执行操作,而是需要EFI层进行翻译。对于不同的操作系统来说,EFI将硬件层很好地保护了起来,所有操作系统看到的,都只是EFI留给EFI Byte Code的程序接口,而EFI Byte Code又直接和Windows的API联系,这就意味着无论操作系统是Windows还是Linux,只要有EFI Byte Code支持,只需要一份驱动程序就能吃遍所有操作系统平台。
更为神奇的是,EFI Byte Code驱动还能绕过操作系统,直接安装在EFI环境中,这样对硬件的控制就由EFI层负责,EFI向操作系统直接提供硬件操作的接口,不需要操作系统再调用驱动。这种方式的优点是不需要进入操作系统,只需要进入EFI界面,更新驱动程序就可以完成,而且不需要对每一个操作系统进行驱动升级,只要EFI界面中升级一次,所有上层的操作系统都可以直接调用新的EFI接口。
EFI在开机之始就能够驱动所有的硬件,网络当然也不会例外,所以在EFI的操作界面中,程序可以直接连接上互联网,向外界求助操作系统的维修信息或者在线升级驱动程序。
既然EFI功能那么强大,那它存放在什么地方?是存放在原来的BIOS芯片中吗?答案当然是No。BIOS芯片只有256KB,远远不够EFI使用。EFI是以小型磁盘分区的形式存放在硬盘上的。EFI的安装,必须在支持EFI功能的主板上,使用光驱引导系统,然后对磁盘进行EFI化的处理,这个处理的过程,主要就是划分EFI独用的磁盘空间。
EFI的存储空间大约为50MB到100MB,具体视驱动文件多少而定。在这部分空间中,包含以下几个部分:
  • 1. Pre-EFI初始化模块
  • 2. EFI驱动执行环境
  • 3. EFI驱动程序
  • 4. 兼容性支持模块(CSM)
  • 5. EFI高层应用
  • 6. GUID 磁盘分区
在实现中,EFI初始化模块和驱动执行环境通常被集成在一个只读存储器中。Pre-EFI初始化程序在系统开机的时候最先得到执行,它负责最初的CPU、北桥、南桥、内存和硬盘的初始化工作,紧接着载入EFI驱动。当EFI驱动程序被载入运行后,系统便具有控制所有硬件的能力。在EFI规范中,一种突破传统MBR磁盘分区结构限制的GUID磁盘分区系统(GPT)被引入,新结构中,磁盘的分区数不再受限制(在MBR结构下,只能存在4个主分区),并且分区类型将由GUID来表示。在众多的分区类型中,EFI系统分区可以被EFI系统存取,用于存放部分驱动和应用程序。CSM是在x86平台EFI系统中的一个特殊的模块,它将为不具备EFI引导能力的操作系统提供类似于传统BIOS的系统服务。
由于EFI驱动开发简单,所有的硬件厂商都可以参与,为自家的硬件定制最为合适的驱动。基于EFI的驱动模型可以使EFI系统接触到所有的硬件功能,不进入操作操作系统就浏览网站不再是天方夜谭,甚至实现起来也非常简单。这对基于传统BIOS的系统来说是件不可能的任务,在BIOS中添加几个简单的USB设备支持都曾使很多BIOS设计师痛苦万分,更何况除了添加对无数网络硬件的支持外,还得凭空构建一个16位模式下的TCP/IP协议。

很多人担心EFI这种开放的模式将会导致新的安全隐患,因为EFI系统比传统的BIOS更易于受到计算机病毒的攻击,当一部分EFI驱动程序被破坏时,系统有可能面临无法引导的情况。实际上,系统引导所依赖的EFI驱动部分通常都不会存放在EFI的GUID分区中,即使分区中的驱动程序遭到破坏,也可以用简单的方法得到恢复,因为只读芯片中的EFI代码足够用来引导计算机从光驱启动,此时插入EFI的安装盘,对EFI的系统存储区域进行修复或者覆盖安装,就能将PC恢复到正常。而且这个修复过程对操作系统来说,等于是从两台配置一模一样配置机器中的一台转移到另一台,并不会出现需要重新识别硬件的情况。 EFI在概念上非常类似于一个低等级的操作系统,并且具有操控所有硬件资源的能力。不少人感觉它的不断发展将有可能代替现代的操作系统。事实上,EFI的缔造者们在第一版规范出台时就将EFI的能力限制于不足以威胁操作系统的统治地位。首先,它只是硬件和操作系统间的接口规范;其次,EFI环境下不提供中断的访问机制,也就是说每个EFI驱动程序必须用轮询的方式来检查硬件状态,并且需要以解释的方式运行,较操作系统下的驱动效率低得多;第三,EFI系统不提供复杂的存储器保护功能,它只具备简单的存储器管理机制,具体来说就是指运行在x86处理器的段保护模式下,以最大寻址能力为限把存储器分为一个平坦的段,所有的程序都有权限存取任何一段位置,并不提供真实的保护服务。
EFI的命令行控制模式
EFI的设计架构中,一旦引导软件将控制权交给操作系统,所有用于引导的服务代码将全部停止工作,部分运行时代服务程序还可以继续工作,以便于操作系统一时无法找到特定设备的驱动程序时,该设备还可以继续被使用。EFI的程序只限于类似Java伪执行文件的能力,并没有直接访问磁盘所有资源的能力,而且在进入操作系统后的大多数情况下,EFI部分的代码都进入沉睡模式,即使有针对EFI的病毒,也无法造成进一步的影响。
EFI的出现,可以说是充分弥补了BIOS原有的不足。因为BIOS过于自信芯片的安全,所以当遇上CIH病毒,启动机制也被完全破坏。而EFI将主要程序文件放在了硬盘上,被破坏了还可以使用光盘进行维修,对操作系统而言,这种“破坏-维修”的方式是完全透明的,不会影响操作系统的使用。虽然看起来EFI更容易受到损坏,但也更为易于修复。
BIOS在经历了十几年发展之后,也终于走到了尽头,外观上的落后、功能上的羸弱、安全上的薄弱、性能上的不足,都严重制约着它的进一步发展。虽然在这些日子里,BIOS能够带给我们基本的功能,但PC要进步,就必须寻求更高更好的技术。
EFI作为BIOS的替代者,无论是界面、功能还是安全性,都要远远高于后者,而且作为未来主板的趋势所向,EFI上能执行的程序会越来越多,EFI能够提供的基本功能也就越来越强。今天,微星在CES展会上展示了EFI主板的强大,因为和普通BIOS主板在设计难度以及生产兼容性上并不冲突,所以可以相信,拥有诸多优点的EFI会取代BIOS,让PC越来越易于使用。

Intel作为EFI大力的推广者和制定者,能看到EFI逐渐从服务器平台走向桌面级市场,其中辛酸甘苦只有自己才知道。从初期厂商对EFI的概念毫无兴趣,到今天各大BIOS提供商如Phoenix, AMI等,原先被认为是EFI发展的阻碍力量,现在也不断的推出各自的解决方案。支持EFI功能的主板也逐渐退出。一切的一切,都似乎预示着我们可以和BIOS说声再见,让技术的进步来记录历史。

Ubuntu自动启动程序
2011-09-07 22:29

首先,linux随机启动的服务程序都在/etc/init.d这个文件夹里,里面的文件全部都是脚本文件(脚本程序简单的说就是把要运行的程序写到一个 文件里让系统能够按顺序执行,类似windows下的autorun.dat文件),另外在/etc这个文件夹里还有诸如名为rc1.d, rc2.d一直到rc6.d的文件夹,这些都是linux不同的runlevel,我们一般进入的X windows多用户的运行级别是第5级,也就是rc5.d,在这个文件夹下的脚本文件就是运行第5级时要随机启动的服务程序。需要注意的是,在每个rc (1-6).d文件夹下的文件其实都是/etc/init.d文件夹下的文件的一个软连接(类似windows中的快捷方式),也就是说,在 /etc/init.d文件夹下是全部的服务程序,而每个rc(1-6).d只链接它自己启动需要的相应的服务程序! 
要启动scim(某一程序),我们首先要知道scim程序在哪里,用locate命令可以找到,scim在/usr/bin/scim这里,其中usr表 示是 属于用户的,bin在linux里表示可以执行的程序。这样,我就可以编写一个脚本程序,把它放到/etc/init.d里,然后在rc5.d里做一个相 应的软链接就可以了。
这个脚本其实很简单,就两行:
#!/bin/bash
/usr/bin/scim
第一行是声明用什么终端运行这个脚本,第二行就是要运行的命令。
还需要注意的一点是,在rc5.d里,每个链接的名字都是以S或者K开头的,S开头的表示是系统启动是要随机启动的,K开头的是不随机启动的。这 样,你就可以知道,如果我要哪个服务随机启动,就把它名字第一个字母K改成S就可以了,当然,把S改成K后,这个服务就不能随机启动了。因此,我这个链接 还要起名为SXXX,这样系统才能让它随机启动。
在RH下,rc.local是默认启动的最后一个脚本文件,所以,
如果你想要随机启动,还有一种方法就是在rc.local的尾部加入/usr/bin/scim,这样就可以了。

    因工作原因,需要在单位共享的samba目录下修改模版, 每次开机都要挂载samba盘, 太麻烦了, 于是想写个脚本开机启动, google之, 相关内容不少, 测试成功记录如下:

    1.在帐号目录下建立initct.sh脚本文件:
 
mount -t smbfs -o username='username',password='password' //192.168.0.x/aaa /home/ct/work/files

    smbfs是samba共享的文件格式, ubuntu可以通过
apt-get install smbfs
命令来安装
    2.将该脚本软链接到/etc/init.d目录下:
 
sudo ln -s /home/chentuo/etc/initct.sh /etc/init.d/

    3.更新init.d启动项:
 
sudo update-rc.d initct.sh defaults 99

    这里initct.sh是上一步软链接的名字, 99是启动顺序,如果脚本需要使用网络,那么这个值最好设置的大些,99是上限
    4.重启, over.


Ubuntu开机自动启动Script

实现目标:
(1).在Ubuntu启动时,自动运行位于普通用户test1根目录下的脚本程序start.py,该程序会在每次执行时自动向本地日志文件追加一条记录,源码如下:

from datetime import datetime
now=datetime.now()
f=open('test1.log','a')
f.write('%s '%now)
f.close()
Ubuntu在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以把启动任务放到该目录下:
  1、init.d目录下都为可执行程序,他们其实是服务脚本,按照一定格式编写,Ubuntu在启动时会自动执行,类似Windows下的服务
  2、用root帐号登录,vi /etc/rc.d/init.d/mystart,追加如下内容:

#!/bin/bash
#chkconfig:2345 80 05 --指定在哪几个级别执行,0一般指关机,
6指的是重启,其他为正常启动。80为启动的优先级,05为关闭的优先机
#description:mystart service
RETVAL=0
start(){ --启动服务的入口函数
echo -n "mystart serive ..."
cd /home/test1
su test1 -c "python /home/test1/test.py"
}
stop(){ --关闭服务的入口函数
echo "mystart service is stoped..."
}
case $1 in --使用case,可以进行交互式操作
start)
start
;;
stop)
stop
;;
esac
exit $RETVAL

    3、运行chmod +r /etc/rc.d/init.d/mystart,使之可直接执行
  4、运行chkconfig --add mystart,把该服务添加到配置当中
  5、运行chkconfig --list mystart,可以查看该服务进程的状态

UBUNTU添加开机自动启动程序方法


1. 开机启动时自动运行程序
  Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置
  文件继续引导过程,启动其它进程。通常情况下,修改放置在
    /etc/rc或
    /etc/rc.d 或
    /etc/rc?.d
  目录下的脚本文件,可以使init自动启动其它程序。例如:编辑
    /etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本),
  在文件最末加上一行“xinit”或“startx”,可以在开机启动后直接进入X-Window。

2. 登录时自动运行程序

  用户登录时,bash先自动执行系统管理员建立的全局登录script :
    /ect/profile
  然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:
    /.bash_profile、
    /.bash_login、
    /.profile,
  但只执行最先找到的一个。因此,只需根据实际需要在上述文件中加入命令就可以实
  现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。

3. 退出登录时自动运行程序
  退出登录时,bash自动执行个人的退出登录脚本
    /.bash_logout。
  例如,在/.bash_logout中加入命令“tar -cvzf c.source.tgz *.c”,则在每次退出
  登录时自动执行 “tar” 命令备份 *.c 文件。

4. 定期自动运行程序
  Linux有一个称为crond的守护程序,主要功能是周期性地检查 /var/spool/cron目录
  下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过
  crontab 命令来建立、修改、删除这些命令文件。

  例如,建立文件crondFile,内容为“00 9 23 Jan * HappyBirthday”,运行“crontab
  cronFile”命令后,每当元月23日上午9:00系统自动执行“HappyBirthday”的程序(“*
  ”表示不管当天是星期几)。

5. 定时自动运行程序一次
  定时执行命令at 与crond 类似(但它只执行一次):命令在给定的时间执行,但不自
  动重复。at命令的一般格式为:at [ -f file ] time ,在指定的时间执行file文件
  中所给出的所有命令。也可直接从键盘输入命令:
    $ at 12:00
    at>mailto Roger -s ″Have a lunch″ < plan.txt
    at>Ctr-D
    Job 1 at 2000-11-09 12:00
  2000-11-09 12:00时候自动发一标题为“Have a lunch”,内容为plan.txt文件内容
  的邮件给Roger.
ubuntu 自添加开机启动程序
ubuntu (我的是 9.10)的开机启动会和 redhat suse 这些发行版会稍有差别,比如默认情况下没有 /etc/inittab 的配置文件,redhat 发行版在启动级别 3 上是文本模式登录,而 ubuntu 的启动级别2~5 都是一样的启动。现在,添加一个自定义的可执行文件或脚本,使其在开机启动时执行。

以一个脚本为例,脚本的内容很简单 :
引用
#! /bin/sh

echo "hello start up script!" > /home/beyes/mystart.txt

exit 0


这个脚本的作用只是在我的家目录里建立一个文本文件,里面的内容就是 echo 后的内容hello start up script!。

编辑好这个脚本后,给其赋予相应的可执行文件,为了方便,就 chmod 777 /etc/init.d/mystart

接着在 /etc/rc5.d 这个目录下做一个软链接:  ln -s /etc/init.d/mystart /etc/rc5.d/S99mystart

那么,这个脚本开机启动生效了么?经过重启后,并没有发现在 /home/beyes 目录下生成 mystart.txt 文件。

使用 sysv-rc-conf 配置一下启动服务:(先要安装:sudo apt-get install sysv-rc-conf)
图,在第 2 运行级别也配置了让 mystart 启动。这个 sysv-rc-conf 会读取 /etc/init.d 里的文件以及 rcx.d (x为运行级别)下的软连接等信息。关于更多管理启动项的更多信息见:
http://www.groad.net/bbs/read.php?tid-1392.html

配 置完后,重启。再到 /home/beyes 里查看,生成了 mystart.txt 文件,里面也有相应的内容。从这里,也看到了 ubuntu 默认的启动运行级别为 2 。另外,在 /etc/rc2.d 目录下,也发现了由 sysv-rc-conf 生成的软连接: S99mystart

1. 开机启动时自动运行程序

Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在

/etc/rc或

/etc/rc.d 或

/etc/rc?.d

目录下的脚本文件,可以使init自动启动其它程序。例如:编辑/etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本),在文件最末加上一行“xinit”或“startx”,可以在开机启动后直接进入X-Window。
2. 登录时自动运行程序

用户登录时,bash先自动执行系统管理员建立的全局登录script :

/ect/profile

然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:

/.bash_profile、

/.bash_login、

/.profile,

但只执行最先找到的一个。因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。

3. 退出登录时自动运行程序

退出登录时,bash自动执行个人的退出登录脚本

/.bash_logout。

例如,在/.bash_logout中加入命令“tar -cvzf c.source.tgz *.c”,则在每次退出登录时自动执行 “tar” 命令备份 *.c 文件。

4. 定期自动运行程序

Linux有一个称为crond的守护程序,主要功能是周期性地检查 /var/spool/cron目录下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过crontab 命令来建立、修改、删除这些命令文件。

例如,建立文件crondFile,内容为“00 9 23 Jan * HappyBirthday”,运行“crontabcronFile”命令后,每当元月23日上午9:00系统自动执行“HappyBirthday”的程序(“*”表示不管当天是星期几)。

5. 定时自动运行程序一次

定时执行命令at 与crond 类似(但它只执行一次):命令在给定的时间执行,但不自动重复。at命令的一般格式为:at [ -f file ] time ,在指定的时间执行file文件中所给出的所有命令。也可直接从键盘输入命令:

$ at 12:00

at>mailto Roger -s ″Have a lunch″ < plan.txt

at>Ctr-D

Job 1 at 2000-11-09 12:00

2000-11-09 12:00时候自动发一标题为“Have a lunch”,内容为plan.txt文件内容的邮件给Roger.

Ubuntu下添加开机启动脚本

Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本。

当然要添加到语句:exit 0 前面才行。

如:

sudo vi /etc/rc.local

然后在 exit 0 前面添加好脚本代码。

后续有空再研究下添加一个Ubuntu的开机启动服务看看。

如果要添加为开机启动执行的脚本文件,可先将脚本复制或者软连接到/etc/init.d/目录下,然后用:update-rc.d xxx defaults NN命令(NN为启动顺序),将脚本添加到初始化执行的队列中去。

注意如果脚本需要用到网络,则NN需设置一个比较大的数字,如98 。

理论上应该适用于virtualbox里所有linux操作系统命令行下增强工具包的安装。



假设你已在虚拟机里装完Debian6并且已经搞定网络问题。



1、点击虚拟机菜单栏“设备->分配数据空间”,固定分配一个文件夹,比如分配名为share的文件夹,该文件夹存在于物理机上,进一步设置后将由你的虚拟机和物理机共享。

2、获取root权限:

su                                                                                                                                                                                                               
安装基本编译环境和内核头文件(可能还要bzip2):

apt-get  install bzip2 

apt-get  install  linux-headers-`uname -r`  build-essential                                                                                                                 



3、点击虚拟机菜单栏“设备->安装增强工具”。



4、挂载并安装增强工具包

mount  /dev/cdrom  /media/cdrom     
cd  /media/cdrom0
sh  ./VBoxLinuxAdditions.run                                                                                                                                                                 


5、此时增强工具包应该已经装上了,现在在任意目录下建立一个共享文件夹,比如在你用户名叫debian,在你家目录下建立一个vshare文件夹。

mkdir  /home/debian/vshare                                                                                                                                                                   


6、把数据空间挂载到vshare上,就是我在第一步中物理机里的share文件夹
mount  -t  vboxsf share /home/debian/vshare                                                                                                                                       
现在你往物理机share文件夹里放的东西,就可以在虚拟机里的vshare文件夹看到啦,反之亦然。不过,你每次开虚拟机都要这样挂载一遍才可以,你可以写个自启动脚本让系统自动挂载。

(完)

理解 chroot
2011-09-05 09:27

什么是 chroot
chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。

图 1. Linux 系统的目录结构


为何使用 chroot
在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:
增加了系统的安全性,限制了用户的权力;
在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。
建立一个与原系统隔离的系统目录结构,方便用户的开发;
使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
切换系统的根目录位置,引导 Linux 系统启动以及急救系统等。
chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。
chroot 的使用
为了更好的理解 chroot 发挥的作用,我们将尝试指定一个特定的位置进行根目录切换。但是由于在经过 chroot 之后,系统读取到的 bin/ 等与系统相关目录将不再是旧系统根目录下的,而是切换后新根下的目录结构和文件,因此我们有必要准备一些目录结构以及必要的文件。
清单 1. 准备切换的目录结构
$ pwd
/home/wstone/Build/work
$ tree .
.
|-- bin
| |-- ash -> busybox
| |-- bash
| `-- busybox
|-- etc
`-- newhome
这里使用了静态编译后的 busybox 来提供必要的命令,使用静态编译仅是为了避免动态库文件的拷贝。当然我们也可以拷贝旧系统的下的命令到新的目录结构中使用,但是那些命令通常是动态编译的,这就意味着我们不得不拷贝相关的动态库文件到相应的目录结构中。同时这里的 bash 也非真正的 Bourne Again shell,而是一个执行 ash 的 shell 脚本。在清单 2中,展示了位于旧系统中的 chroot 命令的使用。需要注意的是在使用 chroot 时,要求拥有相关的操作权限。

清单 2. 位于系统中的 chroot 的使用
$ pwd
/home/wstone/Build/work

# chroot .
# pwd
/

# ls
ash: ls: not found

# busybox ls
bin      etc      newhome

3 directories, 3 files


我们可以看到当前路径(/home/wstone/Build/work/),在经过 chroot 后转变成了 `/` 目录,同时从新根下读取了与系统相关的目录结构。使用 ls 命令失败是由于我们创建的测试目录结构中并没有包含命令 ls,但是我们成功的使用了 busybox 中的 ls。以上看到的只是 chroot 的一种使用方式,其实标准的 chroot (Coreutils - GNU core utilities 提供的 chroot)使用方式有2种:

清单 3. 标准 chroot 的2种使用方式

[1] chroot NEWROOT [COMMAND...]
[2] chroot OPTION


刚才我们使用的是方式[2]。这将在没有给定环境时,默认执行 `/bin/sh`,但是当给定环境后,将运行 `${SHELL} –i`,即与环境相同的可交互的 shell。我们的目录结构中并没有包含sh,显然清单 2中的 chroot 运行了 `${SHELL} –i`。当然我们也可以在进行切换时指定需要的命令,即使用方式[1]。
清单 4. chroot 另一种方式的使用

# chroot . /bin/ash
#
在清单 4 中,尝试了在经过 chroot 后,执行新目录结构下的 ash shell。不得不说的是,如果新根下的目录结构和文件准备的够充分,那么一个新的简单的 Linux 系统就可以使用了。其实更为常见的是在初始 RAM 磁盘 (initrd)中使用 chroot,以此来执行系统的 init。清单 5 中,展示的是在 Linux 2.4 内核 initrd 中使用 chroot。

清单 5. 在 Linux 2.4 内核 initrd 中使用 chroot 的示例

mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . /sbin/init <dev/console >dev/console 2>&1
umount /old-root


由于 Linux 内核的升级,initrd 处理机制和格式发生了变化,在 Linux 2.6 内核 initrd 中不能再使用 pivot_root,因此一般也不再使用 chroot,而是选择使用 busybox 提供的 switch_root 或者 klibc 提供的 run-init 进行根目录的切换。(这并不是说不能在 Linux 2.6内核 initrd 中使用 chroot,选择 switch_root 或 run-init 仅是出于习惯和方便的考虑。)但是实质上,它们仅是将 chroot 的功能进行了封装,以此更加方便简单的切换根目录。

清单 6. 在 Linux 2.6 内核 initrd 中 chroot 的使用

[1] find -xdev / -exec rm '{}' ';
[2] cd /newmount; mount --move . /; chroot .


switch_root 和 run-init 完成了类似清单 6中的功能,删除 rootfs 的全部内容以释放空间,以及挂载新的根文件系统并进行切换。在 busybox 和 klibc中也有提供 chroot 命令,只是功能上与 Coreutils (GNU core utilities) 包含的 chroot 有稍许差异。
回页首
编写一个 chroot
上面介绍了 chroot 及其使用,但是编写一个简单的 chroot 并不复杂,下面我们就尝试编写chroot 以此来更好的认识 chroot 的处理过程,先编写一个粗略的 chroot 然后再完善它的功能。chroot 的编写涉及了2个函数,chroot() 以及 chdir(),它们都包含在 unistd.h 头文件中。

清单 7. 编写 chroot 涉及的2个函数

#include <unistd.h>
int chroot(const char *path);
int chdir(const char *path);


chroot() 将切换参数 path 所指位置为根目录 (/),chdir() 用来将当前的工作目录改变成以参数path 所指的目录。以此我们可以编写一个非常粗略的 `chroot`。

清单 8. 粗略的 `chroot`

#include <unistd.h>

int main(int argc, char *argv[])
{
    chroot(".");
    chdir("/");

    char *arrays[]={"ash",NULL};
    execvp("ash", arrays);

    return 0;
}


这个粗略的 `chroot` 仅能切换当前位置为根目录,同时默认执行 ash shell,不包含任何的错误处理及警告。编写并保存代码为 test.c。在清单 9 中,展示了这个粗略 `chroot` 的使用情况,成功的进行了根目录的切换。

清单 9. 粗略 `chroot` 的使用

$ gcc -Wall test.c -o test

# ./test
# ls
ash: ls: not found

# busybox ls
bin      etc      newhome  test    test.c


下面给出功能将近完整的 chroot ,加上了一些错误处理并新增了可执行指定命令的功能。当在没有给出 chroot 切换后要执行的命令时,默认执行 `/bin/sh`,同时检测环境以确认使用何种 shell。

清单 10. 功能完整的 chroot

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if(argc<2){
        printf("Usage: chroot NEWROOT [COMMAND...] \n");
        return 1;
    }

    printf("newroot = %s\n", argv[1]);
    if(chroot(argv[1])) {
        perror("chroot");
        return 1;
    }

    if(chdir("/")) {
        perror("chdir");
        return 1;
    }

    if(argc == 2) {
        argv[0] = getenv("SHELL");
        if(!argv[0])
            argv[0] = (char *)"/bin/sh";

        argv[1] = (char *) "-i";
        argv[2] = NULL;
    } else {
        argv += 2;
    }

    execvp (argv[0], argv);
    printf("chroot: cannot run command `%s`\n", *argv);

    return 0;
}


保存以上代码为 newchroot.c 文件,编译后运行测试其功能。最后要指出的是,本文中的 `chroot` 并没有使用静态编译。如果有必要(如,在 initrd 中使用 chroot),chroot 应该使用静态编译,若是使用动态编译,那么要拷贝相关的动态库文件到相应目录结构中。

清单 11. `newchroot` 的测试

$ gcc -Wall newchroot.c -o newchroot

# ./newchroot . /bin/ash
newroot = .
#



回页首
结束语
在 Linux 系统初始引导的过程中,通常都有使用 chroot。但是 chroot 的好处不仅于此,它还增加了系统的安全性等。而通过本文后半部分对 chroot 的认识,我相信读者可以更好的发挥chroot 的作用。

fstab文件详解
2011-09-05 09:25

1 fstab文件的作用

文件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过mount /directoryname命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命令都利用该程序。

2. fstab文件格式

下面是/etc/fatab文件的一个示例行:

fs_spec fs_file fs_type fs_options fs_dump fs_pass

/dev/hda1 / ext2 defaults 1 1

fs_spec - 该字段定义希望加载的文件系统所在的设备或远程文件系统,对于一般的本地块设备情况来说:IDE设备一般描述为/dev/hdaXN,X是IDE设备通道(a, b, or c),N代表分区号;SCSI设备一描述为/dev/sdaXN。对于NFS情况,格式一般为:

,例如:`knuth.aeb.nl:/。对于procfs,使用`proc来定义。

fs_file - 该字段描述希望的文件系统加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。

fs_type - 定义了该设备上的文件系统,一般常见的文件类型为ext2 (Linux设备的常用文件类型)、vfat(Windows系统的fat32格式)、NTFS、iso9600等。

codepage国家语言代码页

iocharset字符集

fs_options - 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用defaults就可以满足需要。其他常见的选项包括:

选项 含义

ro 以只读模式加载该文件系统

sync 不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度

user 允许普通用户加载该文件系统

quota 强制在该文件系统上进行磁盘定额限制

noauto 不再使用mount -a命令(例如系统启动时)加载该文件系统

fs_dump - 该选项被dump命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0

fs_pass - 该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0

 

3. 示例文件

# /etc/fstab

/dev/hda8 swap swap defaults 0 0

/dev/hda9 / ext2 defaults 1 1

/dev/hda6 /wine vfat defaults,codepage=936,iocharset=cp936 0 0

/dev/hda7 /winf vfat defaults,codepage=936,iocharset=cp936 0 0

/dev/hdb /cdrom iso9660 noauto,user 0 0

none /proc proc defaults 0 0

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


fstab中存放了与分区有关的重要信息,其中每一行为一个分区记录,每一行又可分为六个部份,下面以/dev/hda7 / ext2 defaults 1 1为例逐个说明:

  1. 第一项是您想要mount的储存装置的实体位置,如hdb或/dev/hda6。

  2. 第二项就是您想要将其加入至哪个目录位置,如/home或/,这其实就是在安装时提示的挂入点。

  3. 第三项就是所谓的local filesystem,其包含了以下格式:如ext、ext2、msdos、iso9660、nfs、swap等,或如ext2,可以参见/prco/filesystems说明。

  4. 第四项就是您mount时,所要设定的状态,如ro(只读)或defaults(包括了其它参数如rw、suid、exec、auto、nouser、async),可以参见「mount nfs」。

  5. 第五项是提供DUMP功能,在系统DUMP时是否需要BACKUP的标志位,其内定值是0。

  6. 第六项是设定此filesystem是否要在开机时做check的动作,除了root的filesystem其必要的check为1之外,其它皆可视需要设定,内定值是0。

本文只写一下搭建基本服务器的部分。发行版我选择的是 Ubuntu,虽然我知道 CentOS 或是 RHEL 可能性能会更好点,但毕竟 Ubuntu 比较熟悉也比较简单。Ubuntu 本身有 Server 版,而且可以几乎无需干预的安装好一台 LAMP Server,但 Linux 本身的乐趣就在于折腾,而且对于服务器我更希望知道到底都有什么东西在跑,所以我决定从搭建一个干净的基本系统开始。经过一番 Google,我找到了一个近乎“完美”的教程:Minimal Ubuntu 8.04 Server Install,下面的安装过程也基本就是按着这个教程来的,稍微改进满足了一下实际需要。

言归正传,开始进入安装。首先,用 Ubuntu 8.04 Desktop Live CD 引导服务器,开一个 Terminal 就可以开工了。

第一步,启动分区工具对硬盘分区。这里我使用的也是 cfdisk (不用 GPart 的原因是因为这台服务器压根就没鼠标 -_-b),对 500G 的硬盘进行了分区。命令如下:

sudo su
cfdisk /dev/sda

首先分出 60MB 主分区用作 /boot,然后分 50GB 逻辑分区作为根分区,4GB 逻辑分区作为交换分区,剩下的分一个分区作为 /home 使用。分好后不要忘了写入分区表。

完成分区之后开始对各个分区进行格式化,为了方便,我只使用了 ext3 这一种格式:

mkfs.ext3 /dev/sda1
mkfs.ext3 /dev/sda5
mkfs.ext3 /dev/sda6
mkswap /dev/sda7

完成分区后可以装基本系统了,这里需要使用 debootstrap,具体命令是:

mkdir /min
mount /dev/sda5 /min
mkdir /min/boot
mount /dev/sda1 /min/boot
mkdir /min/home
mount /dev/sda6 /min/home
apt-get install debootstrap

在执行 debootstrap 之前,建议先进行一下源设置。因为这一步需要下载大量软件,因此选用一个最快的源还是很有必要的。这里我使用的是 cn99 的源:

nano /usr/share/debootstrap/scripts/hardy

找到类似下面的段落(default_mirror),改为您需要的源:

case $ARCH in amd64|i386|sparc)
default_mirror http://ubuntu.cn99.com/ubuntu

然后开始安装最小系统

debootstrap hardy /min

完成后,我们需要对这个系统进行一番设置使其可用。首先我们可以先将一些设置信息直接复制到目标系统中:

cp /etc/hosts /min/etc/
cp /etc/network/interfaces /min/etc/network/
cp /etc/bash_completion /min/etc/
cp /etc/bash.bashrc /min/etc/

此外,我们还需要为光驱进行一些设置:

mkdir -p /min/media/cdrom0
ln -s cdrom0 /min/media/cdrom

建立 fstab:

nano /etc/fstab

fstab 文件的内容大致如下:

proc            /proc          proc    defaults                  0      0
/dev/sda5 /              ext3    relatime                  0      1
/dev/sda1 /boot          ext3    relatime                  0      1
/dev/sda6 /home          ext3    relatime                  0      1
/dev/sda7 none            swap    sw                        0      0
/dev/cdrom      /media/cdrom0  udf,iso9660 user,noauto,exec,utf8  0      0
做完这一步,我的系统基本上就装好了,现在我们就可以 chroot 进去,进行进一步的配置:

mount –bind /dev /min/dev
mount -t proc proc /min/proc
mount -t sysfs sysfs /min/sys
chroot /min

设定时区:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

安装一个文本编辑器,我个人比较喜欢 nano,当然你也可以装 vim:

apt-get install nano

建立源列表,还是填入最快的源:

nano /etc/apt/sources.list

内容如下,使用的是 cn99 的源(我在教育网能到 1M/s 的速度)

deb http://ubuntu.cn99.com/ubuntu hardy main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu hardy-updates main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu hardy-security main restricted universe multiverse
更新源并升级现有软件:

apt-get update
apt-get dist-upgrade

设置 root 用户密码,并新建一个用户,并使它有 sudo 权限:

passwd
adduser liuyang
addgroup admin
adduser liuyang admin
echo “%admin ALL=(ALL) ALL”>>/etc/sudoers

安装 grub,使目标系统可以引导:

apt-get install linux-image-server grub
mkdir /boot/grub
update-grub
update-initramfs -u

目标系统已经设置完毕,现在推出 chroot,完成最后的操作 – 将 grub 装到 /dev/sda 的 MBR 上:

exit
grub-install –root-directory=/min –no-floppy –recheck /dev/sda

重新启动系统,退出 Live CD,如果一切正常的话,你应该可以用一个“干净的” Ubuntu 引导起你的服务器了。


安装前要先分好磁盘分区,已分区的可直接安装。与windows系统相比要增加一个“交换空间”的分区,2G左右。分区格式是fat32还是ext3等无所谓,安装时可以调整格式,建议使用Ubuntu 桌面版光盘中分区工具。
以下安装步骤由于无法截图,见谅,但严格按步骤,读者可对照安装。
插入Ubuntu 11.04服务器版光盘,选安装服务器版 回车 选择简体中文 回车 (以下没有说明都选默认的”继续”回车)
Ubuntu安装程序主菜单 <否>回车 china 回车 china 回车
扫描硬件
多网卡则会出现选择某一网卡界面,选择一个正在使用已连接互联网的网卡,如我的浪潮服务器在第二网卡连接互联网。
配置网络
注意:Ubuntu是一个很依赖网络的Linux发行版本,此处设置最好一次成功。
自动配置网络DHCP(适用网络环境有DHCP服务器的)
如是静态IP地址则选“取消”或“返回” 手动进行网络设置,(建议使用静态IP地址设置)
如下例:
IP地址 192.168.2.99 继续
网络掩码 255.255.255.0 继续
网关 192.168.2.1 继续
域名服务器地址 61.177.7.1 221.228.255.1

设置主机名 如:s2
域名 (内部网可留空)
时钟设置:选<是>
磁盘分区(注意这是重点!)
选手动 回车
选某一分区5G左右(用于:Ext3日志文件系统;格式化此分区;挂载点:/;分区设定结束 回车)
选某一分区容量大一些(用于:Ext3日志文件系统;格式化此分区;挂载点:/home;挂载选项:选中usrquota和grpquota开启用户和群组磁盘限额功能,也可以后设置;分区设定结束 回车)
选某一分区2G左右(用于:交换空间;分区设定结束 回车)
注:挂载选项中relatime参数表示更新和inode修改时间相关的存取时间
也可选某一分区容量大一些(用于:Ext3日志文件系统;格式化此分区;挂载点:/back(备份数据用);分区设定结束 回车)
撤销对分区设置的修改
分区设定结束并将修改结果写入磁盘 回车
安装基本系统
设置用户和密码 使用弱口令 <是>回车 主目录加密<否>回车
HTTP代理(没有置空)
选择并安装软件
选”自动安装安全更新” 回车
选或不选 openssh server(强烈建议选中,用上下键选 空格键确认)
Samba server(与windows电脑文件共享用,建议选中)
Print server
Lamp server(如需使用建议选中,否则以后设置很麻烦!)
说明:openssh是安全、加密的网络连接工具,代替了 telnet、ftp等工具。
lamp指Linux+Apache+Mysql+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
安装grub启动引导器
将grub启动引导器安装到主引导记录(MBR)上吗? <是>回车
安装完成弹出光盘

#常用软件安装openssh samba vsftp db4.7-util(vsftp虚拟帐号用) pax(防内存溢出软件)ufw(防火墙)lupin-casper squashfs-tools(后两个备份系统用)quota(磁盘配额)
sudo apt-get install vsftpd pax ufw lupin-casper squashfs-tools
quota

以上方法适用于ubuntu server 9.10 10.04 10.10 11.04等版本

Ubuntu Server 10.10定时开机方法:
  按F2进入BIOS设置,设置每天定时开机。
  容易出现问题:
    BIOS时间比系统时间慢8小时。在BIOS设置中设置时间或在Ubuntu系统中设置BIOS时间为本地时间后,每次系统重启时BIOS时间又被设置为比本地时间慢8小时的UTC时间。
  情景再现:
    设置每天07:00开机,设置时发现BIOS时间比系统时间慢8小时,我再设置BIOS时间为系统时间。www.linuxidc.com每次重启时发现BIOS时间比系统时间慢8小时。
  原因:
    Linux支持UTC时间。UTC时间比本地时间(Asia/Shanghai)慢8小时。BIOS有两种正确的时间设置:1.BIOS=本地时间,UTC=no;2. BIOS=UTC时间,UTC=yes.上述问题出现是因为虽然设置了BIOS时间为本地时间,由于UTC设置为yes,导致每次重启时BIOS时间设置为UTC时间。
  解决方法:
    设置UTC为no。在 /etc/default/rcS设置UTC为no。
  定时关机方法:
    编辑 /etc/crontab添加一条命令:55 23 * * * root /sbin/shutdown -h now。即可实现每天23:15关机。也可在webmin的Scheduled Cron Jobs中设置。

1.需要移植crond和crontab

crontab使用大概有两种,一种是修改全局配置文件/etc/crontab,另一种是直接运行命令crontab -e.

全局配置没有详细测试,似乎直接运行crontab -e方便一些.

1.先把要加入定时任务的脚本写好

比如可以写test:

#!/bin/sh
cd /home/a
echo "Hello World!" > hello
ls -l > mm

2.执行命令 crontab -e,此时系统会打开一个vi编辑器.

3.输入

59 23 * * *    /home/a/test

表示每天23:59运行脚本bakuplog.sh.前面的时间格式为“M H D m d cmd”。其中,M代表分钟(0~59),H代表小时(0~23),D代表天(1~31),m代表月(1~12),d代表一星期内的天(0~6,0为星期天)。*表示任何.例如01 * * * * 表示每小时的01分执行.


时程表的格式如下:
  f1 f2 f3 f4 f5 program

  其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
  当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
  当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
  当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
  当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推
  使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。



4.重新启动这个进程

/etc/init.d/cron restart

service crond restart

编辑 /etc/crontab添加一条 并且保证crontab服务的运行即可

f1 f2 f3 f4 f5 sudo /sbin/halt

假设 要每天的23点30定时关机 命令如下

30 23 * * * sudo /sbin/halt

至于crontab 服务 再GUI下的服务管理中设置为自动启动即可

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推
如何设置ubuntu系统定时关机?
1.  apt-get install sysv-rc-conf

2. sysv-rc-conf

3. 打开crontab服务

5. 编辑/etc/crontab

vim /etc/crontab

在windows下用习惯了,习惯每天晚上用这个软件自动关机,现在在ubuntu

下也有这个软件,安装很方便,新立德里就有,名字叫 GShutdown

或者

sudo apt-get install gshutdown

之前介绍了UBUNTU有软件可以实现自动关机,请见:UBUNTU定时关机软件

其实Linux自身就有自动关机的命令那就是利用shutdown命令.

在终端输入:

sudo shutdown +100 就表示电脑在100分钟后关机。

如果你此时手动关机是没用的,关机和重启都会变成登出,可以用 sudo shutdown -c来取消自动关机的命令。

此外还有其它相关的命令:

-k 并不真正关机而只是发出警告信息给所有用户

-r 关机后立即重新启动

-h 关机后不重新启动

-f 快速关机重启动时跳过fsck

-n 快速关机不经过init 程序

-h 12:00 在12点关机

-qP 100 100分钟后退出运行的程序关机

  ubuntu要这么做
1.启动crond服务
sudo /etc/init.d/cron start
2.编辑任务,加了sudo表示给root用户设置计划普通用户关机要sudo,会提示密码,所以不能用普通用户来做关机的计划任务
sudo crontab -e
3.添加任务
3.1 每分钟关一次机
* * * * * /sbin/poweroff
3.2 每天的凌晨2点关机

开心五原则
2009-02-07 09:24

做到开心的五个原则
一、心中不存怨恨。
二、脑中不存担忧。
三、简单生活。
四、多付出。
五、少期盼。

每日自问
2008-09-16 20:34

一、我是不是在计划的时间内早5分钟起床。
二、我每天晚上睡前,有没有把一天的工作反省过并计划安排明天的工作。
三、我是否按计划完成工作,有没有比计划做的快一些。
四、工作时间和效率是不是成反比例。
五、我在和别人谈话时是不是使他对我产生更亲切的感觉。
六、怎么样和我的仇敌和好,成绩如何?
七、今天有多少空余时间,怎么样去消磨它?

忘记昨天,可行方案。
行动现在,不等明天!!! 

共10篇日记