有用过佳能xhal佳能摄像机使用方法的朋友吗效果如何

查看: 13941|回复: 61
入手佳能XF100,此处设立讨论交流贴!
在线时间 小时
本帖最后由 xumac 于
13:42 编辑
一直在忙于摄影,一直使用佳能摄影器材很多年,从**D用到XD,从套头用到红定,闪光灯,电池盒,直角取景器。。。。对C家的产品印象很好,关注DV很长时间了,工作关系一直和摄像师打交道,S系的摄像机占主流,C家的真是少之又少,想了解点C家的信息还真不容易,只有上国外网站看看,没想到国外很多论坛对C家DV的讨论之热烈出乎想像!似乎佳能官网也丰富很多。。。
我选XF机器主要是看中它的FULL HD(50Mbps,422),双卡(CF),机器轻巧。
现在购买还送2T移动硬盘和32G 800X的CF卡,折合下来才15000,我认为应该入手了,XF300系列不是不好,是太大了,不灵活机动。
现在机器到手,试拍了一周,说说感觉:
(1)太多的人认为这机器是单芯片,没三芯的好,这是老黄历了,单片的和三片的都有好机器和一般的DV,用芯片数量一句话评价某款机器那是很愚的,XF100的单片是新设计的,不是简单意义上的从三减到一,用单片是为了使机器更轻便,别小看这块单片,真正的207万像素的高清芯片,根据C家先进的算法,可以使画面达到高清标准,科技在进步,电子的东西可以做薄做小,手机可以,DV为何不可以?
(2)此机器很小巧,很多人(包括客户和从业者)都有大机器有枪调有气派的想法,这种想法很可笑,看拍摄的内容和环境及需求,机器该大就要大,哪怕去租也要去租,有些场面该小的时候就要小,看见那些空壳大机器在小环境里拍摄真是好笑有好气,最终看出片效果,遇到这种客人生意不接也罢,遇到这种同行不搭理也罢,老实说怕别人鄙视其实就是自己没过“面子”这一关,机器小巧可以长时间手持不累,拍摄角度灵活多变,场地适应性极强,XF100虽然小巧,但手感出众,各种预置按钮开关一样不少(部分预置移到LCD显示菜单里操作了),整机给人感觉很精致,很协调。常看日本综艺节目你就会发觉现场的拍摄和各种环境的拍摄,很多都是小巧专业DV的身影。
(3)关于CP值,视频后期要比平面难一点,问题就在于平面可以用RAW拍摄,回来可以调整掉大部分的画面问题,在用PS精修完成,视频不一样,前期不进行好的CP设定,后期再对前提进行调整就要费大功夫了,XF100也一样,所以在这里也欢迎大家讨论和交流佳能XF系列摄像机的CP值心得
(4)抛砖引玉自己拍了2段试机片,发优酷的话画质会压缩看不清晰,谁要留信箱吧,最好是QQ信箱,我发中转站去,或者加佳能XF100摄像机交流群接受
大家喜欢XF系列机器的,用XF系列机器的,都集中过来吧,交流使人进步,C家的人本来就少,再不拧集起来,会越来越散。。。
今天晚上去拍拍夜景,看看XF能牛到几何?
IMG_6951.JPG (39.99 KB, 下载次数: 81)
13:31 上传
期待你更精彩的下一帖!
DVEDIT有您更精彩!
在线时间 小时
看过这机子不算小DV,外形还可以
在线时间 小时
推测要出xf200了,因为小弟xa10和小小弟hfg10都出升级版了,同门师兄xf的镜头和cmos也该换换了
在线时间 小时
建议LZ发测试短片到土豆上,可原片质量观看。
在线时间 小时
有朋友使用过佳能的机器,它的白平衡我非常喜欢,很正的感觉!
在线时间 小时
http://www.屏蔽视频网站2/my/programs/#itemNormal/?page=1&sort=1&desc=true&&
XF100默认设置拍摄小样片,感觉上传后的画质还是下降了许多,将就看吧,需要原片找我
点击原画看,能清晰&
在线时间 小时
赫赫有鸣 发表于
推测要出xf200了,因为小弟xa10和小小弟hfg10都出升级版了,同门师兄xf的镜头和cmos也该换换了
科技进步,器材更新,无法阻挡的潮流,但有一点很重要,新产品它的价格估计不是一般人能接受的,等它下降了,更高的型号又要出来了,抓住性价比最佳的时间
在线时间 小时
XF100目前说明书中,会适时根据调节CP值来拍摄不同的片子上传给大家看
在线时间 小时
这是2011年的产品了,现在很期待入手佳能XA25,该机使用了一支新20倍光学变焦高清摄影镜头,其广角端可达26.8mm(35mm规格换算),并能够在整个变焦范围内实现MOD(最小物距)仅为60cm的近摄。创新的三维实时镜头构造,在实现光学式防抖的同时,还兼具安静性和快速变焦速度。同时采用了Hi-UD(超低色散玻璃)能够大幅度消除了色差。此外,新镜头还融入了源于EF镜头的圆形光圈和EMD技术,为影像带来近似圆形的焦外虚化,并对光圈口径变化进行高精度控制。与新镜头相匹配的,是新的HD CMOS PRO传感器和影像处理器 DIGIC DV 4。新传感器尺寸为1/2.84型,视频有效像素约291万像素。新传感器和新影像处理器DIGIC DV4的组合,可实现更大的动态范围。DIGIC DV4影像处理器支持记录AVCHD/MP4两种模式,凭借双卡槽设计可在2张大容量SD卡上同时记录格式和比特率都不同的影像数据。并支持利用不同的帧率,实现升格或降格拍摄效果。
在线时间 小时
啥价格呢?这是关键问题请问佳能摄像机连接电脑要怎么做?3个回答changepalea你好,你可以用相机带的数据线,计算机需要安装软件和驱动;也可以你到电子商场买一个视频采集卡安装到电脑里就可以连接了(视频采集卡一种是台式电脑,一种是笔记本的);还可以直接把储存卡插进电脑,就可以读出来,要是没有借口就去买一个读卡器就行了。
希望可以帮助到你
雪橙兔子CANON摄像机一般都带有HDMI输出接口,可以直接和电视机的HDMI输入接口连接;方法如下:
1、准备一条HDMI线(摄像机一般都有配送的),一头插入电视机的HDMI输入接口,另一头插入CANON摄像机的HDMI输出接口 ;
2、启动电视机和摄像机;将电视机的信号源切换为HDMI模式,电视机就会显示出摄像机的启动画面了,表明电视机和摄像机已经成功连接;
3、接下来就可以在摄像机上操作播放拍摄的图片或者录制的视频,摄像机上的画面和声音都会通过HDMI线同步传输到电视机上播放出来。
zhfoh佳能摄像机和PC连接的话有两种方式:
1、通过USB线连接
用摄像机自带的数据线连接电脑的USB口,再安装下摄像机带的驱动就可以了。
完成后就可以将摄像机存储卡中的数据拷贝到电脑中。
2、通过1394口连接
如果摄像机是磁带式录像机,通过1394卡可以把磁带中的内容采集到电脑中。
这样需要在电脑中安装一块儿1394卡,通过1394线把电脑与摄像机连接起来。
通过剪辑软件控制摄像机采集就可以了。
canon mv850i是磁带摄像机,如果想采集素材,需要以下步骤:
1、在电脑上安装1394卡。
2、在电脑上安装一个剪辑软件,例如绘生绘影、edius之类的。
3、通过1394线把电脑与摄像机连接起来。
4、通过剪辑软件遥控摄像机采集。
热门问答123456789101112131415161718192021222324252627282930相关问答3个回答changepalea你好,你可以用相机带的数据线,计算机需要安装软件和驱动;也可以你到电子商场买一个视频采集卡安装到电脑里就可以连接了(视频采集卡一种是台式电脑,一种是笔记本的);还可以直接把储存卡插...3个回答范你好,HDMI接口是高清接口,单独独立的接口不能同USB通用的,也有没有相应的转接盒,如果是笔记本上有也只是HDMI也是输出接口,如果是台式电脑用带HDMI的采集卡或者相应的接口卡...3个回答埃服小法小米摄像机连接电脑的方法:
方法一、USB连接做PC摄像头:手机、电脑通过USB连接,即可在电脑上使用手机摄像头。
方式二、WIFI连接做PC摄像头:手机、...3个回答小凯MJ05你好,佳能mg7580打印机和电脑连接的方法:
首先你的电脑要有WIFI功能或连接WIFI路由器,然后开启打印机的WIFI进入局域网,让电脑共享打印机就能实现无线打印了...3个回答Elvin_3128您好,就我了解到的来说,摄像机充电都是一样的,关掉机器之后插上电源,摄像机电源插口旁边的指示灯就会亮起来,等指示灯灭了,就代表电充满了。必须是关上机子才可以充电。希望我的回答能够对...4个回答aa摄像机连接电脑
1)您需要正确安装完毕1394卡(台式机使用的是将1394采集卡插入到电脑主板PCI插槽上面,笔记本使用的是将1394采集卡插入到笔记本PCMCIA插槽...3个回答袌型玄1、把网络摄像头接上电源,使其处于等待连接的状态。
2、下载该网络摄像头对应的PC版和手机版的应用程序,并分别安装。
3、把网络摄像头和电脑或手机相连。...6个回答踮起脚尖爱你03sonyhdd摄像机连接电脑方法是:选HDD可以直接在“我的电脑”中选插入摄像机出现的盘符,打开它里面有文件夹,再打开可找到已录制的文件,文件体积大并是。复制到电脑硬盘上用软件合成...3个回答华夏式月天摄像机和电脑连接正确后,打开“我的电脑”,就会多出一个(或几个)盘符(可移动存储器),再打开摄像机这个盘符(可移动存储器),会有多个文件夹,因视频文件都比较大,用鼠标右键逐个查看文...3个回答大青马0434你好!
佳能数码相机连接电脑上,无非就是为了上传照片。
数码相机中的照片要上传到电脑,一般有两种方法:佳能LEGRIA MINI X试用:港囧里的DV原来是这样|佳能|DV_新浪科技_新浪网
& 精品评测 &&正文
佳能LEGRIA MINI X试用:港囧里的DV原来是这样
  大家曾记得在去年火热一时的《港囧》,包贝尔手持一部迷你小DV,记录生活中的点点滴滴,顺便还破了杀人案件,小DV一直贯穿了整个电影故事。也就是这台小DV,不仅携带方便,且可以实现170°的超广鱼眼效果,同时还能够通过翻转屏幕自拍,同时此DV还内置了高保真立体声的录制功能,这次我们就来一起这一台便携式DV。
佳能 LEGRIA mini X
  如何看待佳能LEGRIA MINI X摄像机?
  说到摄像机,大多数朋友脑海当中的摄像机造型,都是“黑、粗、长”的摄像机形象,单手握持和侧面打开的显示屏,佳能LEGRIA MINI X的造型可以说是革命性的,随着数码时代的普及,早已淘汰了陈旧的视频磁带记录方式,改为了SD卡或CF卡等数字储存卡,大大了减少了摄像机的体积,造型上也发生了许许多多的改变,来适应不一样的用途。
  在港囧里面,尽管包贝尔给人一个傻根的形象,手里拿着个小DV,随手乱拍一通,整个感觉都是萌萌哒,但也正正突出了手中的佳能LEGRIA MINI X,随心所欲的记录身边发生的事情。佳能LEGRIA MINI系列里面,传递给大家的是一种随时随地、自拍记录精彩生活的理念,很适合年轻人在日常生活中,一段自弹自唱的自拍视频、自拍做菜教学、视频直播等等,都非常合适。
  在佳能LEGRIA MINI X的专业性上,配备了1/2.3寸1280万像素的CMOS感应器,170°的超广角镜头,F2.8大光圈,动态影像160°/64°可变视角,静态170°/78°,电子影像稳定系统,以及DIGIC DV 4影像处理器,支持1080P的50i视频拍摄,码率最大为24Mbps。整体的拍摄水平已经足够用户在日常的使用,同时,还可以拍摄一些高画质要求的视频。
  作为一款注重便携性的数码摄像机,在重量上佳能LEGRIA MINI X展现了其独特的优越性在,重量仅为205克,三维尺寸分别是82×30×109毫米,NB-12L(1910mAh)的电池能够带来150分钟的超长续航时间,同时配备了HDMI输出接口和外置麦克风接口、耳机监听接口等装置,拥有良好的拓展性,对于目前大热的网络直播就非常适合了。
  作为面向自拍爱好者所设计的摄像机,普通的摄像机设计是不行的,在佳能LEGRIA MINI X上面,加入了可调整角度的屏幕,可以翻转约180°的液晶屏,能够自拍,在背后支架上也可翻折近135°,方便用户在多角度上固定拍摄。在录音质量和拍摄功能上下足了功夫,采用大口径立体声麦克风让它具备了堪比专业录音效果的能力。下面我们就来看看这台时尚前卫的摄像机,究竟在使用上面会是怎么样的。
  佳能LEGRIA MINI X的使用体验
  在佳能LEGRIA mini X的外观以黑色为主色调,使用磨砂质感的塑料作为机壳,搭配麦克风的银色金属拉丝,给人一种高端大气黑科技的第一感受,而作为LEGRIA mini 里面的高端产品,黑色与银色搭配充分体现出其专业性。
  在佳能LEGRIA mini X上,采用2.7英寸的约23万像素显示屏,支持触摸功能,电容式触摸屏整体试用体验上与现在的智能手机相当,轻触即可进行菜单的操作,在反馈速度上,稍有欠缺,延迟时间在0.1秒左右,整体仍能接受。
  在佳能LEGRIA mini X的显示屏上面,采用可翻折的显示屏设计,可以实现多角度的翻折,可以自拍,可以俯拍,可以直拍,让我们在使用上面方便了很多。
  佳能LEGRIA mini X的开关与镜头该相连,打开镜头盖既能开机,将两者联动起来,节约了用户的拍摄时间,整个拍摄的过程更加方便。
  在佳能LEGRIA mini X的底部,拥有可翻折的支架,以及一个3.5毫米的脚架接口,让相机能够固定在三脚架上,在《港囧》的电影中,包贝尔所使用的拍摄手柄也是安装在此位置上。
  佳能LEGRIA mini X的支架也是其特色之一,拥有135°的翻折支架,能够实现多种姿态下的固定,用户可以根据自身的使用需求,调整相应的位置进行拍摄,例如放在桌面上,是设置仰拍模式,或者将摄像机固定在书架上,使用俯拍的拍摄角度,如下图所示:
  在佳能LEGRIA mini X的前脸部分,索大的两个麦克风装置非常明显,在录音质量和拍摄功能上下足了功夫,采用大口径立体声麦克风让它具备了堪比专业录音效果的能力。
  在佳能LEGRIA MINI X的调整显示屏背部,使用金属调节支架,为耐用性提供充分的保障,同时作为一款高端定位产品,与佳能LEGRIA MINI系列其他产品使用塑料材质不同,可靠性更高。
  在佳能LEGRIA mini X的左侧,是摄像机的拍摄按键与回放按键,靠近镜头位置的拍摄按钮,两级式的按键,手感较软,能够很方便的让用户自拍,而与其相隔较远的是回放按键,手感上与拍摄按键相区分,较为硬朗。
  佳能LEGRIA mini X在操作和接口上要更为专业和丰富,不仅具备USB模式数据传输接口,同时还支持HDMI直接输出,可以在高清电视或者电脑上直接与大家一起观看拍摄的视频。
  并且在佳能LEGRIA mini X上面,3.5mm的耳机接口与麦克风接口有更好的扩展性,让我感到惊讶的是,LEGRIA mini X还具备一个麦克风收音等级的拨轮,方便我们根据不同的环境来手动调节。
  除了一般的摄像机的按键外,在佳能LEGRIA mini X上面,增加了一个麦克风音量调整旋钮,这样的设计一般在非常专业的摄像机上面所出现的功能,也很好的下放到便携式的摄像机上,同时,也提升了不少的录音性能。
  在佳能LEGRIA MINI X的底部,拥有两个挂饰的接口,不仅可以使用手绳,还可以挂戴一些装饰品,给相机个性化加分。
  在佳能LEGRIA MINI X的底部,是电池仓和储存卡的位置,支持SDHC/SDXC类型的SD卡,而在电池上面,使用NB-12L(1910mAh)的电池,能够带来150分钟的超长续航时间,为我们长时间的拍摄提供充足的保证,而在实际试用当中 ,在一天的正常使用上面,一块电池已经足够了。
  在佳能LEGRIA MINI X上,支持WiFi连接,可以实现WiFi遥控摄像机,在手机上安装“CameraAccess Plus应用程序”,然后连接DV的热点。
  视频拍摄效果
  延时视频拍摄
  在佳能LEGRIA MINI X上,支持延时视频拍摄,用户可以点击菜单中的“特殊记录模式”,选择间隔记录模式,与一般相机的间隔摄影不同,佳能LEGRIA MINI X上面,除了可以拍摄间隔照片以外,还可以拍摄间隔视频,即是间隔5秒后,自动拍摄1秒的视频,将若干个间隔视频连接在一起,形成全新的一段视频。
  在拍摄了若干端间隔视频后,可以选择保留元素材视频,亦可点击删除,形成的间隔视频如下视频效果。
  间隔视频的拍摄功能加入,能够让用户获得更加不一样的效果,可玩性也相应的增加,创作的源泉也来自与此。
  同时在自拍的效果上面,虽然采用了170°超广角的镜头,但是手握自拍的效果还是非常好的,手持既可以以一个非常远的角度进行拍摄,而在球型畸变的情况下,中间人物并不会发生巨大的变形,相反效果更加突出主角的脸部特色,用户可以看着自拍的屏幕,摆出各种特色的表情来自拍。
  得益于立体声的扬声器,佳能LEGRIA MINI X所拍摄的视频,在音效上很好的还原了拍摄的环境,大家可以佩戴耳机视听一下上方视频的效果,可以听到声音非常具有立体感,汽车从左前方往右后方前进,声音与画面非常同步,如果放置于更大的音响影音系统当中,效果将会更加明显。
  静态照片效果
  在静态照片的拍摄上面,总的来说算中规中矩吧,由于并不是他的专业的拍照相机,所以在照片的拍摄上面并不能去苛求,但是佳能LEGRIA MINI X在拍照的表现上算是小有惊喜,在高光比的环境下,高光与阴影都表现的不错哦,色彩还原真实,只是由于像素不足的原因,在细节表现上欠缺,如果仅仅作为自拍来发朋友圈使用,完全是足够的了
  PConline评测室点评
佳能 LEGRIA mini X
  在使用了一段时间后,佳能LEGRIA MINI X给我最大的感觉就是小巧轻便,重量与一部iPhone 7 Plus相当,并不会给你出门增加太多的负担,而超广角的视角可以非常便利拍摄大场景的效果,而在近距离的拍摄时候,也不必担心由于动作过大而走出了镜头外。可翻折性的显示屏和支架,确实非常的方便,即使没有三脚架,也能够轻松固定,拍摄稳定的视频效果,而在特写模式下,相机支持电子稳定系统,拍摄的画面也更稳定,并没有出现果冻的效果。
  在售价方面,佳能LEGRIA MINI X的售价在2750元,时尚年轻的外观,与高性能的素质,这个价格是很不错的,对于希望购置一台现场还原度高的摄像机,时刻记录生活的点点滴滴,能够与好友分享有趣的故事,佳能LEGRIA MINI X可以说是一个非常不错的选择;而对于只是偶尔需要拍摄视频记录生活的朋友,似乎专门购置一台DV摄像机并不太需要,一台手机既可以了;而对于喜欢音乐创作的朋友,购置一台佳能LEGRIA MINI X可以让你在创作的同时,记录下创作中的点滴触动,或许会让你拥有更广阔的创作空间。
小米新品发布会如期举行,曝光的Note2并不是唯一亮点。
Surface一体机、Surface Pro 5/Book 2将是最大的看点。
人像模式中与出现在双镜头的iPhone 7 Plus上。
把手机扔在水盆里,一小时后取出手机,所有功能都正常。
参考价格1999元
超声波指纹识别
1200万像素
CMOS传感器
参考价格3299元
参考价格6388元
A10 Fusionc处理器
亮黑新配色
外观变化不大
参考价格1699元
64GB机身存储鳥哥的 Linux 私房菜
底下尚未更新
第十七章、認識系統服務 (daemons)
最近更新日期:
在 Unix-Like 的系統中,你會常常聽到 daemon 這個字眼!那麼什麼是傳說中的 daemon
呢?這些 daemon 放在什麼地方?他的功能是什麼?該如何啟動這些 daemon ?又如何有效的將這些
daemon 管理妥當?此外,要如何視察這些 daemon 開了多少個 ports ?又這些 ports
要如何關閉?還有還有,曉得你系統的這些 port 各代表的是什麼服務嗎?
這些都是最基礎需要注意的呢!尤其是在架設網站之前,這裡的觀念就顯的更重要了。
從 CentOS 7.x 這一版之後,傳統的 init 已經被捨棄,取而代之的是 systemd 這個傢伙~這傢伙跟之前的 init 有什麼差異?
優缺點為何?如何管理不同種類的服務類型?以及如何取代原本的『執行等級』等等,很重要的改變喔!
17.1 什麼是 daemon 與服務 (service)
我們在就曾經談過『服務』這東西!
當時的說明是『常駐在記體體中的程序,且可以提供一些系統或網路功能,那就是服務』。而服務一般的英文說法是『 service 』。
但如果你常常上網去查看一些資料的話,尤其是 Unix-Like 的相關作業系統,應該常常看到『請啟動某某 daemon
來提供某某功能』,唔!那麼 daemon 與 service 有關囉?否則為什麼都能夠提供某些系統或網路功能?此外,這個 daemon
是什麼東西呀? daemon 的字面上的意思就是『守護神、惡魔?』還真是有點奇怪呦!^_^""!
簡單的說,系統為了某些功能必須要提供一些服務 (不論是系統本身還是網路方面),這個服務就稱為 service 。
但是 service 的提供總是需要程式的運作吧!否則如何執行呢?所以達成這個 service 的程式我們就稱呼他為 daemon 囉!
舉例來說,達成循環型例行性工作排程服務 (service) 的程式為 crond 這個 daemon 啦!這樣說比較容易理解了吧!
Tips 你不必去區分什麼是 daemon 與 service !事實上,你可以將這兩者視為相同!因為達成某個服務是需要一支 daemon 在背景中運作,
沒有這支 daemon 就不會有 service !所以不需要分的太清楚啦!
一般來說,當我們以文字模式或圖形模式 (非單人維護模式) 完整開機進入 Linux 主機後,
系統已經提供我們很多的服務了!包括列印服務、工作排程服務、郵件管理服務等等;
那麼這些服務是如何被啟動的?他們的工作型態如何?底下我們就來談一談囉!
Tips daemon 既然是一隻程式執行後的程序,那麼 daemon 所處的那個原本的程式通常是如何命名的呢 (daemon 程式的命名方式)。
每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!不過,無論如何,這些服務的名稱被建立之後,被掛上
Linux 使用時,通常在服務的名稱之後會加上一個 d ,例如例行性命令的建立的 at, 與 cron 這兩個服務,
他的程式檔名會被取為 atd 與 crond,這個 d 代表的就是 daemon
的意思。所以,在中,我們使用了 ps 與 top
來觀察程序時,都會發現到很多的 {xxx}d 的程序,呵呵!通常那就是一些 daemon 的程序囉!
17.1.1 早期 System V 的 init 管理行為中 daemon 的主要分類 (Optional)
還記得我們在談到過 Unix 的 system V 版本吧?那個很純種的 Unix 版本~
在那種年代底下,我們啟動系統服務的管理方式被稱為 SysV 的 init 腳本程式的處理方式!亦即系統核心第一支呼叫的程式是 init ,
然後 init 去喚起所有的系統所需要的服務,不論是本機服務還是網路服務就是了。
基本上 init 的管理機制有幾個特色如下:
服務的啟動、關閉與觀察等方式:
所有的服務啟動腳本通通放置於 /etc/init.d/ 底下,基本上都是使用 bash shell script 所寫成的腳本程式,需要啟動、關閉、重新啟動、觀察狀態時,
可以透過如下的方式來處理:啟動:/etc/init.d/daemon start關閉:/etc/init.d/daemon stop
重新啟動:/etc/init.d/daemon restart狀態觀察:/etc/init.d/daemon status
服務啟動的分類:init 服務的分類中,依據服務是獨立啟動或被一隻總管程式管理而分為兩大類:
獨立啟動模式 (stand alone):服務獨立啟動,該服務直接常駐於記憶體中,提供本機或用戶的服務行為,反應速度快。
總管程式 (super daemon):由特殊的 xinetd 或 inetd 這兩個總管程式提供 socket 對應或 port 對應的管理。當沒有用戶要求某 socket 或 port 時,
所需要的服務是不會被啟動的。若有用戶要求時, xinetd 總管才會去喚醒相對應的服務程式。當該要求結束時,這個服務也會被結束掉~
因為透過 xinetd 所總管,因此這個傢伙就被稱為 super daemon。好處是可以透過 super daemon 來進行服務的時程、連線需求等的控制,缺點是喚醒服務需要一點時間的延遲。
服務的相依性問題:服務是可能會有相依性的~例如,你要啟動網路服務,但是系統沒有網路,
那怎麼可能可以喚醒網路服務呢?如果你需要連線到外部取得認證伺服器的連線,但該連線需要另一個A服務的需求,問題是,A服務沒有啟動,
因此,你的認證服務就不可能會成功啟動的!這就是所謂的服務相依性問題。init 在管理員自己手動處理這些服務時,是沒有辦法協助相依服務的喚醒的!
執行等級的分類:上面說到 init 是開機後核心主動呼叫的,
然後 init 可以根據使用者自訂的執行等級 (runlevel) 來喚醒不同的服務,以進入不同的操作界面。基本上 Linux 提供 7 個執行等級,分別是 0, 1, 2...6 ,
比較重要的是 1)單人維護模式、3)純文字模式、5)文字加圖形界面。而各個執行等級的啟動腳本是透過 /etc/rc.d/rc[0-6]/SXXdaemon 連結到 /etc/init.d/daemon ,
連結檔名 (SXXdaemon) 的功能為: S為啟動該服務,XX是數字,為啟動的順序。由於有 SXX 的設定,因此在開機時可以『依序執行』所有需要的服務,
同時也能解決相依服務的問題。這點與管理員自己手動處理不太一樣就是了。
制定執行等級預設要啟動的服務:若要建立如上提到的 SXXdaemon 的話,不需要管理員手動建立連結檔,
透過如下的指令可以來處理預設啟動、預設不啟動、觀察預設啟動否的行為:預設要啟動: chkconfig daemon on
預設不啟動: chkconfig daemon off觀察預設為啟動否: chkconfig --list daemon
執行等級的切換行為:當你要從純文字界面 (runlevel 3) 切換到圖形界面 (runlevel 5),
不需要手動啟動、關閉該執行等級的相關服務,只要『 init 5 』即可切換,init 這小子會主動去分析 /etc/rc.d/rc[35].d/ 這兩個目錄內的腳本,
然後啟動轉換 runlevel 中需要的服務~就完成整體的 runlevel 切換。
基本上 init 主要的功能都寫在上頭了,重要的指令包括 daemon 本身自己的腳本 (/etc/init.d/daemon) 、xinetd 這個特殊的總管程式 (super daemon)、設定預設開機啟動的 chkconfig,
以及會影響到執行等級的 init N 等。雖然 CentOS 7 已經不使用 init 來管理服務了,不過因為考量到某些腳本沒有辦法直接塞入 systemd 的處理,因此這些腳本還是被保留下來,
所以,我們在這裡還是稍微介紹了一下。更多更詳細的資料就請自己查詢舊版本囉!如下就是一個可以參考的版本:
17.1.2 systemd 使用的 unit 分類
從 CentOS 7.x 以後,Red Hat 系列的 distribution 放棄沿用多年的 System V 開機啟動服務的流程,就是前一小節提到的 init 啟動腳本的方法,
改用 systemd 這個啟動服務管理機制~那麼 systemd 有什麼好處呢?
平行處理所有服務,加速開機流程:
舊的 init 啟動腳本是『一項一項任務依序啟動』的模式,因此不相依的服務也是得要一個一個的等待。但目前我們的硬體主機系統與作業系統幾乎都支援多核心架構了,
沒道理未相依的服務不能同時啟動啊!systemd 就是可以讓所有的服務同時啟動,因此你會發現到,系統啟動的速度變快了!
一經要求就回應的 on-demand 啟動方式:
systemd 全部就是僅有一隻 systemd 服務搭配 systemctl 指令來處理,無須其他額外的指令來支援。不像 systemV 還要 init, chkconfig, service... 等等指令。
此外, systemd 由於常駐記憶體,因此任何要求 (on-demand) 都可以立即處理後續的 daemon 啟動的任務。
服務相依性的自我檢查:
由於 systemd 可以自訂服務相依性的檢查,因此如果 B 服務是架構在 A 服務上面啟動的,那當你在沒有啟動 A 服務的情況下僅手動啟動
B 服務時, systemd 會自動幫你啟動 A 服務喔!這樣就可以免去管理員得要一項一項服務去分析的麻煩~(如果讀者不是新手,應該會有印象,當你沒有啟動網路,
但卻啟動 NIS/NFS 時,那個開機時的 timeout 甚至可達到 10~30 分鐘...)
依 daemon 功能分類:
systemd 旗下管理的服務非常多,包山包海啦~為了釐清所有服務的功能,因此,首先 systemd 先定義所有的服務為一個服務單位 (unit),並將該 unit 歸類到不同的服務類型 (type) 去。
舊的 init 僅分為 stand alone 與 super daemon 實在不夠看,systemd 將服務單位 (unit) 區分為 service, socket, target, path, snapshot, timer 等多種不同的類型(type),
方便管理員的分類與記憶。
將多個 daemons 集合成為一個群組:
如同 systemV 的 init 裡頭有個 runlevel 的特色,systemd 亦將許多的功能集合成為一個所謂的 target 項目,這個項目主要在設計操作環境的建置,
所以是集合了許多的 daemons,亦即是執行某個 target 就是執行好多個 daemon 的意思!
向下相容舊有的 init 服務腳本:
基本上, systemd 是可以相容於 init 的啟動腳本的,因此,舊的 init 啟動腳本也能夠透過 systemd 來管理,只是更進階的 systemd 功能就沒有辦法支援就是了。
雖然如此,不過 systemd 也是有些地方無法完全取代 init 的!包括:
在 runlevel 的對應上,大概僅有 runlevel 1, 3, 5 有對應到 systemd 的某些 target 類型而已,沒有全部對應;
全部的 systemd 都用 systemctl 這個管理程式管理,而 systemctl 支援的語法有限制,不像 /etc/init.d/daemon 就是純腳本可以自訂參數,systemctl 不可自訂參數。;
如果某個服務啟動是管理員自己手動執行啟動,而不是使用 systemctl 去啟動的 (例如你自己手動輸入 crond 以啟動 crond 服務),那麼 systemd
將無法偵測到該服務,而無法進一步管理。
systemd 啟動過程中,無法與管理員透過 standard input 傳入訊息!因此,自行撰寫 systemd 的啟動設定時,務必要取消互動機制~(連透過啟動時傳進的標準輸入訊息也要避免!)
不過,光是同步啟動服務腳本這個功能就可以節省你很多開機的時間~同時 systemd 還有很多特殊的服務類型 (type) 可以提供更多有趣的功能!確實值得學一學~
而且 CentOS 7 已經用了 systemd 了!想不學也不行啊~哈哈哈!好~既然要學,首先就得要針對 systemd 管理的 unit 來了解一下。
systemd 的設定檔放置目錄
基本上, systemd 將過去所謂的 daemon 執行腳本通通稱為一個服務單位 (unit),而每種服務單位依據功能來區分時,就分類為不同的類型 (type)。
基本的類型有包括系統服務、資料監聽與交換的插槽檔服務 (socket)、儲存系統狀態的快照類型、提供不同類似執行等級分類的操作環境 (target) 等等。
哇!這麼多類型,那設定時會不會很麻煩呢?其實還好,因為設定檔都放置在底下的目錄中:
/usr/lib/systemd/system/:每個服務最主要的啟動腳本設定,有點類似以前的 /etc/init.d 底下的檔案;
/run/systemd/system/:系統執行過程中所產生的服務腳本,這些腳本的優先序要比 /usr/lib/systemd/system/ 高!
/etc/systemd/system/:管理員依據主機系統的需求所建立的執行腳本,其實這個目錄有點像以前 /etc/rc.d/rc5.d/Sxx
之類的功能!執行優先序又比 /run/systemd/system/ 高喔!
也就是說,到底系統開機會不會執行某些服務其實是看 /etc/systemd/system/ 底下的設定,所以該目錄底下就是一大堆連結檔。而實際執行的 systemd 啟動腳本設定檔,
其實都是放置在 /usr/lib/systemd/system/ 底下的喔!因此如果你想要修改某個服務啟動的設定,應該要去 /usr/lib/systemd/system/ 底下修改才對!
/etc/systemd/system/ 僅是連結到正確的執行腳本設定檔而已。所以想要看執行腳本設定,應該就得要到 /usr/lib/systemd/system/ 底下去查閱才對!
systemd 的 unit 類型分類說明
那 /usr/lib/systemd/system/ 以下的資料如何區分上述所謂的不同的類型 (type) 呢?很簡單!看副檔名!舉例來說,我們來瞧瞧上一章談到的 vsftpd 這個範例的啟動腳本設定,
還有 crond 與純文字模式的 multi-user 設定:
[root@study ~]# ll /usr/lib/systemd/system/ | grep -E '(vsftpd|multi|cron)'
-rw-r--r--. 1 root root
2014 crond.service
-rw-r--r--. 1 root root
6 06:51 multipathd.service
-rw-r--r--. 1 root root
6 13:48 multi-user.target
drwxr-xr-x. 2 root root 4096
4 17:52 multi-user.target.wants
lrwxrwxrwx. 1 root root
4 17:52 runlevel2.target -& multi-user.target
lrwxrwxrwx. 1 root root
4 17:52 runlevel3.target -& multi-user.target
lrwxrwxrwx. 1 root root
4 17:52 runlevel4.target -& multi-user.target
-rw-r--r--. 1 root root
2014 vsftpd.service
-rw-r--r--. 1 root root
2014 vsftpd@.service
-rw-r--r--. 1 root root
2014 vsftpd.target
# 比較重要的是上頭提供的那三行特殊字體的部份!
所以我們可以知道 vsftpd 與 crond 其實算是系統服務 (service),而 multi-user 要算是執行環境相關的類型 (target type)。根據這些副檔名的類型,
我們大概可以找到幾種比較常見的 systemd 的服務類型如下:
一般服務類型 (service unit):主要是系統服務,包括伺服器本身所需要的本機服務以及網路服務都是!比較經常被使用到的服務大多是這種類型!
所以,這也是最常見的類型了!
內部程序資料交換的插槽服務 (socket unit):主要是 IPC (Inter-process communication) 的傳輸訊息插槽檔 (socket file) 功能。
這種類型的服務通常在監控訊息傳遞的插槽檔,當有透過此插槽檔傳遞訊息來說要連結服務時,就依據當時的狀態將該用戶的要求傳送到對應的 daemon,
若 daemon 尚未啟動,則啟動該 daemon 後再傳送用戶的要求。
使用 socket 類型的服務一般是比較不會被用到的服務,因此在開機時通常會稍微延遲啟動的時間
(因為比較沒有這麼常用嘛!)。一般用於本機服務比較多,例如我們的圖形界面很多的軟體都是透過 socket 來進行本機程序資料交換的行為。
(這與早期的 xinetd 這個 super daemon 有部份的相似喔!)
執行環境類型 (target unit):其實是一群 unit 的集合,例如上面表格中談到的 multi-user.target 其實就是一堆服務的集合~也就是說,
選擇執行 multi-user.target 就是執行一堆其他 .service 或/及 .socket 之類的服務就是了!
.mount.automount
檔案系統掛載相關的服務 (automount unit / mount unit):例如來自網路的自動掛載、NFS 檔案系統掛載等與檔案系統相關性較高的程序管理。
偵測特定檔案或目錄類型 (path unit):某些服務需要偵測某些特定的目錄來提供佇列服務,例如最常見的列印服務,就是透過偵測列印佇列目錄來啟動列印功能!
這時就得要 .path 的服務類型支援了!
循環執行的服務 (timer unit):這個東西有點類似 anacrontab 喔!不過是由 systemd 主動提供的,比 anacrontab 更加有彈性!
其中又以 .service 的系統服務類型最常見了!因為我們一堆網路服務都是透過這種類型來設計的啊!接下來,讓我們來談談如何管理這些服務的啟動與關閉。
17.2 透過 systemctl 管理服務
基本上, systemd 這個啟動服務的機制,主要是透過一隻名為 systemctl 的指令來處理的!跟以前 systemV 需要 service / chkconfig / setup / init 等指令來協助不同,
systemd 就是僅有 systemctl 這個指令來處理而已呦!所以全部的行為都得要使用 systemctl 的意思啦!有沒有很難?其實習慣了之後,
鳥哥是覺得 systemctl 還挺好用的! ^_^
17.2.1 透過 systemctl 管理單一服務 (service unit) 的啟動/開機啟動與觀察狀態
在開始這個小節之前,鳥哥要先來跟大家報告一下,那就是:一般來說,服務的啟動有兩個階段,一個是『開機的時候設定要不要啟動這個服務』,
以及『你現在要不要啟動這個服務』,這兩者之間有很大的差異喔!舉個例子來說,假如我們現在要『立刻取消 atd 這個服務』時,正規的方法 (不要用 kill) 要怎麼處理?
[root@study ~]# systemctl [command] [unit]
command 主要有:
:立刻啟動後面接的 unit
:立刻關閉後面接的 unit
:立刻關閉後啟動後面接的 unit,亦即執行 stop 再 start 的意思
:不關閉後面接的 unit 的情況下,重新載入設定檔,讓設定生效
:設定下次開機時,後面接的 unit 會被啟動
:設定下次開機時,後面接的 unit 不會被啟動
:目前後面接的這個 unit 的狀態,會列出有沒有正在執行、開機預設執行否、登錄等資訊等!
is-active :目前有沒有正在運作中
is-enabled:開機時有沒有預設要啟用這個 unit
範例一:看看目前 atd 這個服務的狀態為何?
[root@study ~]# systemctl status atd.service
atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd. enabled)
Active: active (running) since Mon
19:17:09 CST; 5h 42min ago
Main PID: 1350 (atd)
CGroup: /system.slice/atd.service
└─1350 /usr/sbin/atd -f
Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools.
# 重點在第二、三行喔~
# Loaded:這行在說明,開機的時候這個 unit 會不會啟動,enabled 為開機啟動,disabled 開機不會啟動
# Active:現在這個 unit 的狀態是正在執行 (running) 或沒有執行 (dead)
# 後面幾行則是說明這個 unit 程序的 PID 狀態以及最後一行顯示這個服務的登錄檔資訊!
# 登錄檔資訊格式為:『時間』 『訊息發送主機』 『哪一個服務的訊息』 『實際訊息內容』
# 所以上面的顯示訊息是:這個 atd 預設開機就啟動,而且現在正在運作的意思!
範例二:正常關閉這個 atd 服務
[root@study ~]# systemctl stop atd.service
[root@study ~]# systemctl status atd.service
atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd. enabled)
Active: inactive (dead) since Tue
01:04:55 CST; 4s ago
Process: 1350 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS)
Main PID: 1350 (code=exited, status=0/SUCCESS)
Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools.
Aug 11 01:04:55 study.centos.vbird systemd[1]: Stopping Job spooling tools...
Aug 11 01:04:55 study.centos.vbird systemd[1]: Stopped Job spooling tools.
# 目前這個 unit 下次開機還是會啟動,但是現在是沒在運作的狀態中!同時,
# 最後兩行為新增加的登錄訊息,告訴我們目前的系統狀態喔!
上面的範例中,我們已經關掉了 atd 囉!這樣作才是對的!不應該使用 kill 的方式來關掉一個正常的服務喔!否則 systemctl 會無法繼續監控該服務的!
那就比較麻煩。而使用 systemtctl status atd 的輸出結果中,第 2, 3 兩行很重要~因為那個是告知我們該 unit 下次開機會不會預設啟動,以及目前啟動的狀態!
相當重要!最底下是這個 unit 的登錄檔~如果你的這個 unit 曾經出錯過,觀察這個地方也是相當重要的!
那麼現在問個問題,你的 atd 現在是關閉的,未來重新開機後,這個服務會不會再次的啟動呢?答案是?當然會!
因為上面出現的第二行中,它是 enabled 的啊!這樣理解所謂的『現在的狀態』跟『開機時預設的狀態』兩者的差異了嗎?
好!再回到 systemctl status atd.service 的第三行,不是有個 Active 的 daemon 現在狀態嗎?除了 running 跟 dead 之外,
有沒有其他的狀態呢?有的~基本上有幾個常見的狀態:
active (running):正有一隻或多隻程序正在系統中執行的意思,舉例來說,正在執行中的 vsftpd 就是這種模式。
active (exited):僅執行一次就正常結束的服務,目前並沒有任何程序在系統中執行。
舉例來說,開機或者是掛載時才會進行一次的 quotaon 功能,就是這種模式!
quotaon 不須一直執行~只須執行一次之後,就交給檔案系統去自行處理囉!通常用 bash shell 寫的小型服務,大多是屬於這種類型 (無須常駐記憶體)。
active (waiting):正在執行當中,不過還再等待其他的事件才能繼續處理。舉例來說,列印的佇列相關服務就是這種狀態!
雖然正在啟動中,不過,也需要真的有佇列進來 (列印工作) 這樣他才會繼續喚醒印表機服務來進行下一步列印的功能。
inactive:這個服務目前沒有運作的意思。
既然 daemon 目前的狀態就有這麼多種了,那麼 daemon 的預設狀態有沒有可能除了 enable/disable 之外,還有其他的情況呢?當然有!
enabled:這個 daemon 將在開機時被執行
disabled:這個 daemon 在開機時不會被執行
static:這個 daemon 不可以自己啟動 (enable 不可),不過可能會被其他的 enabled 的服務來喚醒 (相依屬性的服務)
mask:這個 daemon 無論如何都無法被啟動!因為已經被強制註銷 (非刪除)。可透過 systemctl unmask 方式改回原本狀態
服務啟動/關閉與觀察的練習
找到系統中名為 chronyd 的服務,觀察此服務的狀態,觀察完畢後,將此服務設定為: 1)開機不會啟動 2)現在狀況是關閉的情況!
我們直接使用指令的方式來查詢與設定看看:
# 1. 觀察一下狀態,確認是否為關閉/未啟動呢?
[root@study ~]# systemctl status chronyd.service
hronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd. enabled)
Active: active (running) since Mon
19:17:07 CST; 24h ago
.....(底下省略).....
# 2. 由上面知道目前是啟動的,因此立刻將他關閉,同時開機不會啟動才行!
[root@study ~]# systemctl stop chronyd.service
[root@study ~]# systemctl disable chronyd.service
rm '/etc/systemd/system/multi-user.target.wants/chronyd.service'
# 看得很清楚~其實就是從 /etc/systemd/system 底下刪除一條連結檔案而已~
[root@study ~]# systemctl status chronyd.service
chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd. disabled)
Active: inactive (dead)
# 如此則將 chronyd 這個服務完整的關閉了!
上面是一個很簡單的練習,妳先不要知道 chronyd 是啥東西,只要知道透過這個方式,可以將一個服務關閉就是了!好!那再來一個練習,
看看有沒有問題呢?
因為我根本沒有印表機安裝在伺服器上,目前也沒有網路印表機,因此我想要將 cups 服務整個關閉,是否可以呢?
同樣的,眼見為憑,我們就動手作看看:
# 1. 先看看 cups 的服務是開還是關?
[root@study ~]# systemctl status cups.service
cups.service - CUPS Printing Service
Loaded: loaded (/usr/lib/systemd/system/cups. enabled)
Active: inactive (dead) since Tue
19:19:20 CST; 3h 29min ago
# 有趣得很!竟然是 enable 但是卻是 inactive 耶!相當特別!
# 2. 那就直接關閉,同時確認沒有啟動喔!
[root@study ~]# systemctl stop
cups.service
[root@study ~]# systemctl disable cups.service
rm '/etc/systemd/system/multi-user.target.wants/cups.path'
rm '/etc/systemd/system/sockets.target.wants/cups.socket'
rm '/etc/systemd/system/printer.target.wants/cups.service'
# 也是非常特別!竟然一口氣取消掉三個連結檔!也就是說,這三個檔案可能是有相依性的問題喔!
[root@study ~]# netstat -tlunp | grep cups
# 現在應該不會出現任何資料!因為根本沒有 cups 的任務在執行當中~所以不會有 port 產生
# 3. 嘗試啟動 cups.socket 監聽用戶端的需求喔!
[root@study ~]# systemctl start cups.socket
[root@study ~]# systemctl status cups.service cups.socket cups.path
cups.service - CUPS Printing Service
Loaded: loaded (/usr/lib/systemd/system/cups. disabled)
Active: inactive (dead) since Tue
22:57:50 CST; 3min 41s ago
cups.socket - CUPS Printing Service Sockets
Loaded: loaded (/usr/lib/systemd/system/cups. disabled)
Active: active (listening) since Tue
22:56:14 CST; 5min ago
cups.path - CUPS Printer Service Spool
Loaded: loaded (/usr/lib/systemd/system/cups. disabled)
Active: inactive (dead)
# 確定僅有 cups.socket 在啟動,其他的並沒有啟動的狀態!
# 4. 嘗試使用 lp 這個指令來列印看看?
[root@study ~]# echo "testing" | lp
lp: Error - no default destination available. # 實際上就是沒有印表機!所以有錯誤也沒關係!
[root@study ~]# systemctl status cups.service
cups.service - CUPS Printing Service
Loaded: loaded (/usr/lib/systemd/system/cups. disabled)
Active: active (running) since Tue
23:03:18 CST; 34s ago
[root@study ~]# netstat -tlunp | grep cups
0 127.0.0.1:631
25881/cupsd
25881/cupsd
# 見鬼!竟然 cups 自動被啟動了!明明我們都沒有驅動他啊!怎麼回事啊?
上面這個範例的練習在讓您了解一下,很多服務彼此之間是有相依性的!cups 是一種列印服務,這個列印服務會啟用 port 631 來提供網路印表機的列印功能。
但是其實我們無須一直啟動 631 埠口吧?因此,多了一個名為 cups.socket 的服務,這個服務可以在『用戶有需要列印時,才會主動喚醒 cups.service 』的意思!
因此,如果你僅是 disable/stop cups.service 而忘記了其他兩個服務的話,那麼當有用戶向其他兩個 cups.path, cups.socket 提出要求時,
cups.service 就會被喚醒!所以,你關掉也沒用!
強迫服務註銷 (mask) 的練習
比較正規的作法是,要關閉 cups.service 時,連同其他兩個會喚醒 service 的 cups.socket 與 cups.path 通通關閉,那就沒事了!
比較不正規的作法是,那就強迫 cups.service 註銷吧!透過 mask 的方式來將這個服務註銷看看!
# 1. 保持剛剛的狀態,關閉 cups.service,啟動 cups.socket,然後註銷 cups.servcie
[root@study ~]# systemctl stop cups.service
[root@study ~]# systemctl mask cups.service
ln -s '/dev/null' '/etc/systemd/system/cups.service'
# 喔耶~其實這個 mask 註銷的動作,只是讓啟動的腳本變成空的裝置而已!
[root@study ~]# systemctl status cups.service
cups.service
Loaded: masked (/dev/null)
Active: inactive (dead) since Tue
23:14:16 CST; 52s ago
[root@study ~]# systemctl start cups.service
Failed to issue method call: Unit cups.service is masked.
# 再也無法喚醒!
上面的範例你可以仔細推敲一下~原來整個啟動的腳本設定檔被連結到 /dev/null 這個空裝置~因此,無論如何你是再也無法啟動這個 cups.service 了!
透過這個 mask 功能,你就可以不必管其他相依服務可能會啟動到這個想要關閉的服務了!雖然是非正規,不過很有效! ^_^
那如何取消註銷呢?當然就是 unmask 即可啊!
[root@study ~]# systemctl unmask cups.service
rm '/etc/systemd/system/cups.service'
[root@study ~]# systemctl status cups.service
cups.service - CUPS Printing Service
Loaded: loaded (/usr/lib/systemd/system/cups. disabled)
Active: inactive (dead) since Tue
23:14:16 CST; 4min 35s ago
# 好佳在有恢復正常!
17.2.2 透過 systemctl 觀察系統上所有的服務
上一小節談到的是單一服務的啟動/關閉/觀察,以及相依服務要註銷的功能。那系統上面有多少的服務存在呢?這個時候就得要透過 list-units 及 list-unit-files 來觀察了!
細部的用法如下:
[root@study ~]# systemctl [command] [--type=TYPE] [--all]
list-units
:依據 unit 列出目前有啟動的 unit。若加上 --all 才會列出沒啟動的。
list-unit-files :依據 /usr/lib/systemd/system/ 內的檔案,將所有檔案列表說明。
--type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等
範例一:列出系統上面有啟動的 unit
[root@study ~]# systemctl
ACTIVE SUB
DESCRIPTION
proc-sys-fs-binfmt_mis... loaded active waiting
Arbitrary Executable File Formats File System
sys-devices-pc...:0:1:... loaded active plugged
QEMU_HARDDISK
sys-devices-pc...0:1-0... loaded active plugged
QEMU_HARDDISK
sys-devices-pc...0:0-1... loaded active plugged
QEMU_DVD-ROM
.....(中間省略).....
vsftpd.service
loaded active running
Vsftpd ftp daemon
.....(中間省略).....
cups.socket
loaded failed failed
CUPS Printing Service Sockets
.....(中間省略).....
= Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
= The low-level unit activation state, values depend on unit type.
141 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
# 列出的項目中,主要的意義是:
:項目的名稱,包括各個 unit 的類別 (看副檔名)
:開機時是否會被載入,預設 systemctl 顯示的是有載入的項目而已喔!
# ACTIVE :目前的狀態,須與後續的 SUB 搭配!就是我們用 systemctl status 觀察時,active 的項目!
# DESCRIPTION :詳細描述囉
# cups 比較有趣,因為剛剛被我們玩過,所以 ACTIVE 竟然是 failed 的喔!被玩死了! ^_^
# 另外,systemctl 都不加參數,其實預設就是 list-units 的意思!
範例二:列出所有已經安裝的 unit 有哪些?
[root@study ~]# systemctl list-unit-files
proc-sys-fs-binfmt_misc.automount
dev-hugepages.mount
dev-mqueue.mount
proc-fs-nfsd.mount
.....(中間省略).....
systemd-tmpfiles-clean.timer
336 unit files listed.
使用 systemctl list-unit-files 會將系統上所有的服務通通列出來~而不像 list-units 僅以 unit 分類作大致的說明。
至於 STATE 狀態就是前兩個小節談到的開機是否會載入的那個狀態項目囉!主要有 enabled / disabled / mask / static 等等。
假設我不想要知道這麼多的 unit 項目,我只想要知道 service 這種類別的 daemon 而已,而且不論是否已經啟動,通通要列出來!
那該如何是好?
[root@study ~]# systemctl list-units --type=service --all
# 只剩下 *.service 的項目才會出現喔!
範例一:查詢系統上是否有以 cpu 為名的服務?
[root@study ~]# systemctl list-units --type=service --all | grep cpu
cpupower.service
loaded inactive dead
Configure CPU power related settings
# 確實有喔!可以改變 CPU 電源管理機制的服務哩!
17.2.3 透過 systemctl 管理不同的操作環境 (target unit)
透過上個小節我們知道系統上所有的 systemd 的 unit 觀察的方式,那麼可否列出跟操作界面比較有關的 target 項目呢?
很簡單啊!就這樣搞一下:
[root@study ~]# systemctl list-units --type=target --all
DESCRIPTION
basic.target
loaded active
active Basic System
cryptsetup.target
loaded active
active Encrypted Volumes
emergency.target
loaded inactive dead
Emergency Mode
final.target
loaded inactive dead
Final Step
getty.target
loaded active
active Login Prompts
graphical.target
loaded active
active Graphical Interface
local-fs-pre.target
loaded active
active Local File Systems (Pre)
local-fs.target
loaded active
active Local File Systems
multi-user.target
loaded active
active Multi-User System
network-online.target
loaded inactive dead
Network is Online
network.target
loaded active
active Network
nss-user-lookup.target loaded inactive dead
User and Group Name Lookups
paths.target
loaded active
active Paths
remote-fs-pre.target
loaded active
active Remote File Systems (Pre)
remote-fs.target
loaded active
active Remote File Systems
rescue.target
loaded inactive dead
Rescue Mode
shutdown.target
loaded inactive dead
slices.target
loaded active
active Slices
sockets.target
loaded active
active Sockets
sound.target
loaded active
active Sound Card
swap.target
loaded active
active Swap
sysinit.target
loaded active
active System Initialization
syslog.target
not-found inactive dead
syslog.target
time-sync.target
loaded inactive dead
System Time Synchronized
timers.target
loaded active
active Timers
umount.target
loaded inactive dead
Unmount All Filesystems
= Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
= The low-level unit activation state, values depend on unit type.
26 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
喔!在我們的 CentOS 7.1 的預設情況下,就有 26 個 target unit 耶!而跟操作界面相關性比較高的 target 主要有底下幾個:
graphical.target:就是文字加上圖形界面,這個項目已經包含了底下的 multi-user.target 項目!
multi-user.target:純文字模式!
rescue.target:在無法使用 root 登入的情況下,systemd 在開機時會多加一個額外的暫時系統,與你原本的系統無關。這時你可以取得 root 的權限來維護你的系統。
但是這是額外系統,因此可能需要動到 chroot 的方式來取得你原有的系統喔!再後續的章節我們再來談!
emergency.target:緊急處理系統的錯誤,還是需要使用 root 登入的情況,在無法使用 rescue.target 時,可以嘗試使用這種模式!
shutdown.target:就是關機的流程。
getty.target:可以設定你需要幾個 tty 之類的,如果想要降低 tty 的項目,可以修改這個東西的設定檔!
正常的模式是 multi-user.target 以及 graphical.target 兩個,救援方面的模式主要是 rescue.target 以及更嚴重的 emergency.target。
如果要修改可提供登入的 tty 數量,則修改 getty.target 項目。基本上,我們最常使用的當然就是 multi-user 以及 graphical 囉!
那麼我如何知道目前的模式是哪一種?又得要如何修改呢?底下來玩一玩吧!
[root@study ~]# systemctl [command] [unit.target]
選項與參數:
get-default :取得目前的 target
set-default :設定後面接的 target 成為預設的操作模式
:切換到後面接的模式
範例一:我們的測試機器預設是圖形界面,先觀察是否真為圖形模式,再將預設模式轉為文字界面
[root@study ~]# systemctl get-default
graphical.target
# 果然是圖形界面喔!
[root@study ~]# systemctl set-default multi-user.target
[root@study ~]# systemctl get-default
multi-user.target
範例二:在不重新開機的情況下,將目前的操作環境改為純文字模式,關掉圖形界面
[root@study ~]# systemctl isolate multi-user.target
範例三:若需要重新取得圖形界面呢?
[root@study ~]# systemctl isolate graphical.target
要注意,改變 graphical.target 以及 multi-user.target 是透過 isolate 來處理的!鳥哥剛剛接觸到 systemd 的時候,在 multi-user.target 環境下轉成 graphical.target 時,
可以透過 systemctl start graphical.target 喔!然後鳥哥就以為關閉圖形界面即可回到 multi-user.target 的!但使用 systemctl stop graphical.target
卻完全不理鳥哥~這才發現錯了...在 service 部份用 start/stop/restart 才對,在 target 項目則請使用 isolate (隔離不同的操作模式) 才對!
在正常的切換情況下,使用上述 isolate 的方式即可。不過為了方便起見, systemd 也提供了數個簡單的指令給我們切換操作模式之用喔!
大致上如下所示:
[root@study ~]# systemctl poweroff
[root@study ~]# systemctl reboot
[root@study ~]# systemctl suspend
進入暫停模式
[root@study ~]# systemctl hibernate 進入休眠模式
[root@study ~]# systemctl rescue
強制進入救援模式
[root@study ~]# systemctl emergency 強制進入緊急救援模式
關機、重新開機、救援與緊急模式這沒啥問題,那麼什麼是暫停與休眠模式呢?
suspend:暫停模式會將系統的狀態資料保存到記憶體中,然後關閉掉大部分的系統硬體,當然,並沒有實際關機喔!
當使用者按下喚醒機器的按鈕,系統資料會重記憶體中回復,然後重新驅動被大部分關閉的硬體,就開始正常運作!喚醒的速度較快。
hibernate:休眠模式則是將系統狀態保存到硬碟當中,保存完畢後,將電腦關機。當使用者嘗試喚醒系統時,系統會開始正常運作,
然後將保存在硬碟中的系統狀態恢復回來。因為資料是由硬碟讀出,因此喚醒的效能與你的硬碟速度有關。
17.2.4 透過 systemctl 分析各服務之間的相依性
我們在本章一開始談到 systemd 的時候就有談到相依性的問題克服,那麼,如何追蹤某一個 unit 的相依性呢?
舉例來說好了,我們怎麼知道 graphical.target 會用到 multi-user.target 呢?那 graphical.target 底下還有哪些東西呢?
底下我們就來談一談:
[root@study ~]# systemctl list-dependencies [unit] [--reverse]
選項與參數:
--reverse :反向追蹤誰使用這個 unit 的意思!
範例一:列出目前的 target 環境下,用到什麼特別的 unit
[root@study ~]# systemctl get-default
multi-user.target
[root@study ~]# systemctl list-dependencies
default.target
├─abrt-ccpp.service
├─abrt-oops.service
├─vsftpd.service
├─basic.target
│ ├─alsa-restore.service
│ ├─alsa-state.service
.....(中間省略).....
│ ├─sockets.target
│ │ ├─avahi-daemon.socket
│ │ ├─dbus.socket
.....(中間省略).....
│ ├─sysinit.target
│ │ ├─dev-hugepages.mount
│ │ ├─dev-mqueue.mount
.....(中間省略).....
│ └─timers.target
└─systemd-tmpfiles-clean.timer
├─getty.target
│ └─getty@tty1.service
└─remote-fs.target
因為我們前一小節的練習將預設的操作模式變成 multi-user.target 了,因此這邊使用 list-dependencies 時,所列出的 default.target 其實是 multi-user.target
的內容啦!根據線條連線的流程,我們也能夠知道, multi-user.target 其實還會用到 basic.target + getty.target + remote-fs.target 三大項目,
而 basic.target 又用到了 sockets.target + sysinit.target + timers.target... 等一堆~所以囉,從這邊就能夠清楚的查詢到每種 target 模式底下還有的相依模式。
那麼如果要查出誰會用到 multi-user.target 呢?就這麼作!
[root@study ~]# systemctl list-dependencies --reverse
default.target
└─graphical.target
reverse 本來就是反向的意思,所以加上這個選項,代表『誰還會用到我的服務』的意思~所以看得出來, multi-user.target 主要是被 graphical.target 所使用喔!
好~那再來,graphical.target 又使用了多少的服務呢?可以這樣看:
[root@study ~]# systemctl list-dependencies graphical.target
graphical.target
├─accounts-daemon.service
├─gdm.service
├─network.service
├─rtkit-daemon.service
├─systemd-update-utmp-runlevel.service
└─multi-user.target
├─abrt-ccpp.service
├─abrt-oops.service
.....(底下省略).....
所以可以看得出來,graphical.target 就是在 multi-user.target 底下再加上 accounts-daemon, gdm, network, rtkit-deamon, systemd-update-utmp-runlevel 等服務而已!
這樣會看了嗎?了解 daemon 之間的相關性也是很重要的喔!出問題時,可以找到正確的服務相依流程!
17.2.5 與 systemd 的 daemon 運作過程相關的目錄簡介
我們在前幾小節曾經談過比較重要的 systemd 啟動腳本設定檔在 /usr/lib/systemd/system/, /etc/systemd/system/ 目錄下,那還有哪些目錄跟系統的 daemon 運作有關呢?
基本上是這樣的:
/usr/lib/systemd/system/:
使用 CentOS 官方提供的軟體安裝後,預設的啟動腳本設定檔都放在這裡,這裡的資料盡量不要修改~
要修改時,請到 /etc/systemd/system 底下修改較佳!
/run/systemd/system/:
系統執行過程中所產生的服務腳本,這些腳本的優先序要比 /usr/lib/systemd/system/ 高!
/etc/systemd/system/:
管理員依據主機系統的需求所建立的執行腳本,其實這個目錄有點像以前 /etc/rc.d/rc5.d/Sxx
之類的功能!執行優先序又比 /run/systemd/system/ 高喔!
/etc/sysconfig/*:
幾乎所有的服務都會將初始化的一些選項設定寫入到這個目錄下,舉例來說,mandb 所要更新的 man page 索引中,需要加入的參數就寫入到此目錄下的 man-db
當中喔!而網路的設定則寫在 /etc/sysconfig/network-scripts/ 這個目錄內。所以,這個目錄內的檔案也是挺重要的;
/var/lib/:
一些會產生資料的服務都會將他的資料寫入到 /var/lib/ 目錄中。舉例來說,資料庫管理系統 Mariadb 的資料庫預設就是寫入 /var/lib/mysql/ 這個目錄下啦!
放置了好多 daemon 的暫存檔,包括 lock file 以及 PID file 等等。
我們知道 systemd 裡頭有很多的本機會用到的 socket 服務,裡頭可能會產生很多的 socket file ~那你怎麼知道這些 socket file 放置在哪裡呢?
很簡單!還是透過 systemctl 來管理!
[root@study ~]# systemctl list-sockets
/dev/initctl
systemd-initctl.socket
systemd-initctl.service
systemd-journald.socket
systemd-journald.service
/run/dmeventd-client
dm-event.socket
dm-event.service
/run/dmeventd-server
dm-event.socket
dm-event.service
/run/lvm/lvmetad.socket
lvm2-lvmetad.socket
lvm2-lvmetad.service
/run/systemd/journal/socket
systemd-journald.socket
systemd-journald.service
/run/systemd/journal/stdout
systemd-journald.socket
systemd-journald.service
/run/systemd/shutdownd
systemd-shutdownd.socket
systemd-shutdownd.service
/run/udev/control
systemd-udevd-control.socket systemd-udevd.service
/var/run/avahi-daemon/socket
avahi-daemon.socket
avahi-daemon.service
/var/run/cups/cups.sock
cups.socket
cups.service
/var/run/dbus/system_bus_socket dbus.socket
dbus.service
/var/run/rpcbind.sock
rpcbind.socket
rpcbind.service
@ISCSIADM_ABSTRACT_NAMESPACE
iscsid.socket
iscsid.service
@ISCSID_UIP_ABSTRACT_NAMESPACE
iscsiuio.socket
iscsiuio.service
kobject-uevent 1
systemd-udevd-kernel.socket
systemd-udevd.service
16 sockets listed.
Pass --all to see loaded but inactive sockets, too.
這樣很清楚的就能夠知道正在監聽本機服務需求的 socket file 所在的檔名位置囉!
網路服務與埠口對應簡介
從與前一小節對服務的說明後,你應該要知道的是,
系統所有的功能都是某些程序所提供的,而程序則是透過觸發程式而產生的。同樣的,系統提供的網路服務當然也是這樣的!
只是由於網路牽涉到 TCP/IP 的概念,所以顯的比較複雜一些就是了。
玩過網際網路 (Internet) 的朋友應該知道 IP 這玩意兒,大家都說 IP 就是代表你的主機在網際網路上面的『門牌號碼』。
但是你的主機總是可以提供非常多的網路服務而不止一項功能而已,但我們僅有一個 IP 呢!當用戶端連線過來我們的主機時,
我們主機是如何分辨不同的服務要求呢?那就是透過埠號 (port number) 啦!埠號簡單的想像,他就是你家門牌上面的第幾層樓!
這個 IP 與 port 就是網際網路連線的最重要機制之一囉。我們拿底下的網址來說明:
有沒有發現,兩個網址都是指向 ftp.ksu.edu.tw 這個崑山科大的 FTP 網站,但是瀏覽器上面顯示的結果卻是不一樣的?
是啊!這是因為我們指向不同的服務嘛!一個是 http 這個 WWW 的服務,一個則是 ftp
這個檔案傳輸服務,當然顯示的結果就不同了。
圖17.2.1、port 與 daemon 的對應
事實上,為了統一整個網際網路的埠號對應服務的功能,好讓所有的主機都能夠使用相同的機制來提供服務與要求服務,
所以就有了『通訊協定』這玩意兒。也就是說,有些約定俗成的服務都放置在同一個埠號上面啦!舉例來說,
網址列上面的 http 會讓瀏覽器向 WWW 伺服器的 80 埠號進行連線的要求!而 WWW 伺服器也會將 httpd 這個軟體啟動在 port 80,
這樣兩者才能夠達成連線的!
嗯!那麼想一想,系統上面有沒有什麼設定可以讓服務與埠號對應在一起呢?那就是 /etc/services 啦!
[root@study ~]# cat /etc/services
....(前面省略)....
# The Secure Shell (SSH) Protocol
# The Secure Shell (SSH) Protocol
....(中間省略)....
www www-http
# WorldWideWeb HTTP
www www-http
# HyperText Transfer Protocol
....(底下省略)....
# 這個檔案的內容是以底下的方式來編排的:
# &daemon name&
&port/封包協定&
&該服務的說明&
像上面說的是,第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的埠號與網路資料封包協定,
封包協定主要為可靠連線的 TCP 封包以及較快速但為非連線導向的 UDP 封包。
舉個例子說,那個遠端連線機制使用的是 ssh 這個服務,而這個服務的使用的埠號為 22 !就是這樣啊!
請特別注意!雖然有的時候你可以藉由修改 /etc/services 來更改一個服務的埠號,不過並不建議如此做,
因為很有可能會造成一些協定的錯誤情況!這裡特此說明一番呦!(除非你要架設一個地下網站,否則的話,使用
/etc/services 原先的設定就好啦!)
17.2.6 關閉網路服務
當你第一次使用 systemctl 去觀察本機伺服器啟動的服務時,不知道有沒有嚇一跳呢?怎麼隨隨便便 CentOS 7.x 就給我啟動了幾乎 100 多個以上的 daemon?
會不會有事啊?沒關係啦!因為 systemd 將許多原本不被列為 daemon 的程序都納入到 systemd 自己的管轄監測範圍內,因此就多了很多 daemon 存在!
那些大部分都屬於 Linux 系統基礎運作所需要的環境,沒有什麼特別需求的話,最好都不要更動啦!除非你自己知道自己需要什麼。
除了本機服務之外,其實你一定要觀察的,反而是網路服務喔!雖然網路服務預設有 SELinux 管理,不過,在鳥哥的立場上,
我還是建議非必要的網路服務就關閉他!那麼什麼是網路服務呢?基本上,會產生一個網路監聽埠口 (port) 的程序,你就可以稱他是個網路服務了!
那麼如何觀察網路埠口?就這樣追蹤啊!
[root@study ~]# netstat -tlunp
Proto Recv-Q Send-Q Local Address
Foreign Address
PID/Program name
0 0.0.0.0:22
0 127.0.0.1:25
2387/master
29113/vsftpd
2387/master
0 0.0.0.0:5353
750/avahi-daemon: r
0 0.0.0.0:36540
750/avahi-daemon: r
如上表所示,我們的系統上至少開了 22, 25, 555,
這幾個埠口~而其中
是由 avahi-daemon 這個東西所啟動的!
接下來我們使用 systemctl 去觀察一下,到底有沒有 avahi-daemon 為開頭的服務呢?
[root@study ~]# systemctl list-units --all | grep avahi-daemon
avahi-daemon.service
loaded active
Avahi mDNS/DNS-SD Stack
avahi-daemon.socket
loaded active
Avahi mDNS/DNS-SD Stack Activation Socket
透過追查,知道這個 avahi-daemon 的目的是在區域網路進行類似網芳的搜尋,因此這個服務可以協助你在區網內隨時了解隨插即用的裝置!
包括筆記型電腦等,只要連上你的區網,你就能夠知道誰進來了。問題是,你可能不要這個協定啊!所以,那就關閉他吧!
[root@study ~]# systemctl stop avahi-daemon.service
[root@study ~]# systemctl stop avahi-daemon.socket
[root@study ~]# systemctl disable avahi-daemon.service avahi-daemon.socket
[root@study ~]# netstat -tlunp
Proto Recv-Q Send-Q Local Address
Foreign Address
PID/Program name
0 0.0.0.0:22
0 127.0.0.1:25
2387/master
29113/vsftpd
2387/master
一般來說,你的本機伺服器至少需要 25 號埠口,而 22 號埠口則最好加上防火牆來管理遠端連線登入比較妥當~因此,上面的埠口中,
除了 555 是我們上一章因為測試而產生的之外,這樣的系統能夠被爬牆的機會已經少很多了! ^_^!OK!現在如果你的系統裡面有一堆網路埠口在監聽,
而你根本不知道那是幹麻用的,鳥哥建議你,現在就透過上面的方式,關閉他吧!
17.3 systemctl 針對 service 類型的設定檔
以前,我們如果想要建立系統服務,就得要到 /etc/init.d/ 底下去建立相對應的 bash shell script 來處理。那麼現在 systemd 的環境底下,
如果我們想要設定相關的服務啟動環境,那應該如何處理呢?這就是本小節的任務囉!
17.3.1 systemctl 設定檔相關目錄簡介
現在我們知道服務的管理是透過 systemd,而 systemd 的設定檔大部分放置於 /usr/lib/systemd/system/ 目錄內。但是 Red Hat 官方文件指出,
該目錄的檔案主要是原本軟體所提供的設定,建議不要修改!而要修改的位置應該放置於 /etc/systemd/system/ 目錄內。舉例來說,如果你想要額外修改 vsftpd.service 的話,
他們建議要放置到哪些地方呢?
/usr/lib/systemd/system/vsftpd.service:官方釋出的預設設定檔;
/etc/systemd/system/vsftpd.service.d/custom.conf:在 /etc/systemd/system
底下建立與設定檔相同檔名的目錄,但是要加上 .d 的副檔名。然後在該目錄下建立設定檔即可。另外,設定檔最好附檔名取名為 .conf 較佳!
在這個目錄下的檔案會『累加其他設定』進入 /usr/lib/systemd/system/vsftpd.service 內喔!
/etc/systemd/system/vsftpd.service.wants/*:此目錄內的檔案為連結檔,設定相依服務的連結。意思是啟動了
vsftpd.service 之後,最好再加上這目錄底下建議的服務。
/etc/systemd/system/vsftpd.service.requires/*:此目錄內的檔案為連結檔,設定相依服務的連結。意思是在啟動
vsftpd.service 之前,需要事先啟動哪些服務的意思。
基本上,在設定檔裡面你都可以自由設定相依服務的檢查,並且設定加入到哪些 target 裡頭去。但是如果是已經存在的設定檔,或者是官方提供的設定檔,
Red Hat 是建議你不要修改原設定,而是到上面提到的幾個目錄去進行額外的客製化設定比較好!當然,這見仁見智~如果你硬要修改原始的 /usr/lib/systemd/system
底下的設定檔,那也是 OK 沒問題的!並且也能夠減少許多設定檔的增加~鳥哥自己認為,這樣也不錯!反正,就完全是個人喜好囉~
17.3.2 systemctl 設定檔的設定項目簡介
了解了設定檔的相關目錄與檔案之後,再來,當然得要了解一下設定檔本身的內容了!讓我們先來瞧一瞧 sshd.service 的內容好了!
原本想拿 vsftpd.service 來講解,不過該檔案的內容比較陽春,還是看一下設定項目多一些的 sshd.service 好了!
[root@study ~]# cat /usr/lib/systemd/system/sshd.service
# 這個項目與此 unit 的解釋、執行服務相依性有關
Description=OpenSSH server daemon
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
# 這個項目與實際執行的指令參數有關
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
# 這個項目說明此 unit 要掛載哪個 target 底下
WantedBy=multi-user.target
分析上面的設定檔,我們大概能夠將整個設定分為三個部份,就是:
[Unit]: unit 本身的說明,以及與其他相依 daemon 的設定,包括在什麼服務之後才啟動此 unit 之類的設定值;
[Service], [Socket], [Timer], [Mount], [Path]..:不同的 unit type 就得要使用相對應的設定項目。我們拿的是 sshd.service 來當範本,所以這邊就使用 [Service] 來設定。
這個項目內主要在規範服務啟動的腳本、環境設定檔檔名、重新啟動的方式等等。
[Install]:這個項目就是將此 unit 安裝到哪個 target 裡面去的意思!
至於設定檔內有些設定規則還是得要說明一下:
設定項目通常是可以重複的,例如我可以重複設定兩個 After 在設定檔中,不過,後面的設定會取代前面的喔!因此,如果你想要將設定值歸零,
可以使用類似『 After= 』的設定,亦即該項目的等號後面什麼都沒有,就將該設定歸零了 (reset)。
如果設定參數需要有『是/否』的項目 (布林值, boolean),你可以使用 1, yes, true, on 代表啟動,用 0, no, false, off 代表關閉!隨你喜好選擇囉!
空白行、開頭為 # 或 ; 的那一行,都代表註解!
每個部份裡面還有很多的設定細項,我們使用一個簡單的表格來說明每個項目好了!
Description
就是當我們使用 systemctl list-units 時,會輸出給管理員看的簡易說明!當然,使用 systemctl status 輸出的此服務的說明,也是這個項目!
Documentation
這個項目在提供管理員能夠進行進一步的文件查詢的功能!提供的文件可以是如下的資料:
Documentation=http://www....
Documentation=man:sshd(8)
Documentation=file:/etc/ssh/sshd_config
說明此 unit 是在哪個 daemon 啟動之後才啟動的意思!基本上僅是說明服務啟動的順序而已,並沒有強制要求裡頭的服務一定要啟動後此 unit 才能啟動。
以 sshd.service 的內容為例,該檔案提到 After 後面有 network.target 以及 sshd-keygen.service,但是若這兩個 unit 沒有啟動而強制啟動 sshd.service 的話,
那麼 sshd.service 應該還是能夠啟動的!這與 Requires 的設定是有差異的喔!
與 After 的意義相反,是在什麼服務啟動前最好啟動這個服務的意思。不過這僅是規範服務啟動的順序,並非強制要求的意思。
明確的定義此 unit 需要在哪個 daemon 啟動後才能夠啟動!就是設定相依服務啦!如果在此項設定的前導服務沒有啟動,那麼此 unit 就不會被啟動!
與 Requires 剛好相反,規範的是這個 unit 之後最好還要啟動什麼服務比較好的意思!不過,並沒有明確的規範就是了!主要的目的是希望建立讓使用者比較好操作的環境。
因此,這個 Wants 後面接的服務如果沒有啟動,其實不會影響到這個 unit 本身!
代表衝突的服務!亦即這個項目後面接的服務如果有啟動,那麼我們這個 unit 本身就不能啟動!我們 unit 有啟動,則此項目後的服務就不能啟動!
反正就是衝突性的檢查啦!
接下來了解一下在 [Service] 當中有哪些項目可以使用!
說明這個 daemon 啟動的方式,會影響到 ExecStart 喔!一般來說,有底下幾種類型
simple:預設值,這個 daemon 主要由 ExecStart 接的指令串來啟動,啟動後常駐於記憶體中。
forking:由 ExecStart 啟動的程序透過 spawns 延伸出其他子程序來作為此 daemon 的主要服務。原生的父程序在啟動結束後就會終止運作。
傳統的 unit 服務大多屬於這種項目,例如 httpd 這個 WWW 服務,當 httpd 的程序因為運作過久因此即將終結了,則 systemd 會再重新生出另一個子程序持續運作後,
再將父程序刪除。據說這樣的效能比較好!!
oneshot:與 simple 類似,不過這個程序在工作完畢後就結束了,不會常駐在記憶體中。
dbus:與 simple 類似,但這個 daemon 必須要在取得一個 D-Bus 的名稱後,才會繼續運作!因此設定這個項目時,通常也要設定 BusName= 才行!
idle:與 simple 類似,意思是,要執行這個 daemon 必須要所有的工作都順利執行完畢後才會執行。這類的 daemon 通常是開機到最後才執行即可的服務!
比較重要的項目大概是 simple, forking 與 oneshot 了!畢竟很多服務需要子程序 (forking),而有更多的動作只需要在開機的時候執行一次(oneshot),例如檔案系統的檢查與掛載啊等等的。
EnvironmentFile
可以指定啟動腳本的環境設定檔!例如 sshd.service 的設定檔寫入到 /etc/sysconfig/sshd 當中!你也可以使用 Environment= 後面接多個不同的 Shell 變數來給予設定!
就是實際執行此 daemon 的指令或腳本程式。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之後) 兩個設定項目來在實際啟動服務前,進行額外的指令行為。
但是你得要特別注意的是,指令串僅接受『指令
參數...』的格式,不能接受 &, &, &&, |, & 等特殊字符,很多的 bash 語法也不支援喔!
所以,要使用這些特殊的字符時,最好直接寫入到指令腳本裡面去!不過,上述的語法也不是完全不能用,亦即,若要支援比較完整的 bash 語法,那你得要使用 Type=oneshot 才行喔!
其他的 Type 才不能支援這些字符。
與 systemctl stop 的執行有關,關閉此服務時所進行的指令。
ExecReload
與 systemctl reload 有關的指令行為
當設定 Restart=1 時,則當此 daemon 服務終止後,會再次的啟動此服務。舉例來說,如果你在 tty2 使用文字界面登入,操作完畢後登出,基本上,這個時候 tty2 就已經結束服務了。
但是你會看到螢幕又立刻產生一個新的 tty2 的登入畫面等待你的登入!那就是 Restart 的功能!除非使用 systemctl 強制將此服務關閉,否則這個服務會源源不絕的一直重複產生!
RemainAfterExit
當設定為 RemainAfterExit=1 時,則當這個 daemon 所屬的所有程序都終止之後,此服務會再嘗試啟動。這對於 Type=oneshot 的服務很有幫助!
TimeoutSec
若這個服務在啟動或者是關閉時,因為某些緣故導致無法順利『正常啟動或正常結束』的情況下,則我們要等多久才進入『強制結束』的狀態!
可以是 process, control-group, none 的其中一種,如果是 process 則 daemon 終止時,只會終止主要的程序 (ExecStart 接的後面那串指令),如果是 control-group 時,
則由此 daemon 所產生的其他 control-group 的程序,也都會被關閉。如果是 none 的話,則沒有程序會被關閉喔!
RestartSec
與 Restart 有點相關性,如果這個服務被關閉,然後需要重新啟動時,大概要 sleep 多少時間再重新啟動的意思。預設是 100ms (毫秒)。
最後,再來看看那麼 Install 內還有哪些項目可用?
這個設定後面接的大部分是 *.target unit !意思是,這個 unit 本身是附掛在哪一個 target unit 底下的!一般來說,大多的服務性質的 unit 都是附掛在 multi-user.target 底下!
當目前這個 unit 本身被 enable 時,Also 後面接的 unit 也請 enable 的意思!也就是具有相依性的服務可以寫在這裡呢!
進行一個連結的別名的意思!當 systemctl enable 相關的服務時,則此服務會進行連結檔的建立!以 multi-user.target 為例,這個傢伙是用來作為預設操作環境 default.target 的規劃,
因此當你設定用成 default.target 時,這個 /etc/systemd/system/default.target 就會連結到 /usr/lib/systemd/system/multi-user.target 囉!
大致的項目就有這些,接下來讓我們根據上面這些資料來進行一些簡易的操作吧!
17.3.3 兩個 vsftpd 運作的實例
我們在上一章將 vsftpd 的 port 改成 555 號了。不過,因為某些原因,所以你可能需要使用到兩個埠口,分別是正常的 21 以及特殊的 555 !
這兩個 port 都啟用的情況下,你可能就得要使用到兩個設定檔以及兩個啟動腳本設定了!現在假設是這樣:
預設的 port 21:使用 /etc/vsftpd/vsftpd.conf 設定檔,以及 /usr/lib/systemd/system/vsftpd.service 設定腳本;
特殊的 port 555:使用 /etc/vsftpd/vsftpd2.conf 設定檔,以及 /etc/systemd/system/vsftpd2.service 設定腳本。
我們可以這樣作:
# 1. 先建立好所需要的設定檔
[root@study ~]# cd /etc/vsftpd
[root@study vsftpd]# cp vsftpd.conf vsftpd2.conf
[root@study vsftpd]# vim vsftpd.conf
#listen_port=555
[root@study vsftpd]# diff vsftpd.conf vsftpd2.conf
& #listen_port=555
& listen_port=555
# 注意這兩個設定檔的差別喔!只有這一行不同而已!
# 2. 開始處理啟動腳本設定
[root@study vsftpd]# cd /etc/systemd/system
[root@study system]# cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service
[root@study system]# vim vsftpd2.service
Description=Vsftpd second ftp daemon
After=network.target
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf
WantedBy=multi-user.target
# 重點在改了 vsftpd2.conf 這個設定檔喔!
# 3. 重新載入 systemd 的腳本設定檔內容
[root@study system]# systemctl daemon-reload
[root@study system]# systemctl list-unit-files --all | grep vsftpd
vsftpd.service
vsftpd2.service
vsftpd@.service
vsftpd.target
[root@study system]# systemctl status vsftpd2.service
vsftpd2.service - Vsftpd second ftp daemon
Loaded: loaded (/etc/systemd/system/vsftpd2. disabled)
Active: inactive (dead)
[root@study system]# systemctl restart vsftpd.service vsftpd2.service
[root@study system]# systemctl enable
vsftpd.service vsftpd2.service
[root@study system]# systemctl status
vsftpd.service vsftpd2.service
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd. enabled)
Active: active (running) since Wed
22:00:17 CST; 35s ago
Main PID: 12670 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─12670 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
Aug 12 22:00:17 study.centos.vbird systemd[1]: Started Vsftpd ftp daemon.
vsftpd2.service - Vsftpd second ftp daemon
Loaded: loaded (/etc/systemd/system/vsftpd2. enabled)
Active: active (running) since Wed
22:00:17 CST; 35s ago
Main PID: 12672 (vsftpd)
CGroup: /system.slice/vsftpd2.service
└─12672 /usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf
[root@study system]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
PID/Program name
0 0.0.0.0:22
0 127.0.0.1:25
2387/master
12672/vsftpd
12670/vsftpd
2387/master
很簡單的將你的 systemd 所管理的 vsftpd 做了另一個服務!未來如果有相同的需求,同樣的方法作一遍即可!
17.3.4 多重的重複設定方式:以 getty 為例
我們的 CentOS 7 開機完成後,不是說有 6 個終端機可以使用嗎?就是那個 tty1~tty6 的啊!那個東西是由 agetty 這個指令達成的。
OK!那麼這個終端機的功能又是從哪個項目所提供的呢?其實,那個東東涉及很多層面,主要管理的是 getty.target 這個 target unit ,
不過,實際產生 tty1~tty6 的則是由 getty@.service 所提供的!咦!那個 @ 是啥東西?
先來查閱一下 /usr/lib/systemd/system/getty@.service 的內容好了:
[root@study ~]# cat /usr/lib/systemd/system/getty@.service
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
ConditionPathExists=/dev/tty0
ExecStart=-/sbin/agetty --noclear %I $TERM
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
WantedBy=getty.target
比較重要的當然就是 ExecStart 項目囉!那麼我們去 man agetty 時,發現到它的語法應該是『 agetty --noclear tty1 』之類的字樣,
因此,我們如果要啟動六個 tty 的時候,基本上應該要有六個啟動設定檔。亦即是可能會用到 getty1.service, getty2.service...getty6.service 才對!
哇!這樣控管很麻煩啊~所以,才會出現這個 @ 的項目啦!咦!這個

我要回帖

更多关于 佳能xa35摄像机 的文章

 

随机推荐