松下伺服电机不准接通cnx5里的29脚srv-on后自转是什么原因

伺服电机要调参数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
伺服电机要调参数
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢HTML5 服务器推送事件(Server-sent Events)实战开发
对于一般的 Web 应用开发,大多数开发人员并不陌生。在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式。浏览器发出请求,服务器根据收到的请求来生成相应的响应。浏览器再对收到的响应进行处理,展现给用户。响应的格式可能是 HTML、XML 或 JSON 等。随着 REST 架构风格和 AJAX 的流行,服务器更多地使用 JSON 作为响应的数据格式。Web 应用使用 XMLHttpRequest 对象来发送请求,并根据服务器端返回的数据,对页面的内容进行动态更新。通常来说,用户在页面上的操作,比如点击或移动鼠标,会触发相应的事件。由 XMLHttpRequest 对象来发出请求,得到服务器响应之后进行页面的局部更新。这种方式的不足之处在于:服务器端产生的数据变化不能及时地通知浏览器,而是需要等到下次请求发出时才能被浏览器获取。对于某些对数据实时性要求很高的应用来说,这种延迟是不能接受的。为了满足这类应用的需求,就需要有某种方式能够从服务器端推送数据给浏览器,以保证服务器端的数据变化可以在第一时间通知给用户。目前常见的解决办法有不少,主要可以分成两类。这两类方法的区别在于是否基于 HTTP 协议来实现。不使用 HTTP 协议的做法是使用 HTML 5 新增的 WebSocket 规范,而使用 HTTP 协议的做法则包括简易轮询、COMET 技术和本文中要介绍的 HTML 5 服务器推送事件。下面会对这几种技术进行介绍。简介在介绍 HTML 5 服务器推送事件之前,首先介绍一些上面提到的几种服务器端数据推送技术。第一种是 WebSocket。WebSocket 规范是 HTML 5 中的一个重要组成部分,已经被很多主流浏览器所支持,也有不少基于 WebSocket 开发的应用。正如名称所表示的一样,WebSocket 使用的是套接字连接,基于 TCP 协议。使用 WebSocket 之后,实际上在服务器端和浏览器之间建立一个套接字连接,可以进行双向的数据传输。WebSocket 的功能是很强大的,使用起来也灵活,可以适用于不同的场景。不过 WebSocket 技术也比较复杂,包括服务器端和浏览器端的实现都不同于一般的 Web 应用。除了 WebSocket 之外,其他的实现方式是基于 HTTP 协议来达到实时推送的效果。第一种做法是简易轮询,即浏览器端定时向服务器端发出请求,来查询是否有数据更新。这种做法比较简单,可以在一定程度上解决问题。不过对于轮询的时间间隔需要进行仔细考虑。轮询的间隔过长,会导致用户不能及时接收到更新的数据;轮询的间隔过短,会导致查询请求过多,增加服务器端的负担。COMET 技术改进了简易轮询的缺点,使用的是长轮询。长轮询的方式在每次请求时,服务器端会保持该连接在一段时间内处于打开状态,而不是在响应完成之后就立即关闭。这样做的好处是在连接处于打开状态的时间段内,服务器端产生的数据更新可以被及时地返回给浏览器。当上一个长连接关闭之后,浏览器会立即打开一个新的长连接来继续请求。不过 COMET 技术的实现在服务器端和浏览器端都需要第三方库的支持。综合比较上面提到的 4 种不同的技术,简易轮询由于其本身的缺陷,并不推荐使用。COMET 技术并不是 HTML 5 标准的一部分,从兼容标准的角度出发,也不推荐使用。WebSocket 规范和服务器推送技术都是 HTML 5 标准的组成部分,在主流浏览器上都提供了原生的支持,是推荐使用的。不过 WebSocket 规范更加复杂一些,适用于需要进行复杂双向数据通讯的场景。对于简单的服务器数据推送的场景,使用服务器推送事件就足够了。在浏览器支持方面,服务器推送事件已经在除 IE 外的大部分桌面和移动浏览器上得到了支持。支持服务器推送事件的浏览器及其版本包括:Firefox 6.0+、Chrome 6.0+、Safari 5.0+、Opera 11.0+、iOS Safari 4.0+、Opera Mobile 11.1+、Chrome for Android 25.0+、Firefox for Android 19.0+ 以及 Blackberry Browser 7.0+ 等。关于 IE 的支持,在下面的章节中有详细的介绍。下面对服务器推送事件的规范进行具体的说明。规范Server-sent Events 规范是 HTML 5 规范的一个组成部分,具体的规范文档见参考资源。该规范比较简单,主要由两个部分组成:第一个部分是服务器端与浏览器端之间的通讯协议,第二部分则是在浏览器端可供 JavaScript 使用的 EventSource 对象。通讯协议是基于纯文本的简单协议。服务器端的响应的内容类型是“text/event-stream”。响应文本的内容可以看成是一个事件流,由不同的事件所组成。每个事件由类型和数据两部分组成,同时每个事件可以有一个可选的标识符。不同事件的内容之间通过仅包含回车符和换行符的空行(“\r\n”)来分隔。每个事件的数据可能由多行组成。代码清单 1 给出了服务器端响应的示例。清单 1. 服务器端响应的示例data: first event
data: second event
event: myevent
data: third event
: this is a comment
data: fourth event
data: fourth event continue如代码清单 1 所示,每个事件之间通过空行来分隔。对于每一行来说,冒号(“:”)前面表示的是该行的类型,冒号后面则是对应的值。可能的类型包括:
类型为空白,表示该行是注释,会在处理时被忽略。
类型为 data,表示该行包含的是数据。以 data 开头的行可以出现多次。所有这些行都是该事件的数据。
类型为 event,表示该行用来声明事件的类型。浏览器在收到数据时,会产生对应类型的事件。
类型为 id,表示该行用来声明事件的标识符。
类型为 retry,表示该行用来声明浏览器在连接断开之后进行再次连接之前的等待时间。在代码清单 1 中,第一个事件只包含数据“first event”,会产生默认的事件;第二个事件的标识符是 100,数据为“second event”;第三个事件会产生类型为“myevent”的事件;最后一个事件的数据为“fourth event\nfourth event continue”。当有多行数据时,实际的数据由每行数据以换行符连接而成。如果服务器端返回的数据中包含了事件的标识符,浏览器会记录最近一次接收到的事件的标识符。如果与服务器端的连接中断,当浏览器端再次进行连接时,会通过 HTTP 头“Last-Event-ID”来声明最后一次接收到的事件的标识符。服务器端可以通过浏览器端发送的事件标识符来确定从哪个事件开始来继续连接。对于服务器端返回的响应,浏览器端需要在 JavaScript 中使用 EventSource 对象来进行处理。EventSource 使用的是标准的事件监听器方式,只需要在对象上添加相应的事件处理方法即可。EventSource 提供了三个标准事件,如表 1 所示。表 1. EventSource 对象提供的标准事件名称说明事件处理方法
当成功与服务器建立连接时产生
当收到服务器发送的事件时产生
当出现错误时产生
如之前所述,服务器端可以返回自定义类型的事件。对于这些事件,可以使用 addEventListener 方法来添加相应的事件处理方法。代码清单 2 给出了 EventSource 对象的使用示例。清单 2. EventSource 对象的使用示例var es = new EventSource('events');
es.onmessage = function(e) {
console.log(e.data);
es.addEventListener('myevent', function(e) {
console.log(e.data);
});如代码清单 2 所示,在指定 URL 创建出 EventSource 对象之后,可以通过 onmessage 和 addEventListener 方法来添加事件处理方法。当服务器端有新的事件产生,相应的事件处理方法会被调用。EventSource 对象的 onmessage 属性的作用类似于 addEventListener( ‘ message ’ ),不过 onmessage 属性只支持一个事件处理方法。在介绍完服务器推送事件的规范内容之后,下面介绍服务器端的实现。服务器端和浏览器端实现从上一节中对通讯协议的描述可以看出,服务器端推送事件是一个比较简单的协议。服务器端的实现也相对比较简单,只需要按照协议规定的格式,返回响应内容即可。在开源社区可以找到各种不同的服务器端技术相对应的实现。自己开发的难度也不大。本文使用 Java 作为服务器端的实现语言。相应的实现基于开源的 jetty-eventsource-servlet 项目,见参考资源。下面通过一个具体的示例来说明如何使用 jetty-eventsource-servlet 项目。示例用来模拟一个物体在某个限定空间中的随机移动。该物体从一个随机位置开始,然后从上、下、左和右四个方向中随机选择一个方向,并在该方向上移动随机的距离。服务器端不断改变该物体的位置,并把位置信息推送给浏览器,由浏览器来显示。服务器端实现服务器端的实现由两部分组成:一部分是用来产生数据的 org.eclipse.jetty.servlets.EventSource 接口的实现,另一部分是作为浏览器访问端点的继承自 org.eclipse.jetty.servlets.EventSourceServlet 类的 servlet 实现。代码清单 3 给出了 EventSource 接口的实现类。清单 3. EventSource 接口的实现类 MovementEventSource public class MovementEventSource implements EventSource {
private int width = 800;
private int height = 600;
private int stepMax = 5;
private int x = 0;
private int y = 0;
private Random random = new Random();
private Logger logger = Logger.getLogger(getClass().getName());
public MovementEventSource(int width, int height, int stepMax) {
this.width =
this.height =
this.stepMax = stepM
this.x = random.nextInt(width);
this.y = random.nextInt(height);
public void onOpen(Emitter emitter) throws IOException {
query(emitter); //开始生成位置信息
public void onResume(Emitter emitter, String lastEventId)
throws IOException {
updatePosition(lastEventId); //更新起始位置
query(emitter);
//开始生成位置信息
//根据Last-Event-Id来更新起始位置
private void updatePosition(String id) {
if (id != null) {
String[] pos = id.split(",");
if (pos.length & 1) {
int xPos = -1, yPos = -1;
xPos = Integer.parseInt(pos[0], 10);
yPos = Integer.parseInt(pos[1], 10);
} catch (NumberFormatException e) {
if (isValidMove(xPos, yPos)) {
private void query(Emitter emitter) throws IOException {
ment("Start sending movement information.");
while(true) {
move(); //移动位置
String id = String.format("%s,%s", x, y);
emitter.id(id); //根据位置生成事件标识符
emitter.data(id); //发送位置信息数据
Thread.sleep(2000);
} catch (InterruptedException e) {
logger.log(Level.WARNING, \
"Movement query thread interrupted. Close the connection.", e);
emitter.close(); //当循环终止时,关闭连接
public void onClose() {
//获取下一个合法的移动位置
private void move() {
while (true) {
int[] move = getMove();
int xNext = x + move[0];
int yNext = y + move[1];
if (isValidMove(xNext, yNext)) {
//判断当前的移动位置是否合法
private boolean isValidMove(int x, int y) {
return x &= 0 && x &= width && y &=0 && y &=
//随机生成下一个移动位置
private int[] getMove() {
int[] xDir = new int[] {-1, 0, 1, 0};
int[] yDir = new int[] {0, -1, 0, 1};
int dir = random.nextInt(4);
return new int[] {xDir[dir] * random.nextInt(stepMax), \
yDir[dir] * random.nextInt(stepMax)};
}代码清单 3 中,类 MovementEventSource 需要实现 EventSource 接口的 onOpen、onResume 和 onClose 方法,其中 onOpen 方法在浏览器端的连接打开的时候被调用,onResume 方法在浏览器端重新建立连接时被调用,onClose 方法则在浏览器关闭连接的时候被调用。onOpen 和 onResume 方法都有一个 EventSource.Emitter 接口类型的参数,可以用来发送数据。EventSource.Emitter 接口中包含的方法包括 data、event、comment、id 和 close 等,分别对应于通讯协议中各种不同类型的事件。而 onResume 方法还额外包含一个参数 lastEventId,表示通过 Last-Event-ID 头发送过来的最近一次事件的标识符。MovementEventSource 类中事件生成的主要逻辑在 query 方法中。该方法中包含一个无限循环,每隔 2 秒钟改变一次位置,同时把更新之后的位置通过 EventSource.Emitter 接口的 data 方法发送给浏览器端。每个事件都有对应的标识符,而标识符的值就是位置本身。如果连接断开之后,浏览器重新进行连接,可以从上一次的位置开始继续移动该物体。与 MovementEventSource 类对应的 servlet 实现比较简单,只需要继承自 EventSourceServlet 类并覆写 newEventSource 方法即可。在 newEventSource 方法的实现中,需要返回一个 MovementEventSource 类的对象,如代码清单 4 所示。每当浏览器端建立连接时,该 servlet 会创建一个新的 MovementEventSource 类的对象来处理该请求。清单 4. servlet 实现类 MovementServlet public class MovementServlet extends EventSourceServlet {
protected EventSource newEventSource(HttpServletRequest request,
String clientId) {
return new MovementEventSource(800, 600, 20);
}在服务器端实现中,需要注意的是要添加相应的 servlet 过滤器支持。这是 jetty-eventsource-servlet 项目所依赖的 Jetty Continuations 框架的要求,否则的话会出现错误。添加过滤器的方式是在 web.xml 文件中添加代码清单 5 中所示的配置内容。清单 5. Jetty Continuations 所需 servlet 过滤器的配置 &filter&
&filter-name&continuation&/filter-name&
&filter-class&org.eclipse.jetty.continuation.ContinuationFilter&/filter-class&
&filter-mapping&
&filter-name&continuation&/filter-name&
&url-pattern&/sse/*&/url-pattern&
&/filter-mapping&浏览器端实现浏览器端的实现也比较简单,只需要创建出 EventSource 对象,并添加相应的事件处理方法即可。代码清单 6 给出了相应的实现。在页面中使用一个方块表示物体。当接收到新的事件时,根据事件数据中给出的坐标信息,更新方块在页面上的位置。清单 6. 浏览器端的实现代码 var es = new EventSource('sse/movement');
es.addEventListener('message', function(e) {
var pos = e.data.split(','), x = pos[0], y = pos[1];
$('#box').css({
left : x + 'px',
top : y + 'px'
});在介绍完基本的服务器端和浏览器端实现之后,下面介绍比较重要的 IE 的支持。IE 支持使用浏览器原生的 EventSource 对象的一个比较大的问题是 IE 并不提供支持。为了在 IE 上提供同样的支持,一般有两种办法。第一种办法是在其他浏览器上使用原生 EventSource 对象,而在 IE 上则使用简易轮询或 COMET 技术来实现;另外一种做法是使用 polyfill 技术,即使用第三方提供的 JavaScript 库来屏蔽浏览器的不同。本文使用的是 polyfill 技术,只需要在页面中加载第三方 JavaScript 库即可。应用本身的浏览器端代码并不需要进行改动。一般推荐使用第二种做法,因为这样的话,在服务器端只需要使用一种实现技术即可。在 IE 上提供类似原生 EventSource 对象的实现并不简单。理论上来说,只需要通过 XMLHttpRequest 对象来获取服务器端的响应内容,并通过文本解析,就可以提取出相应的事件,并触发对应的事件处理方法。不过问题在于 IE 上的 XMLHttpRequest 对象并不支持获取部分的响应内容。只有在响应完成之后,才能获取其内容。由于服务器端推送事件使用的是一个长连接。当连接一直处于打开状态时,通过 XMLHttpRequest 对象并不能获取响应的内容,也就无法触发对应的事件。更具体的来说,当 XMLHttpRequest 对象的 readyState 为 3(READYSTATE_INTERACTIVE)时,其 responseText 属性是无法获取的。为了解决 IE 上 XMLHttpRequest 对象的问题,就需要使用 IE 8 中引入的 XDomainRequest 对象。XDomainRequest 对象的作用是发出跨域的 AJAX 请求。XDomainRequest 对象提供了 onprogress 事件。当 onprogress 事件发生时,可以通过 responseText 属性来获取到响应的部分内容。这是 XDomainRequest 对象和 XMLHttpRequest 对象的最大不同,也是使用 XDomainRequest 对象来实现类似原生 EventSource 对象的基础。在使用 XDomainRequest 对象打开与服务器端的连接之后,当服务器端有新的数据产生时,可以通过 XDomainRequest 对象的 onprogress 事件的处理方法来进行处理,对接收到的数据进行解析,根据数据的内容触发相应的事件。不过由于 XDomainRequest 对象本来的目的是发出跨域 AJAX 请求,考虑到跨域访问的安全性问题,XDomainRequest 对象在使用时的限制也比较严格。这些限制会影响到其作为 EventSource 对象的实现方式。具体的限制和解决办法如下所示:
服务器端的响应需要包含 Access-Control-Allow-Origin 头,用来声明允许从哪些域访问该 URL。“*”表示允许来自任何域的访问,不推荐使用该值。一般使用与当前应用相同的域,限制只允许来自当前域的访问。
XDomainRequest 对象发出的请求不能包含自定义的 HTTP 头,这就限制了不能使用 Last-Event-ID 头来声明浏览器端最近一次接收到的事件的标识符。只能通过 HTTP 请求的其他方式来传递该标识符,如 GET 请求的参数或 POST 请求的内容体。
XDomainRequest 对象的请求的内容类型(Content-Type)只能是“text/plain”。这就意味着,当使用 POST 请求时,服务器端使用的框架,如 servlet,不会对 POST 请求的内容进行自动解析,无法使用 HttpServletRequest 类的 getParameter 方法来获取 POST 请求的内容。只能在服务器端对原始的请求内容进行解析,获取到其中的参数的值。
XDomainRequest 对象发出的请求中不包含任何与用户认证相关的信息,包括 cookie 等。这就意味着,如果服务器端需要认证,则需要通过 HTTP 请求的其他方式来传递用户的认证信息,比如 session 的 ID 等。由于 XDomainRequest 对象的这些限制,服务器端的实现也需要作出相应的改动。这些改动包括返回 Access-Control-Allow-Origin 头;对于浏览器端发送的“text/plain”类型的参数进行解析;处理请求中包含的用户认证相关的信息。本文的示例使用的 polyfill 库是 GitHub 上的 Yaffle 开发的 EventSource 项目,具体的地址见参考资源。在使用该 polyfill 库,并对服务器端的实现进行修改之后,就可以在 IE 8 及以上的浏览器中使用服务器推送事件。如果需要支持 IE 7,则只能使用简易轮询或 COMET 技术。本文的示例代码见参考资源。小结如果需要从服务器端推送数据给浏览器,可以使用的基于 HTML 5 规范标准的技术包括 WebSocket 和服务器推送事件。开发人员可以根据应用的具体需求来选择合适的技术。如果只是需要从服务器端推送数据,服务器推送事件的规范更加简单,实现起来更容易。本文对服务器推送事件的规范内容、服务器端和浏览器端的实现都进行了详细的介绍,对如何支持 IE 浏览器也进行了具体的分析。
了解 (Server-sent Events)的具体内容。
项目和 的更多内容。
了解 IE 上的 和 对象,了解 XDomainRequest 对象的 。
查看支持 IE 的 EventSource 对象的 的详细信息。
查看本文的 。:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过
栏目,迅速了解 Web 2.0 的相关概念。查看 ,了解更多和 HTML5 相关的知识和动向。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web developmentArticleID=937446ArticleTitle=HTML5 服务器推送事件(Server-sent Events)实战开发publish-date=1 Pages: 1/2& & &Go
级别: 家园常客
发帖数量: 644 个
工控威望: 625 点
下载积分: 1580 分
在线时间: 288(小时)
注册时间: 最后登录:
请教各位老师:&&&&&&松下伺服电机接通cnx5里的29脚srv-on(伺服ON输入)后自转是什么原因,是新的,没给驱动器什么驱动信号就转,以前用的也是新的没有这个现象,请老师们指教。
级别: 略有小成
发帖数量: 160 个
工控威望: 237 点
下载积分: 141 分
在线时间: 491(小时)
注册时间: 最后登录:
本帖最近评分记录:下载积分:+1(sjm213) 热心助人
zhenqiling
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *最后登录: *
我想可能是干擾,你把脈沖信號的線折掉再看下,要是沒有了就信號線的電源分開。
本帖最近评分记录:下载积分:+2(sjm213) 热心助人
guojin2008
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *最后登录: *
你用的什么控制啊,是模拟量吗?
liubing521
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *最后登录: *
呵呵, 上面3个说的都对, 1.争议过大,反应速度快,,2干扰着方面这点很重要, 不要把线撤了,你要用是波器看波形,
本帖最近评分记录:下载积分:+1(sjm213) 热心助人
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *最后登录: *
能说说具体怎么转的吗?如果是来回转,就应该是增益过高,转一段时间可能还会报警如果向一个方向转,而且速度保持恒定,就可以是模拟量控制,而且参数设定了使用内部模拟量
本帖最近评分记录:下载积分:+1(sjm213) 热心助人
级别: 家园常客
发帖数量: 644 个
工控威望: 625 点
下载积分: 1580 分
在线时间: 288(小时)
注册时间: 最后登录:
谢谢各位老师的回复,出差刚回来看到老师们的回复,谢谢。我用脉冲控制正反转,我调整一下增益看一下、谢谢、谢谢。
级别: 论坛先锋
发帖数量: 351 个
工控威望: 1217 点
下载积分: 11869 分
在线时间: 829(小时)
注册时间: 最后登录:
具体的要看控制方式,如果是位置控制的话,应该不会有这种现象,以前我也遇到过
本帖最近评分记录:下载积分:+1(sjm213) 热心助人
级别: 论坛先锋
发帖数量: 351 个
工控威望: 1217 点
下载积分: 11869 分
在线时间: 829(小时)
注册时间: 最后登录:
引用引用第6楼pjf于 10:37发表的&&:谢谢各位老师的回复,出差刚回来看到老师们的回复,谢谢。我用脉冲控制正反转,我调整一下增益看一下、谢谢、谢谢。脉冲控制正反转应该是属于位置控制吧
bogegongkong
什么是生活,生活就是活着。
级别: 略有小成
发帖数量: 415 个
工控威望: 296 点
下载积分: 1728 分
在线时间: 483(小时)
注册时间: 最后登录:
引用引用第7楼ljy-03-12 18:28发表的&&:具体的要看控制方式,如果是位置控制的话,应该不会有这种现象,以前我也遇到过没错,改为位置控制就不会了,默认应该为速度控制吧.
熟悉轮胎生产工艺流程。专业制造车胎生产设备。提供轮胎工厂公用工程设计,安装。提供轮胎生产设备改造升级服务。愿与各同行探讨工控问题:QQ
级别: 刚进门槛
发帖数量: 85 个
工控威望: 62 点
下载积分: 161 分
在线时间: 44(小时)
注册时间: 最后登录:
顺便问一下?你是用三陵FX2N-1PG 写的吗?如果是请帮忙把接线图发过来可以吗?谢谢
级别: 家园常客
发帖数量: 644 个
工控威望: 625 点
下载积分: 1580 分
在线时间: 288(小时)
注册时间: 最后登录:
谢谢各位老师的帮助,现在设备停滞了,到时有问题在请教。我用的不是三陵FX2N-1PG 写的,不好意思没有接线图
1 Pages: 1/2& & &Go鳥哥的 Linux 私房菜
底下尚未更新
第二章、安裝伺服器與 kickstart 大量部署用戶端電腦
最近更新日期:
上一章我們將區域網路內的線路處理妥當並且將伺服器設定成可分享區域網路對 Internet 的連線後,再來當然就是要管理內部的用戶端電腦的設定了。
用還原卡管理用戶端電腦是很簡易的方式,不過確有很多教學方面的問題等待克服。如果不用還原卡,要怎麼處理用戶端的電腦內作業系統的安裝與還原呢?用原版光碟嗎?
以正常的 DVD 光碟片安裝一兩台 Linux 系統似乎是沒啥大問題,但如果有好幾間電腦教室,裡頭有幾十部總共數百部的主機要你裝 Linux 系統的話,那使用 DVD
光碟來裝也太花時間了吧?此時,選擇透過網路來進行安裝就是一項可以思考的方向!同時,如果以鳥哥上班的單位為例,電腦教室的 PC
需要有多重作業系統的環境下,如何準備一個可以裸機安裝的功能, 就是一個相當重要的任務了!這篇文章就在討論如何從網路進行這些動作囉!
1. 使用 PXE 環境建置區域網路安裝伺服器系統
一般來說,不論是哪種作業系統,只要是使用 DVD 釋出作業系統軟體的,通常安裝的程序是這樣的:
透過 BIOS 開機,並調整成可以讓光碟優先開機的模式;
以光碟內的作業系統核心開機,驅動系統的硬體裝置;
上一步的作業系統直接呼叫安裝程式來進行安裝選項;
進入安裝模式與使用者互動選取用戶需要的軟體操作環境;
系統開始安裝軟體至硬碟上,安裝完畢通常需重新開機才能結束安裝程序;
重新開機後,會進入首次使用的設定畫面,簡單設定後,即可開始登入系統使用。
程序是很簡單,不過,如果用戶端的數量一多起來,上述的第四、五步驟通常會佔用相當大的人力!因為安裝程式需要與使用者互動啊!此外,如果用戶端的數量很大!
那麼我們如果想要同時進行以減少等待的時間時,就得要燒錄多片 DVD,雖然不貴,不過很覺得浪費~另外,現在的網路速度要比 DVD 速度快的多
(Gigabit 網卡至少可以到達 100Mbytes/s 的速度,16X DVD 只能到達大約 25Mbytes/s 以下),
如果將 DVD 的資料複製到網路上,透過網路來安裝,不是更快嗎?是的!沒錯~但是,這時候就需要 PXE 的協助了!
1.1 什麼是 PXE 與 PXE 的運作模式 ()
對於現在的主機硬體系統來說,不論你想在上頭幹嘛,首先你總是得要透過開機管理程式 (boot loader) 載入系統核心 (kernel) 之後,才能夠順利的開始運作系統。
同理,使用 DVD 原版光碟安裝時,BIOS 選擇光碟機開機,光碟片裡面就得要含有開機管理程式與簡易的核心,開始驅動整個系統硬體後,才能夠進入下一步安裝軟體的控制中。
現在,我們想要透過網路開機來進入本機系統,等開機之後,接下來愛幹嘛就幹嘛,當然也就包括進行網路安裝的行為啊!那跟上面講的就一樣了,既然我是想要透過網路開機,
那麼必要的 (1)開機管理程式與 (2)作業系統核心就得要放在網路上給用戶端的主機系統下載使用才行。
問題來了,既然我的主機系統還沒有安裝任何作業系統,那怎麼 (1)取得網路 (2)下載開機管理程式與核心呢?這時就得要透過 Intel 發佈的 PXE 機制了。
所謂的 PXE 是『 Preboot Execution Environment 』的縮寫,字面上的意思是:『開機前的執行環境』之意。根據 Intel
所發佈的文件來看 (),要達成這個 PXE 必須要有兩個環節,(1)一個是用戶端的網路卡必須要支援 PXE 用戶端功能,並且開機時選擇網路卡開機,這樣系統才會以網路卡進入
PXE 用戶端的程序;(2)一個是 PXE 伺服器必須要提供至少含有 DHCP 以及 TFTP 的服務才行!且其中:
DHCP 服務必須要能夠提供用戶端的網路參數之外,還得要告知用戶端 TFTP 所在的位置為何才行;
TFTP 則是提供用戶端 boot loader 及 kernel file 下載點的重要服務
上述兩個服務僅能讓 PXE 用戶端開機而已,開機的定義只是讓硬體開始執行罷了!我們都知道,開機完成後還得要提供各式各樣的軟體之後,才能夠順利的載入可讓一般用戶操作的基本作業系統。
因此,通常 PXE server 還必須要能夠提供用戶端所需程式與軟體資料的來源才行!所以,通常還得要加上 NFS/FTP/HTTP (通常是選擇一樣即可) 等資料提供的通訊協定後,
才算是比較完整的 PXE 伺服器囉。
在本章末了的中,PXE 已經講得非常詳細!我們這裡僅簡單的使用底下的圖示來解釋一下 PXE 的整體運作流程:
圖 1.1-1、PXE 的 server/client 相關的運作流程示意圖 (圖改自 Intel Preboot Execution Environment specification V2.1)
從上圖中我們再次的歸納幾個重點:
整個 PXE 的運作流程,幾乎都是使用 UDP 封包來達成的!
PXE 用戶端的網路卡必須要支援 PXE 功能,才能在開機時發出 DHCP 要求相關資料;
DHCP 除了得要回傳正確的區網參數外,還要額外告知 TFTP 與相關開機管理程式資訊;
TFTP 需要提供 (1)開機管理程式與 (2)Linux 的開機核心與相關檔案 (initrd 等檔案)
那什麼時候需要有安裝光碟內的軟體支援安裝呢?那就得要外帶核心參數才行囉!也就是說,我們至少得要設定底下這幾個服務才行: (1)TFTP (2)DHCP (3)NFS/HTTP/FTP!
其中 TFTP 與 DHCP 為必須,則安裝的軟體來源則是可選擇的!底下我們就一項一項服務來設定吧!
1.2 透過 DHCP 服務取得 TFTP IP 位址與 boot loader 檔名所在
從 的資料上面,可以發現 DHCP 主要僅是提供用戶端網路參數與 TFTP 的位址,以及 boot loader 的檔名而已。
同時,我們僅針對內網來告知 TFTP 的相關位置,所以,我們可以編輯 /etc/dhcp/dhcpd.conf 在 subnet 的區塊內加入兩個參數即可。
首先,由於我們這個區網還不算太大,所以,鳥哥是將 DHCP 與 TFTP 綁在同一個主機上頭,因此 DHCP 與 TFTP 的 IP 都是延續前一章的 192.168.42.254 這一個。那 boot loader 呢?
在 CentOS 裡面有提供一個檔名為『 pxelinux.0 』的專門給 PXE client 下載的 PXE boot loader!這個檔案我們即將放置於 TFTP 的根目錄下,所以,DHCP 的簡單設定就變成如下模樣:
[root@centos ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-
default-lease-time
max-lease-time
option routers
192.168.42.254;
option broadcast-address
192.168.42.255;
option domain-name-servers
192.168.42.254;
subnet 192.168.42.0 netmask 255.255.255.0 {
range 192.168.42.101 192.168.42.200;
option subnet-mask
255.255.255.0;
option domain-name
"i4502.dic.ksu";
&==上面的資料是前一章的內容!
next-server
192.168.42.254;
&==就是 TFTP 的位址所在處
"pxelinux.0";
&==告知得從 TFTP 根目錄下載的 boot loader 檔名
....(中間省略)....
&==別忘記最後的這玩意!
[root@centos ~]# /etc/init.d/dhcpd restart
再重新啟動過 DHCP 之後,這樣針對這個內網的 TFTP 設定就生效了。不過,請特別留意喔!如果你沒有繼續接著底下的 TFTP 來設定的話,那麼未來你的用戶端如果設定網路卡開機,
就會發現到如下的錯誤訊息~雖然這個錯誤訊息並不會影響到用戶端的操作,反正過了逾時等待時間後,系統就會自動的進入下一個開機裝置來開機。但是,有這個錯誤訊息就很討厭就是了。
圖 1.2-1、僅設定 DHCP 提供 TFTP 但 TFTP 尚未建置完成時的用戶端錯誤訊息示意
從上面的訊息你可以發現,用戶端這個 PXE 已經抓到 DHCP 提供的網路參數,取得的 IP 為 192.168.42.158,但是當他連線到 TFTP 想去下載 pxelinux.0 時,
卻抓不到程式!所以就造成等待逾時。雖然沒什麼,不過多一段等待時間就很討厭~因此,繼續接著底下的 TFTP 來設定吧!
1.3 透過 TFTP 提供用戶下載開機管理程式與核心檔案
從 的流程當中,我們知道開機過程所需要的開機管理程式與核心相關開機檔案,主要都是透過 TFTP 這個服務來給予的!
這個服務在 CentOS 上面已經有相關的軟體主動提供了!設定很簡單。但是,那個開機管理程式與核心檔案在哪裡啊?呵呵!底下我們就分別來說一說各別的設定囉!
TFTP 的主程式設定,重點在 TFTP 要將資料放在那個目錄內:
TFTP 的安裝很簡單~直接使用 yum 來處理即可。不過,如同 FTP 服務一樣,你總是得要告訴用戶端,我的 TFTP 資料的『根目錄』在哪裡才行!
這樣接下來才有辦法取得完整的絕對路徑相關資料啊。另外要注意,TFTP 其實是由 xinetd 這個 super daemon 所管理的,因此設定好 TFTP 之後,
你要啟動的是 xinetd 才對喔!
另外,預設的 TFTP 服務的根目錄是放在 /var/lib/tftpboot/ 底下,由於未來我們的安裝伺服器有很多資料都會放置在這個檔案系統中,為了統一管理,
所以鳥哥習慣上都會將所有需要的資料統一放置於某個目錄中!那未來如果有需要加速檔案系統或者擴大檔案系統時,就比較方便處理~在本章的案例中,
鳥哥是將所有的資料統一放置於 /install/ 目錄下的!那這個 TFTP 的根目錄我們就將他放置於 /install/tftpboot 底下囉!
# 先安裝所需要的 TFTP 伺服器軟體:
[root@centos ~]# yum install tftp-server tftp
# 事實上,只要安裝 tftp-server 即可。不過這裡鳥哥連用戶端的 tftp 也一口氣裝好算了。
# 開始設定 TFTP 的設定檔~主要是 TFTP 的根目錄所在啦!
[root@centos ~]# vim /etc/xinetd.d/tftp
service tftp
socket_type
= /usr/sbin/in.tftpd
server_args
= -s /install/tftpboot
&== 重點在這裡!改成這樣即可
per_source
[root@centos ~]# mkdir -p /install/tftpboot
[root@centos ~]# chcon --reference /var/lib/tftpboot /install/tftpboot
[root@centos ~]# chcon --reference /var /install
[root@centos ~]# ll -dZ /install/tftpboot
drwxr-xr-x. root root system_u:object_r:tftpdir_rw_t:s0 /install/tftpboot/
# 如果你沒有關掉 SELinux 的話,那這裡就得要這樣做才行!注意上面特殊字體部分!
# 啟動 TFTP 並觀察之:
[root@centos ~]# /etc/init.d/xinetd restart
[root@centos ~]# chkconfig xinetd on
[root@centos ~]# chkconfig tftp on
[root@centos ~]# netstat -tulnp | grep xinetd
Proto Recv-Q Send-Q Local Address
Foreign Address
PID/Program name
0 0.0.0.0:69
2238/xinetd
# 你要注意的是埠口 69 以及 xinetd 這個啟動的服務名稱才對!
接下來你得要知道的是,所有透過 TFTP 提供的資料,在本章的案例中,都必須要放置於 /install/tftpboot/ 目錄下才行喔!不要放錯地方了!要注意!要注意!
使用 syslinux 提供的 boot loader 與選單相關展示檔案:
如果要使用 PXE 的開機管理程式與開機選單的話,那就得要安裝 CentOS 內建提供的 syslinux 軟體,從裡面撈出兩個檔案即可。當然啦,這兩個檔案得要放置在 TFTP 的根目錄下才好!
整個實作的過程如下:
[root@centos ~]# yum install syslinux
&==底下的檔案是由這軟體所提供!
[root@centos ~]# cp /usr/share/syslinux/menu.c32
/usr/share/syslinux/vesamenu.c32 \
& /usr/share/syslinux/pxelinux.0 /install/tftpboot/
[root@centos ~]# mkdir /install/tftpboot/pxelinux.cfg
[root@centos ~]# ll /install/tftpboot/
-rw-r--r--. 1 root root
-04-02 18:10 menu.c32
&==提供類選單模式的功能
-rw-r--r--. 1 root root
-04-02 18:10 pxelinux.0
&==就是開機管理程式!
drwxr-xr-x. 2 root root
-02 18:11 pxelinux.cfg
&==開機的選單設定在這裡!
-rw-r--r--. 1 root root 3-04-02 18:41 vesamenu.c32
&==圖形化介面選單
上面的 memu.c32, vesamenu.c32 及 pxelinux.0 幾個檔案還好理解,反正就是提供『選單介面』以及『開機管理程式』的咚咚。那麼那個 pxelinux.cfg
是啥鬼?其實那是個目錄,可以放置『預設的開機選單』,也能夠『針對每部不同的用戶端主機提供設定的開機選單』!非常有趣吧!一般來說,還沒有特定的用戶端時,可以在
pxelinux.cfg 目錄內,建立一個名為 default 的檔案,那個檔案的功能就類似 grub 的 menu.lst 啦!提供一個選單的設定!
那如果沒有 menu.c32 或 vesamenu.c32 時,選單會以醜醜的純文字模式一行一行顯示。如果加上了 menu.c32 或 vesamenu.c32 時,就會有類似反白光棒的效果出現,那就可以使用『上下鍵』來操作光棒,
而不需要看著螢幕去輸入數字鍵來選擇開機選單囉!鳥哥覺得這樣比較好啦!包括在未來的設定檔以及相關的參數設定上面。這部分設定完畢後,再來則是核心檔案囉!
利用原版安裝光碟取得 Linux 安裝軟體核心檔案:
我們需要安裝 Linux 系統,所以得要從原版光碟裡面將核心檔案撈出來~這裡鳥哥以 64 位元版本的 CentOS 6.4 為範例來說明,鳥哥預計將核心檔案放置於
/install/tftpboot/kernel/centos6.4/ 目錄下,且鳥哥已經將原版光碟的映像檔捉下來放置於 /install/iso/CentOS-6.4-x86_64-bin-DVD1.iso 了,因此捉到核心檔案的方法如下:
# 將原版光碟暫時掛載在 /mnt 底下來抓資料用:
[root@centos ~]# mount -o loop /install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /mnt
[root@centos ~]# mkdir -p /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/vmlinuz /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/initrd.img /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/isolinux.cfg /install/tftpboot/pxelinux.cfg/demo
[root@centos ~]# umount /mnt
其實僅需要兩個檔案即可,不過鳥哥建議可以抓原版光碟裡面的選單設定檔來作為修改的依據!這樣以後比較好改!上面三個檔案的意義是:
vmlinuz:就是安裝軟體的核心檔案 (kernel file);
initrd.img:就是開機過程中所需要的核心模組參數;
isolinux.cfg --& demo:作為未來 PXE 所需要的開機選單之參考!
設定開機選單:
既然 PXE 用戶端是透過網路卡來向 TFTP 取得開機管理程式與核心檔案的,那麼 pxelinux.0 這個開機管理程式又可以去抓預設的開機選單設定檔 (pxelinux.cfg/default 內容),
這也就是說,其實有很多種不同的方案來讓開機管理程式進行開機的!包括本機硬碟開機以及網路下載核心開機。
我們這裡預計有兩個開機選項,
一個是透過本機硬碟開機 (local boot) 一個則是透過剛剛我們所下載的核心檔案來開機,以進入安裝模式。那設定該如何處理呢?建立 pxelinux.cfg/ 目錄下的 default 即可!
而且我們會使用 vesamenu.c32 來將選單顯示成為類圖形光棒喔!注意相關語法!
[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
UI vesamenu.c32
&== 使用 vesamenu.c32 這個類圖形的介面程式
TIMEOUT 300
&== 單位 0.1 秒,所以這個設定可等待 30 秒來進入預設開機
DISPLAY ./boot.msg
&== 提供一些額外的資訊,讓使用者更瞭解選單意義!
MENU TITLE Welcome to VBird's PXE Server System
&== 上面這行只是提供一個大標題而已!
LABEL local
&== 第一個選單的項目
MENU LABEL Boot from local drive
MENU DEFAULT
&== 此選單為預設項目 (等待逾時就進入此開機)
localboot 0
&== 本機磁碟開機的特定項目!
LABEL network1
MENU LABEL Boot from PXE Server for Install CentOS 6.4
kernel ./kernel/centos6.4/vmlinuz
&== 核心所在的檔名
append initrd=./kernel/centos6.4/initrd.img
&== 就是核心外帶參數啊!
# 上述設定中,大寫的文件部分要特別注意!那是使用 vesamenu.c32 的關鍵字!
# 至於後面的部分,那就是每個設定項目的內容囉!
[root@centos ~]# vim /install/tftpboot/boot.msg
Welcome to VBird's PXE Server System.
The 1st menu can let you system goto hard disk menu.
The 2nd menu can goto interactive installation step.
這個檔案有很多種不同的設定模式,包括使用 menu.c32 以及 vesamenu.c32 的設定項目也不太相同。鳥哥這邊是以 vesamenu.c32 為範例的喔!
同時,在開始寫這設定值之前,請務必回到上面幾個小段落瞧一瞧,因為檔案放置的地點在每本書或每個範例裡面都不一樣!能不能透過 TFTP 讀到你正確想讀的檔案,
在這個設定檔當中才是重點項目喔!那就來說說上面大寫字體的關鍵字部分的意義:
UI vesamenu.c32:代表預設使用 vesamenu.c32 這一個類圖形介面來作為開機選單的顯示依據。要注意, vesamenu.c32 在本範例中是放置於
tftp 的根目錄,就是在 /install/tftpboot/
目錄下喔!
TIMEOUT 300:進入選單後,會等待多少時間讓使用者互動的挑選開機項目。這個單位比較特殊,是 0.1 秒,很多朋友都會忘記單位!要注意喔!
DISPLAY ./boot.msg:將額外的資訊以純文字檔的形式寫入 boot.msg 當中!這個資訊可有可無~如果你有很多相關的選單介紹要說明的話,
就寫入本檔案中。如果這個資訊檔案不存在,系統就會用預設的按下 [Tab] 按鈕顯示特殊訊息的資訊告知用戶。鳥哥這邊是將 boot.msg 放在 tftp 的根目錄下!
MENU TITLE ...:在後面接的純文字資料將會顯示於使用者視窗中的最上方的大標題!
LABEL local:LABEL 後面接 boot loader 認識的選單項目,所以,第一個選單的實際內容其實是『 local 』才對!也就是說,如果沒有 vesamenu.c32 的輔助,
你想要進入這個選單的話,就得要用鍵盤輸入『 local 』才會進入到此選單的設定來開機!底下第二個 LABEL 的意義也是一樣的。
MENU LABEL:跟上面一個有相關性,LABEL 是 boot loader 認識的選單名稱,但我們想要讓使用者更清楚這個選單的意義,
因此透過這個 MENU LABEL 來寫入更多的資料。這個項目也會在光棒中顯示出來,所以字數也不宜太多就是了。
MENU DEFAULT:就是預設值,預設光棒反白會在那個選單上面的意思~我們使用的預設值是 local 這一個 LABEL!
localboot 0:這個是使用本機開機的一個特殊用法,如果要用本機的設備開機,不論是光碟、硬碟、軟碟,都使用這個設定項目就對了。
kernel:後面接你放在 TFTP 上面的 Linux 核心檔案,檔名是相對於 TFTP 的根目錄,所以記得你的核心檔案放在哪裡。
鳥哥比較喜歡分門別類的放置檔案,因此檔名包括目錄名稱,就會比較長一些~在本範例中的完整檔名其實是 /install/tftp/kernel/centos6.4/vmlinuz 呦!
append:外加的核心參數,重點是 initrd.img 這一個核心模組檔案!沒有他,就無法開機了啦!
關於這個設定檔的內容,鳥哥建議前往你系統中的 /usr/share/doc/syslinux-${version}/menu.txt 檔名去瞧一瞧,裡面寫得非常仔細!尤其是你還可以使用 chain.c32
去載入不同的 boot sector 開機!這就等於透過網路去指揮你的系統進行某個多重作業系統開機!而不用在現場敲鍵盤!非常有幫助!不過我們這裡沒有這方面的需求,
因此沒有仔細介紹。反正,記得去瞧瞧就是了。
1.4 用戶端開機測試與透過網際網路安裝 CentOS
一切都整理妥當之後,接下來你就可以開始在用戶端的 BIOS 設定網路開機,然後來測試一下你的 PXE 環境設定正確否了!只不過,每一家主機的 BIOS 設定都不相同,
鳥哥沒有辦法全部測試給你看~同時,新的 BIOS 甚至已經支援滑鼠設定了!好厲害好厲害~鳥哥還是使用舊舊的電腦來顯示給大家瞧瞧~相關的設定位置應該都差不多啦!
啟動內建網卡的網路開機功能:如果你的主機板有內建網卡 (一般都內建了啦!),那你得要啟用他的網路開機功能,這樣才能夠在開機順序中找到網卡開機的選項!
這個項目一般預設都是關閉的~所以得要手動去啟動他才行!如下所示為選擇的順序:
圖 1.4-1、BIOS 調整網路開機的示意圖
在上圖中依序選擇進階 (Advanced),再選擇內建裝置設定 (Onboard Devices Configuration),就可以得到如下的畫面來設定要不要啟用網路開機的功能了!
圖 1.4-2、BIOS 調整網路開機的示意圖 (續)
如上所示,找最重要的關鍵字『 LAN 』這個區網的網卡設定值,記得要選擇『 Enabled 』的項目才行。這樣就設定好網路卡開機的項目了!很簡單吧!
啟用其他周邊設備的網路開機功能:在某些時刻,你可能需要透過『外接的擴充卡』來進行網路開機!舉例來說,如果你有多個網路介面,
其中幾個是由 PCI-E 擴充插槽的 Gb 網卡所提供的,那就有可能得要設定一下電源管理模組,讓這些網路擴充卡可以發揮網路開機的功能!詳細的設定如下:
圖 1.4-3、BIOS 調整網路開機的示意圖 (續)
鳥哥選擇的這個主機是三、四年前的產品,該時段電源管理還是使用 APM (Advanced Power Manager) 模組,現今很多主機板都使用 APCI (Advanced Configuration and Power Interface)
來管理了!所以,如果你的主機板是比較新的,那在如上圖的 『Power』 選項中,就點選 ACPI 之類的相關字眼即可。點選上圖圈選的 APM 之後,會出現如下畫面:
圖 1.4-4、BIOS 調整網路開機的示意圖 (續)
鳥哥的這個主機上面有安插較舊的 PCI Gb 網卡以及較新的 PCI-E 網卡,所以這邊鳥哥將這兩個介面的電源供應都勾選,讓這幾個網路卡可以支援網路開機就是了。
如上所示,將重要的關鍵字 PCI 與 PCIE 勾選起來就對了!
調整第一個可開機裝置為網路卡:既然要讓網路卡開機,就得要讓網路開作為第一個開機裝置才行!由於系統大多預設使用硬碟開機在前,
所以這裡沒有設定時,你的系統是不會進入網路卡開機的項目的。同時注意,某些時刻,上述的網路卡設定完成後,得要儲存 BIOS 且重新 reboot 過後,
這裡才會出現網路卡裝置的選項喔!假設你剛剛的項目都已經儲存且重新啟動系統了,那再進入 BIOS 後,選擇如下的『Boot』就會出現如下畫面:
圖 1.4-5、BIOS 調整網路開機的示意圖 (續)
如上圖所示,點選了開機順序項目後,就會出現可以開機的裝置項目,記得第一個選擇網路裝置即可。在鳥哥的這個主機的案例中,我們使用的網卡裝置為 GE (Gigabit Ethernet) 的項目,
所以將他選擇在第一項即可!之後儲存 BIOS,並重新開機吧!
圖 1.4-6、BIOS 調整網路開機的示意圖 (續)
完成上述的項目之後,重新開機後,如果一切順利,你的系統在開機時就會進入如下的畫面當中:
圖 1.4-7、用戶端進入 PXE 的選單圖示之示意圖,左側使用 menu.c32 右側使用 vesamemu.c32
如上圖所示,鳥哥測試過兩種介面,分別使用了 menu.c32
以及 vesamenu.c32 來測試顯示的畫面,結果就像上圖,使用 vesamenu.c32
看起來解析度似乎比較好,只是,
預設的配色好像不怎麼樣,可能得要自己去參考說明文件配色一下比較好。使用 menu.c32 的話,就是明顯的顏色對比,但是比較呆板一些的畫面。隨人喜好去調整吧。
由於預設有 30 秒的選擇時間,因此畫面下方會開始讀秒,如果按了上/下按鍵,反白的部分就不會在 default 值預設的光棒處了!如果你在需要的選單上面,按下了『Tab』按鈕,
此時系統就會跳出類似 grub 的互動介面給你修改參數就是!由於我們還沒有安裝系統在硬碟上,因此,鳥哥選擇了第二個項目,亦即是『Boot from PXE Server for Install CentOS 6.4』的項目。
按下之後就會開始進入安裝的偵測畫面中。
硬體偵測完畢,並且讓你:
挑選語系 (直接選 English 即可)
挑選鍵盤格式 (預設的 us 即可)
之後,就開始選擇 CentOS 軟體所在的儲存媒體了!如下圖所示:
圖 1.4-8、進入安裝過程,使用網路上的 CentOS 媒體來源 (URL)
由於我們尚未製作軟體安裝伺服器,因此,我們直接使用國家高速網路中心的 FTP 所提供的軟體來源來安裝!因此,此時請選擇『 URL 』的項目。因為使用 URL 必須要有網路,
因此,安裝程式會要求我們設定 IP !請注意,這個安裝過程使用的網路參數與 PXE 取得的網路參數無關!所以這裡得要重新輸入一次網路參數。因為我們有使用 DHCP 服務啊!
所以如下勾選動態設定就好了:
圖 1.4-9、替安裝程式設定網路參數
然後輸入你查到的網址,如下所示 (使用國高的 FTP):
圖 1.4-10、直接連上國家高速網路中心去線上裸機安裝囉!
如果一切都沒有問題,這個時候就會開始進入安裝畫面,開始進行裸機的線上安裝!你也不用在用戶端燒錄光碟機,非常簡單方便吧!只是有個問題,你得要讓你的機器連上 Internet 去安裝軟體~
那你也知道網際網路的速度要比你區域網路的速度慢很多~如果同時有很多台用戶端電腦要安裝系統,那就糗大了!因此,這時在區網內架設一個軟體安裝伺服器就顯的很重要了!
底下就來聊一聊怎麼建這個安裝伺服器吧!
1.5 透過 NFS、HTTP、FTP 等協定提供軟體安裝伺服器
架設安裝伺服器實在是非常的簡單,尤其是 CentOS 這個版本!你只要下載 CentOS 6.x 的第一片 DVD,將裡頭的資料以 NFS, HTTP, FTP
等方式分享出去,那你的主機就變成安裝伺服器了!就這麼簡單!鳥哥個人比較偏好使用 NFS 來分享,這是因為未來的應用中,我們可能需要網路磁碟機,
NFS 是一個可以直接作為 Linux 網路磁碟機的服務,所以就用它比較簡單!如果你喜歡其他的協定來分享也沒有關係啊!我們可以使用同一個目錄來分享呢!
假設我們 DVD1 放置於 /install/iso/ 目錄內了,預計要分享的 CentOS 6.4 原版 DVD 目錄放在 /install/nfs_share/centos6.4/ 中,
簡單的處理如下:
# 1. 先將 DVD 的資料給他放置於所需要的目錄中,當然直接使用掛載最快!
[root@centos ~]# mkdir -p /install/nfs_share/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /install/nfs_share/centos6.4 iso9660 defaults,loop 0 0
# 特別要注意的是檔案系統與參數,記得光碟使用 iso9660 且需要加上 loop
[root@centos ~]# mount -a
[root@centos ~]# df
可用 已用% 掛載點
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
0 100% /install/nfs_share/centos6.4
# 這樣就掛載結束,比複製來複製去要簡單的多喔!
# 2. 製作 NFS 分享,要注意對內 port 有規範喔!
[root@centos ~]# yum -y install nfs-utils
[root@centos ~]# vim /etc/exports
/install/nfs_share/
192.168.42.0/24(ro,async,nohide,crossmnt)
localhost(ro,async,nohide,crossmnt)
# NFS 的設定是很簡單,不過,要注意由於 server 上面有兩個掛載點在分享的目錄上,
# 所以得要加上 nohide 與 crossmnt 這兩個參數才行!且後續的服務要開比較多就是了~
[root@centos ~]# vim /etc/sysconfig/nfs
RQUOTAD_PORT=901
LOCKD_TCPPORT=902
LOCKD_UDPPORT=902
MOUNTD_PORT=903
STATD_PORT=904
# 找到上面這幾個設定值,我們得要設定好固定的 port 來開放防火牆給用戶處理!
[root@centos ~]# vim /etc/idmapd.conf
Domain = i4502.dic.ksu
Nobody-User = nfsnobody
Nobody-Group = nfsnobody
# 找到上面幾個設定值,我們這裡假設 ID 對應的無此帳號使用 nfsnobody 設定!
[root@centos ~]# /etc/init.d/rpcbind restart
[root@centos ~]# /etc/init.d/nfs restart
[root@centos ~]# /etc/init.d/rpcidmapd restart
[root@centos ~]# /etc/init.d/nfslock restart
[root@centos ~]# chkconfig rpcbind on
[root@centos ~]# chkconfig nfs on
[root@centos ~]# chkconfig rpcidmapd on
[root@centos ~]# chkconfig nfslock on
[root@centos ~]# rpcinfo -p
program vers proto
portmapper
portmapper
# 要注意喔,我們得要啟動的 port 有 111,
這幾個!防火牆要開!
[root@centos ~]# showmount -e localhost
Export list for localhost:
/install/nfs_share 192.168.42.0/24,localhost
# OK!看到上面這些東西,就是搞定囉!讚!
# 3. 然後我們也來開放 www 服務提供這個安裝伺服器吧!簡單作法如下:
[root@centos ~]# yum install httpd
[root@centos ~]# /etc/init.d/httpd start
[root@centos ~]# chkconfig httpd on
[root@centos ~]# mkdir -p /var/www/html/install/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /var/www/html/install/centos6.4 iso9660 defaults,loop 0 0
[root@centos ~]# mount -a
[root@centos ~]# df
可用 已用% 掛載點
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
0 100% /var/www/html/install/centos6.4
# 同樣的,用掛載的應該會比較快速些~
# 4. 如果還想要提供 FTP 的處理呢?那還是簡單的這樣做即可:
[root@centos ~]# yum install vsftpd
[root@centos ~]# /etc/init.d/vsftpd start
[root@centos ~]# chkconfig vsftpd on
[root@centos ~]# mkdir -p /var/ftp/install/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
/var/ftp/install/centos6.4 iso9660
defaults,loop,context=system_u:object_r:public_content_t:s0 0 0
# 上面是同一行,比較重要的是參數的部分多了 context 喔!因為我們這個系統有使用 SELinux,
# 為了要避免掛載的檔案系統出現 FTP 的 SELinux 錯誤,因此這裡得要加上此參數才行!
[root@centos ~]# mount -a
[root@centos ~]# df
可用 已用% 掛載點
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
0 100% /var/ftp/install/centos6.4
# 超級簡單的這樣就搞定了!
很神奇的,這樣就搞定了三個服務的安裝伺服器功能!如果你想要開始測試使用內網的 http, ftp 來安裝的話,請回到
的畫面當中,在 URL 的空格上面,分別填入兩個不同的網址試看看:
WWW: http://192.168.42.254/install/centos6.4
FTP: ftp://192.168.42.254/install/centos6.4
上面兩個網址鳥哥都測試過,透過上面的設定,這個網址是可以直接就進入安裝模式當中沒問題~那如果是 NFS 呢?你得要先回去
的畫面中點選『 NFS directory 』的項目,然後在出現如下的畫面中,才輸入我們詳細的 NFS 分享的 CentOS 6.4 光碟內容的所在目錄:
圖 1.5-1、使用 NFS 作為安裝伺服器的設定方式
因為畫面的關係,所以你看不到全部的輸入資料。請注意,CentOS directory 項目要填寫:『/install/nfs_share/centos6.4』才行喔!
接下來,請自行使用底下的方式來完整的安裝好一套 Linux 在你的系統上。鳥哥這裡使用的是 30GB 的測試硬碟來安裝的,底下僅列出不是自動設定的項目,需要調整的地方:
設定時區的部分,請選擇『 Asia/Taipei 』項目,並且取消『 System clock uses UTC 』的項目;
建立用戶自訂的分割『 Create Custom Layout 』,僅使用 3GB 去掛載於根目錄即可,其他都保留不動;
使用『 Basic Server 』作為軟體安裝的標準即可。
接下來系統就會使用你想不到的速度安裝好一套 CentOS Linux 了!非常簡單吧!這個網路安裝的流程!
2. 用 kickstart 大量部署用戶端 Linux CentOS 系統
完成上面各小節的設定後,你區網內的用戶端電腦應該都能夠透過網路來安裝 CentOS 了!只是,比較傷腦筋的地方在於,你還是得要手動一部一部電腦去開機,然後一步一步去選擇需要的安裝選項後,
最終按下安裝,系統才會自動的幫你安裝妥當。有沒有可能讓系統自己幫我安裝而不用選擇呢?可以啊!那就透過 kickstart 這個機制吧!
2.1 kickstart 可用參數
我們在上個小節的最後一段當中,有請你自行安裝了一個超小型的 CentOS 系統吧!那麼請你進入該系統去,瞧一瞧 root 家目錄有沒有一個名為 anaconda-ks.cfg 的檔案呢?
請打開該檔案來瞧一瞧內容如何!
[root@client ~]# cat /root/anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
--iscrypted $6$qznCBKF/YnJdX9rB$OeSGN1c6JNCZ/GtqJTvKrN0t/pRkkUlhEXdc...
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone Asia/Taipei
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
#clearpart --none
#part / --fstype=ext4 --size=3000
repo --name="CentOS"
--baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100
@console-internet
@debugging
....(中間省略)....
krb5-workstation
perl-DBD-SQLite
看過這個檔案內容,有沒有覺得好像很熟悉啊!那是啥?沒錯!這就是剛剛你使用安裝程式進行設定項目選擇時,將你選擇的內容記憶起來的資料!透過這個檔案,
你可以知道最初安裝時是如何設定這個系統的。也由於這個系統還記錄了 root 編碼過的密碼,所以,很重要啊!不要隨便外流喔!現在讓我們想一想,
既然這個檔案已經記錄了我們所需要進行的各項步驟,那我透過這個檔案不就可以預先選擇好,然後交給安裝程式去自動執行即可嗎?沒錯啊!就是這樣!
既然知道了這個未來的功能了,那我們當然就得要先來瞭解一下這個 kickstart 檔案的內容才好啊!其實這個檔案大致將所有的動作分為三大部分來設計,分別是:
command (指令項目區段):就是上面檔案中最開頭的部分,亦即是我們主要設定系統的項目!這包括軟體來源、安裝模式(升級或全新安裝)、鍵盤格式、網路設定、
防火牆設定、使用者身份認證設定、時區、SELinux 啟動、開機管理程式與磁碟分割等最重要的項目部分了。
%packages (軟體安裝區段):CentOS 提供的軟體非常多,還有所謂的軟體群組呢!同時還支援第三方協力軟體的來源。因此,kickstart 可以在這個階段來處理各式軟體的安裝。
%pre %post (安裝前、安裝後設定區段):有時候,安裝前後我總是得要針對系統作個設定或測試什麼的,舉例來說,假設我在系統安裝完畢後,想要直接進行開機選單的增加或修改,
然後再進行開機的動作直接生效,我就不用還得要一部一部機器的登入去修改了。還有包括想要直接加入 ssh 金鑰的設定控制等項目,寫在 %post 裡頭的話,
會變的很方便喔!
接下來就讓我們稍微談一談每個區段的重要設定項目吧!
command 一般指令項目區段:
這部分的重點項目有底下幾個常見的設定值,至於全部的完整資訊,可以參考去看更完整的資料喔!
install 或 upgrade (安裝模式,二選一):
如果你想要全新安裝一套 Linux 的話,就選『 install 』,如果你是要升級原本的舊系統,那就選擇『 upgrade 』。在本案例中,我們是想要使用裸機安裝 (沒有預設系統),
所當然是選擇 install 即可。
text, graphical (使用純文字或圖形介面安裝顯示):
一般來說,現在的系統只要記憶體超過 1GB 以上,通常 CentOS 就會主動提供圖形介面來讓使用者進入安裝畫面,記憶體小於 1GB 時,恐怕系統就只會提供純文字介面讓使用者安裝。
老實說,如果是大量自動安裝 CentOS Linux 的話,使用純文字介面的速度會比圖形介面要來的快些,而且也不用去偵測一堆有的沒有的硬體設備 (滑鼠、螢幕、鍵盤...)。
因此,鳥哥通常會在 install 後面再加一行『 text 』來強制進如文字介面的自動安裝,環境比較單純就是了!
cdrom, harddrive, nfs, url (原版軟體位置,擇一即可):
使用光碟安裝就選擇 cdrom,使用硬碟安裝就用 harddrive,我們這裡使用網路安裝啊!所以鳥哥這裡只介紹 nfs 以及 url(網址) 兩種方式的來源撰寫方式。
此外,也要記得,這個設定值得要接在 install 後面設定比較好喔:
url:以本章的 http/ftp 協定而言,應該要寫成如下的模樣來告知 kickstart 去哪裡讀取軟體:
http://192.168.42.254/install/centos6.4
ftp://192.168.42.254/install/centos6.4
nfs:以本章的 NFS 分享目錄來說,就應該要寫成:
--server=192.168.42.254
--dir=/install/nfs_share/centos6.4
lang (系統語系設定):
你可以選擇系統的語系,一般來說,我們都會選擇台灣的中文語系啊!只是,在純文字模式底下,中文是沒有辦法被顯示出來的,因此,安裝過程中會使用英文顯示,
等安裝完成後,在可以見到中文的環境中就能使用中文語系了!另外,基本上我們建議使用萬國碼 (unicode),因此,建議的設定為:
lang zh_TW.UTF-8
keyboard (系統鍵盤按鍵格式):
選擇鍵盤格式啊!也算重要吧!一般台灣使用美式鍵盤,所以這樣設定即可:
keyboard us
network (網路參數設定):
一般來說,使用 kickstart 就是為了要方便設定,因此,除非要對應固定的網卡來客制化設定,否則,一般大家都是使用 dhcp 來設定即可。
所需要設定的項目包括哪一張網卡要啟動 (--device)?開機時要不要啟動 (--onboot)?使用什麼方式設定 IP 等等 (--bootproto dhcp/static)。
我們以 eth0 的 dhcp 方式設定如下示意:
network --onboot yes --device eth0 --bootproto dhcp
如果想要使用固定 IP 的設定,那可能就得要這樣做了:
network --onboot yes --device eth0 --bootproto static --ip 192.168.42.201 --netmask 255.255.255.0
--gateway 192.168.42.254
--nameserver 192.168.42.254
rootpw (設定 root 密碼):
設定 root 密碼是很重要的!也因為 root 密碼不希望直接以明碼的方式設定在此檔案內,因此,我們得要經過編碼才行。
但是加密的密碼怎麼來?最簡單的方式,使用 grub-crypt 來處理即可。這個指令預設使用 sha512 加密格式,如果要使用其他加密格式,
請自行 man 一下該指令囉。
[root@centos ~]# grub-crypt
&==輸入一次密碼
Retype password:
&==再輸入一次密碼
$6$fPCvnGklAR4Qbxhp$RfFL4.wwZml.mWbej6HHYWTAE6ZLRV8/d...
&==這就是加密過的密碼!
取得密碼後,使用如下的方式設定即可:
--iscrypted $6$fPCvnGklAR4Qbxhp$RfFL4....
firewall (防火牆設置):
一般來說,我們用戶端使用的系統,防火牆一定要啟動之外,如果是內網的 Linux 系統的話,只要啟動能夠讓網路管理員可以遠端操控的 ssh 即可。
當然啦,如果你開心的話,在區網內將防火牆取消也沒關係,反正是用戶端而且是緊急狀態下才會使用的系統啊!由於我們後續還會自己手動設定防火牆,
因此這部分可以先啟用 ssh 即可。相關設定如下:
# 不要在這部電腦使用防火牆系統,直接放行所有連線功能:
--disabled
# 僅放行 ssh 的連線功能:
--service=ssh
&==啟用的服務,可以是 ssh, telnet, smtp, http, ftp 等等
--port=22:tcp
&==啟用的埠口,也可以使用 2049:udp 之類的模式!
# 上面兩個取任何一個都可以!鳥哥個人是比較喜歡使用號碼的 port number 來顯示!
# 讓 eth1 變成信任網域,且放行 port 22, 25, 80 等埠口:
--port=22:tcp,25:tcp,80:tcp
--trust eth1
# 如果有多個網卡,可以指定某張網卡變成信任裝置,這樣直接放行所有的進出封包在 eth1 上頭~
# 但不包括其他 eth0, eth2...介面,僅有 eth1 是信任的意思。
authconfig (放行使用者登入的身份認證模組):
一般來說,通常 Linux 主機要讓使用者登入時,只參考 /etc/passwd, /etc/shadow 等檔案資料,若有該帳號的相關資訊,並且使用者密碼輸入正確,那就可以登入系統了。
不過,登入時,到底加密的密碼驗證機制是透過什麼方式的演算法,就可以在這個項目上詳細的說明了。一般來說,目前已經使用 sha1 的 512bits
複雜演算法的方式來取代較簡單的 md5 編碼。因此你會看到如下的設定值:
# CentOS 預設的身份驗證設定值:使用 sha1 512bits 演算法
authconfig
--enableshadow
--passalgo=sha512
&==較佳的預設值!
# 如果想要使用舊的 md5 編碼來取代新的 sha1 編碼,可以這樣做看看:
authconfig
--enableshadow
--enablemd5
selinux (SELinux 相關模組):
在區網內的用戶端系統,你是可以將 SELinux 暫時關閉的!不過,從 CentOS 6.0 以後,鳥哥習慣了有 SELinux 的日子!至少得要啟動在 permissive 的寬容模式才好。
因此鳥哥這裡建議可以改成這樣:
--permissive
# 主要的模式有:
--enforcing
--disabled
--permissive 喔!
timezone (設定系統所在區域的時區):
時間是很重要的,所以得要選擇時區。鳥哥近年來所安裝的系統,為了適合所有學生與課程的安排,都得要處理成多重作業系統安裝。因此,不太適合會將 BIOS 時鐘調整為格林威治時間的 UTC,
因此,建議將 --utc 拿掉比較妥當!所以這裡選擇的台灣時區就變成:
Asia/Taipei
&==建議改成這樣
Asia/Taipei
&==以前預設的時區模式
# 更多系統支援的時區列於 /usr/share/zoneinfo/ 目錄下,請自行參考喔!
bootloader (開機管理程式的安裝與設定):
開機管理程式 grub 可以安裝於 MBR 也可以安裝於 Boot sector (或 superblock) 內,同時,也得給予開機選單內核心項目的核心參數才行!預設的情況以及可以修改的部分如下所示:
# 原本預設的 bootloader 安裝於 MBR 以及預設 CentOS 6.x 的核心參數如下:
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
# grub 安裝於 MBR, 安裝於 vda 那顆硬碟上,且增加核心參數為 crashkernel=auto rhgb quiet
# 先找 vda 安裝,如果找不到,就找 sda 安裝,再找不到,就找 hda
安裝在 MBR 內:
bootloader --location=mbr --driveorder=vda,sda,hda --append="crashkernel=auto rhgb quiet"
halt, reboot, poweroff, shutdown:
安裝完畢之後,需要安裝程式幫你的系統進行什麼行為的意思。一般來說,如果是 kickstart 的環境中,這個值沒有設定的話,就會直接進入 『reboot』重新開機的階段。
如果你想要系統安裝完畢後自動關機,那就使用 『poweroff』 即可,使用 shutdown 跟 poweroff 類似。那如果你想要讓安裝完畢後等待使用者按任意鍵才繼續,
就像一般手動挑選設定來安裝 Linux 的最後一步,要你按下一步才會重新開機的模式時,那就使用 『halt』 停止即可。
zerombr (是否初始化尚未分割或有問題的分割表):
如果我們的硬碟是全新的,此時硬碟內的第一個磁區會是空空如也,那麼我們的安裝程式可能會判斷這個分割表是其他作業系統所提供的,為了擔心不小心誤刪資料,
因此系統都會詢問你:『要不要初始化』!這對 kickstart 來說,可能會造成些許困擾~因此,如果要強制初始化的話,可以加上 『zerombr』 來進行初始化即可。
clearpart (是否清除分割表,這個重要!):
既然要安裝在系統上,就得要進行分割才行。不過,如果你的分割表不想要被破壞,那麼就得要使用 clearpart --none 才行!不過我們這裡使用裸機安裝嘛!所以當然得要重新分割。
因此,clearpart 就得要寫成
--all 了!那如果你有很多顆硬碟呢?然後僅有一顆要進行重新分割,此時就得要使用『 --drives 』來說明哪顆硬碟要被分割囉。所以可以這樣做:
# 所有硬碟的分割表通通被清除!
# 僅清除 vda 硬碟的分割表,其他的硬碟不要清除分割表!
--drives=vda
part (詳細的分割參數):
分割表清理完畢,再來就是進行分割了。假設我們要進行如下的分割:
根目錄為主要分割,使用 5GB 硬碟
/home 為主分割,使用所有剩餘硬碟容量
/usr 使用 10GB
/var 使用 20GB
/tmp 使用 1GB
swap 使用 1GB
那相關的設定值就會變成如下模樣:
--fstype=ext4
--size=5000
--ondisk=vda
--asprimary
--fstype=ext4
--ondisk=vda
--asprimary
--fstype=ext4
--size=10000
--ondisk=vda
--fstype=ext4
--size=20000
--ondisk=vda
--fstype=ext4
--size=1000
--ondisk=vda
--fstype=swap
--size=1000
# 如果僅有一顆硬碟,那麼 --ondisk 可以省略喔!
# 使用 --size 來規範該分割的大小,單位是 MB 囉!
# 使用 --grow 就可以讓系統自動去判斷最大可用容量,然後通通丟給該分割!
# 使用 --asprimary
就會將該分割強制列在主要分割類型中!
我們這裡只講簡單的分割類型,更複雜的 LVM 或軟體磁碟陣列的類型,一般鳥哥是建議安裝好之後手動去調整。如果你想要安裝時就使用這些 LVM 或 RAID 的類型時,
那就請自行參考文末的參考文獻囉!
services (預設開機啟動或關閉的服務):
預設安裝好 CentOS Linux 之後,會有很多服務就啟動了。如果你想要讓某些服務開機關閉或啟動,那就使用這個項目來處理。
例如,如果你不想要開機啟動 cups, kdump, acpid, portreserve 這四個服務,那你可以使用如下的方式來取消開機啟動喔!
--disabled
cups,kdump,acpid,portreserve
repo (額外的 yum 軟體倉庫):
用過 CentOS 的 yum 後,大概你會知道,CentOs 的軟體會依據不同的用途而分門別類,預設提供的就有三大軟體倉儲系統,包括 OS (原有軟體)、updates
(升級 patch 軟體) 以及 extras (額外軟體) 等。所以,如果你在安裝過程中還需要額外的非原版光碟的軟體倉儲時,就可以使用這個 repo 來給予。
在預設的環境底下,就寫入與安裝來源相同的資料即可。老實說,這個 repo 也可以不寫沒關係的!
repo --name="CentOS"
--baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100
# --name 接這個 yum 軟體倉儲的名稱,可以自訂一個名字即可
# --baseurl 就是軟體來源~上述為 NFS 的寫法,如果是 url 的寫法,就直接 --baseurl=http://xxx 即可
# --cost 這個來源的權重比例
上面鳥哥僅列出常見的 kickstart 選項,還有很多其他選項,就請自行參閱相關的文獻資料囉!接下來讓我們來看一看軟體安裝區段能有什麼特殊的功能吧!
%packages 軟體安裝區段
玩過 yum 就會知道,一般我們在安裝軟體時,可以獨立安裝某一個特定軟體 (yum install package),也可以安裝整個軟體群組 (yum groupinstall grouppackage)!
那我怎麼知道有哪些軟體群組可以使用呢?這時就得要查詢原版光碟內的 repodata/*comps.xml 檔案了!舉例來說,請到目前你伺服器內的
/install/nfs_share/centos6.4/repodata/*comps.xml 檔案內,使用關鍵字 『group』 去查詢一下,就會看到很多安裝過程中會出現的軟體群組了!
以我們在上一小節談到的安裝內容 (basic server) 來說,相關的軟體與軟體群組有這些:
&==前面加個 @ 的,代表是軟體群組喔!
@console-internet
@debugging
@directory-client
@hardware-monitoring
@chinese-support
&==中文語系支援!這個重要!
....(中間省略)....
&==直接寫軟體名稱的,就是單一軟體而已!
device-mapper-persistent-data
....(底下省略)....
一般來說,所有的軟體都可以在後續才安裝!不過,如果你想要一安裝完畢就能夠看到圖形介面以及所有相關的其他語系顯示畫面,那就得要安裝額外的語系支援。
同樣可以到
*comps.xml 檔案內找到相關的軟體群組來安裝。舉例來說,如果你想要安裝法語語系,那就得要加個:『 @french-support 』在你的 %packages 區段內囉!
%pre, %post 安裝前、安裝後的額外動作區段
假設你的 kickstart 是要給不同的機器設備共同使用的,但我們知道所有的設備其實硬碟數量與大小都不相同。那能不能在開始解析 kickstart 之前,先偵測系統的磁碟設備,
根據偵測的結果製作出分割表的規劃後,才進行 kickstart 的解析,最後才開始安裝呢?是可以的!那就是將所需要偵測與作出分割資訊的檔案透過 bash shell 去檢測,
然後在 kickstart 內使用『 %include somefile 』的方式將該資料彙整進來即可~這時就得要將該動作放置於 %pre 的區段內了!
不過 %pre 的用途比較少,因為安裝前大概只要注意到硬體偵測,以釐清我們想要安裝的模式為何而已。如果是安裝後到重新開機前的行為,那就熱鬧多了!
因為我們可能會增加 ssh 的金鑰、額外掛載與設定某些特定的腳本程式到 /etc/rc.d/rc.local、額外進行其他 partition 的完整復原等等。舉例來說,如果我想要安裝完畢之後,
讓 root 加入 ssh 金鑰,這樣我才能夠不用密碼登入此機器時,那可以這樣處理:
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root.root /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EA...== root@i4502.dic.ksu" && /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys
chown root.root /root/.ssh/authorized_keys
當然啦,上面那個金鑰的內容 (echo 後面雙引號的內容) 你就得要自己貼上去了~
2.2 一個電腦教室內簡易主控系統的範例
談完了大致的 kickstart 參數後,那怎麼用在我們想要處理的批次安裝電腦教室內的所有電腦主機呢?最簡單的方式就是,拿上一個小節做完的 anaconda-ks.cfg 來改即可!
簡單快速又方便!現在鳥哥想要使用底下的方式來處理批次安裝:
透過純文字的方法全新安裝一套 CentOS 系統
我要透過區域網路內的 NFS 伺服器來取得安裝軟體來源
網路預設使用 dhcp 服務來啟動,且開機就會驅動網卡
root 密碼是要給予加密過的資料
防火牆預設放行 22, 25, 80, 111 等埠口
認證設定保持原有的狀態即可 (sha512)
將 SELinux 啟動於寬容模式下
安裝完畢後進行重新開機的動作
僅作出一個 3GB 大小的根目錄來安裝這個小型控制系統即可
關閉 cups, kdump, acpid, portreserve 等服務
安裝的軟體主要為 basic server 類型,因此保留上一小節安裝後的原有的項目即可
安裝完畢後加入 root 的 ssh 金鑰!
鳥哥預計將這個 kickstart 放置於 /install/nfs_share/kickstart/ 目錄內,且取名為 pcroom_raw.ks 檔案。在這個檔案開始處理前,我們有兩個東西需要先取得,
一個是 root 密碼,一個則是金鑰中公鑰的內容。我們可以簡單的透過底下的方式來取得相關的資訊:
# 1. 取得 root 密碼:
[root@centos ~]# grub-crypt
Retype password:
$6$ZXrlk3POd9J1kqa4$PmTaai.UlWf.exaXFP.aqmn6C4gdQvP9NpExsJmcJIDAKD8VEZArkVtfr/KDnScY41tZGJxwix0ZvEbsmjLea0
# 上面這一串就是我們要的資料啦!
# 2. 取得金鑰的公鑰資料:
[root@centos ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
&==輸入 Enter
Enter passphrase (empty for no passphrase):
&==輸入 Enter
Enter same passphrase again:
&==輸入 Enter
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
&==這就是我們要的!
The key fingerprint is:
51:ee:b0:29:e5:3a:01:eb:57:33:f3:73:34:12:0b:26 root@server.i4502.dic.ksu
[root@centos ~]# cat /root/.ssh/id_rsa.pub
# 輸出的內容就是我們要的資訊!!
好了,那就讓我們來調整一下這次我們所需要的 kickstart 檔案內容吧!
[root@centos ~]# mkdir /install/nfs_share/kickstart
[root@centos ~]# vim /install/nfs_share/kickstart/pcroom_raw.ks
nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4
lang zh_TW.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
--iscrypted 剛剛你用 grub-crypt 作出的密碼參數
firewall --port=22:tcp,25:tcp,80:tcp,111:tcp,111:udp,9000:udp,9001:udp
authconfig --enableshadow --passalgo=sha512
selinux --permissive
timezone Asia/Taipei
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
clearpart --all
part / --fstype=ext4 --size=3000
--disabled cups,kdump,acpid,portreserve
repo --name="CentOS"
--baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100
@console-internet
@debugging
@directory-client
@hardware-monitoring
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform
@server-policy
device-mapper-persistent-data
samba-winbind
certmonger
krb5-workstation
perl-DBD-SQLite
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root.root /root/.ssh
echo "剛剛你製作出的 id_rsa.pub 檔案的內容" && /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys
chown root.root /root/.ssh/authorized_keys
[root@centos ~]# chmod 644 pcroom_raw.ks
瞭解了 kickstart 的參數後,這個小節的相關參數修改與製作就顯的簡單多了!接下來,就讓我們準備來大量安裝系統吧!
2.3 搭配 PXE 使用的方式
我們得要告知用戶端在取得 PXE 的環境後,還能夠自動下載這個 kickstart 設定檔,這樣用戶端電腦才會自己安裝而不會進入詢問模式。這時得要修改 pxelinux.cfg/default 內容了!
我們現在增加另外一個選單,這個選單可以讓系統自動的以剛剛的 kickstart 方式來自我裸機安裝~這樣做就可以了!
[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL kickstart1
MENU LABEL Boot from PXE Server for AUTO Install CentOS 6.4 raw
kernel ./kernel/centos6.4/vmlinuz
append initrd=./kernel/centos6.4/initrd.img ks=nfs:192.168.42.254:/install/nfs_share/kickstart/pcroom_raw.ks
重點是上面特殊字體的部分!可以是 nfs 也可以是 http:// 的格式!看你的資料要放哪裡就是了。鳥哥偷懶一下,就直接擺內網原本要分享出去的位置而已。
好了,接下來請到內網的用戶端開機一下,使用網路開機喔!看看能不能進入第三個選單,然後讓系統自己安裝去!
圖 2.3-1、在 PXE 當中新增一個可以自己安裝的選單!
圖 2.3-2、以純文字模式安裝這套新系統的圖示
在鳥哥的測試中,很快的啦!幾分鐘就安裝好了這樣的一套系統~相當的簡單快速!不用挑選!好開心啊!另外,這一套系統如果搞定了之後,拜託注意一下,
請部分,參考一下 getmac.sh 的內容,
根據該功能重新設定一下你的 DHCP 伺服器設定檔,讓你的用戶端 IP 能夠與座位搭配上喔!
3. 以 Demo 機製作映像檔進行大量用戶端系統的還原
如果你跟鳥哥一樣有特殊的作業系統環境需求,那麼可能得要花點功夫來思考一下怎麼進行作業系統的初期安裝才好!安裝好了之後,再將該 partition 所在的環境給他完整的備份,
然後丟給其他電腦來作為復原的機制!這樣就成功啦!這過程是挺複雜的~底下我們就來玩一玩~
3.1 Demo 機多重作業系統的規劃與安裝
在鳥哥工作的資訊傳播系單位中,因為系上老師們使用的軟體都不一樣,很多老師還是需要 Windows 上面的重要軟體。因此,鳥哥得要將電腦系統安裝成多重作業系統。
在這樣的情況下,我們系上需要安裝 (1)第一套 Linux 管理系統 (2)windows 7 系統 (3)上課用 CentOS 桌面系統,這還沒有提到資料共用的 windows D 槽~
好了,假設我們已經使用 kickstart 安裝好了第一套 Linux 管理系統,那接下來 Windows 系統怎麼安裝呢?當然你得要調整用戶端 BIOS 變成光碟機開機,放入 Windows 7 的原版光碟,
接下來請自行安裝你的 Windows 系統吧!
Demo 機的分割注意狀況:目標磁碟總是比來源磁碟大才好
因為 Demo 機未來安裝的系統都是要做為備份的來源,因此安裝在上頭的資料當然就得要能夠復原給其他用戶端電腦。一般來說,目標的磁碟總是要比來源的磁碟大才好。
例如,原本 Demo 機器的 Windows 佔用了 20GB 的話。那麼你的其他用戶端電腦,除非系統與磁碟是一模一樣的,否則的話,最好能夠加大到類似 20.1GB 之類的容量,那未來在復原時比較不會出問題。
這是鳥哥過去的經驗啦,提供給您參考囉!
另外,安裝過 Windows 7 的朋友都知道,Windows 會自己搞一個額外的 100MB 分割來儲存資訊。不過,鳥哥不是很喜歡多這個分割在。但是這個分割是 windows 正常安裝所產生的,
以正常手段是很難避免掉!所以,為了避免這個問題,鳥哥習慣上都會先自己在 Linux 控制系統上面使用 fdisk 或 parted 手動建立足夠的分割,然後再強迫 Windows 安裝到固定的分割槽中,
這樣就不會多出那個怪異的 100MB 分割槽了。
現在,鳥哥假設我這裡預計要安裝的 Windows 會佔用 20.1GB 的容量,剩餘的容量都給 Linux 使用。不過如前所述,Demo 機器的容量要檢小一些。因此,底下我們要處理的方式中,
Windows 的 /dev/vda2 僅擁有 20GB,剩餘的容量中,除了給 Linux Desktop 用之外,還會有 100MB 留在最面沒有使用到!底下是鳥哥的測試機分割示意:
# 1. 先看看剩下多少容量吧!
[root@centos ~]# parted /dev/vda unit MB print
Model: Virtio Block Device (virtblk)
磁碟 /dev/vda:31527MB
&==此硬碟的最大可用容量
磁區大小 (邏輯/物理):512B/512B
分割區:msdos
&==此硬碟的 /dev/vda1 起始/結束磁柱
# 2. 建立的新分割為 NTFS 檔案系統,且起始為 3147MB 結束為 *1.024=20
請注意,parted 顯示的 MB 為十進位的 1000 倍而不是我們常用的 1024 倍!
[root@centos ~]# parted /dev/vda mkpart primary NTFS 3147MB 24120MB
[root@centos ~]# parted /dev/vda unit MB print
&==注意大小的地方即可!
# 3. Linux Desktop 容量應該在 24120MB ~ () = 31427MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 24120MB 31427MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 31427MB 31527MB
[root@centos ~]# parted /dev/vda unit MB print
請注意,鳥哥是特別留下 100MB 在最後面,這個不見得用的到!如果每部機器的磁碟都一模一樣的話,那就無所謂~如果不一樣大的話,那麼等一下用戶端的電腦就得要先作個手腳~
讓他們的 /dev/vda2, /dev/vda3 稍大一下,這樣在復原時比較不會出問題啦!
安裝第二個系統,Windows 7 為例:
請先確認你的光碟機放了 Windows 7 的原版光碟,並且調整了 BIOS,之後直接進入安裝程式,因為我們先作了分割了,因此,你就會看到如下的畫面,
直接按下箭頭點選處安裝到 /dev/vda2 即可!
圖 3.1-1、安裝多重作業系統中,安裝在先分割好的 partition 上的獨立 Windows 7 示意圖
安裝好了 Windows 7 之後,鳥哥建議可以關閉某些不必要的服務,以及更改一些可能會發生問題的設定,並增加一個可以自動修訂主機名稱的軟體後,
再開始進行 Windows update。等到更新完畢後,再安裝你所需要的所有軟體。等到軟體都處理妥當了,這時才開始進行後續的備份與大量復原的動作吧!底下是鳥哥建議可以進行的工作:
固定虛擬記憶體的分頁大小:
在 Linux裡面我們稱為 swap 而在 Windows 裡面就被稱為分頁檔,這個分頁檔通常是實體記憶體的 1~2 倍大。由於這個值會依據你的系統而變,所以大小常常不固定,這會造成系統的些許困擾
(佔用太多備份的儲存容量)。所以鳥哥通常不喜歡這個值讓系統管理,都會自己設定固定值啦!。
於是,鳥哥都會主動的將他設定為差不多 1~2GB 左右。在本案例中,我們將他設定為 1024MB 吧!調整的方法為『我的電腦右鍵』 --& 『內容』
--& 『進階系統設定』 --& 『效能』 --& 『進階』 --& 『虛擬記憶體』 --& 『變更』 (填好數值記得要按下箭頭 9 的 "設定" 才好!)
圖 3.1-2、設定 Windows 7
的分頁大小,將它的數值固定起來
取消磁碟重組:
由於我們會將整個檔案系統都予以備份,因此,似乎也沒有必要進行磁碟重組啦!所以,個人建議是可以拿掉磁碟重組的排程。
作法很簡單:『開始功能表』 --& 『所有程式』 --& 『附屬應用程式』 --& 『系統工具』 --& 『磁碟重組工具』 --& 『設定排程』請取消
圖 3.1-3、設定 Windows 7 磁碟重組,將磁碟重組排程取消了!
取消電腦的系統還原功能:
既然現在系統已經有了可以備份的資料,本機的系統還原如果還打}

我要回帖

更多关于 松下伺服电机说明书 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信