Linux 基础入门
Linux 操作
Linux 拓展
小结
Linux 运维工程师:服务器的规划、调试优化、日常监控、故障处理、数据备份、日志分析、服务器崩溃(瘫痪)了,要迅速恢复。
Linux 嵌入式工程师:熟练掌握各种驱动程序开发,在嵌入式系统中进行程序开发,需要学习C语言等。
Linux 下开发项目:应用最多,在 Liunx 上部署项目(一般要求会搭建、部署、管理、维护等)。
个人桌面领域的应用
此领域是传统Linux 应用最薄弱的环节,传统Linux 由于界面简单、操作复杂、应用软件少的缺点,一直被windows所压制,但近些年来随着ubuntu、fedora [fɪˈdɔ:rə] 等优秀桌面环境的兴起,同时各大硬件厂商对其支持的加大,Linux 在个人桌面领域的占有率在逐渐的提高。
服务器领域
Linux 在服务器领域的应用是最强的。
Linux 免费、稳定、高效等特点在这里得到了很好的体现,近些年来 Linux 服务器市场得到了飞速的提升,尤其在一些高端领域尤为广泛。
嵌入式领域
近些年来 Linux 在嵌入式领域的应用得到了飞速的提高。
Linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB等特点,使其近些年来在嵌入式领域的应用得到非常大的提高
主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后再物联网中应用会更加广泛。
Linux 是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多中型,大型甚至是集群项目都在使用 Linux ,很多软件公司考虑到开发成本都首选 Linux ,在中国软件公司得到广泛的使用。
Linux 学习阶段:
第 1 阶段:Linux 环境下的基本操作命令,包括文件操作命令(rm mkdir chmod, chown) 编辑工具使用(vi vim)Linux 用户管理(useradd userdel usermod)等。
第 2 阶段:Linux 的各种配置(环境变量配置,网络配置,服务配置)。
第 3 阶段:Linux 下如何搭建对应语言的开发环境(大数据,JavaEE, Python等)。
第 4 阶段:能编写shell脚本,对Linux 服务器进行维护。
第 5 阶段:能进行安全设置,防止攻击,保障服务器正常运行,能对系统调优。
第 6 阶段:深入理解Linux 系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。
Linux 学习方法和建议:
Linux 怎么读?里纳克斯、里纽克斯、里讷克斯、林尼克斯(任一都可以)
Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统;是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级的项目都会部署到 Linux/Unix 系统上。
常见的操作系统(Win7、Win10、IOS、Android、Mac)
Linux 创始人:Linus Torvalds(林纳斯·托瓦兹)
Linux 基本思想:第一,一切都是文件
;第二,每个文件都有确定的用途
。
Linux 主要发行版:Ubuntu
(乌班图)、RedHat
(红帽)、CentOS
、Debain(蝶变)、Fedora、SuSE、
OpenSUSE
Linux 吉祥物:Tux
图片来源于网络
关于吉祥物的小故事
成功了怎么说都可以,反之…
为什么要叫他Tux呢?
是不是因为他像穿了一件晚礼服(tuxedo)?
不单单只是这样哟,叫他Tux更多是来源于James Hughes:
The first person to call the penguin “Tux” was James Hughes, who said that it stood for “(T)orvalds (U)ni(X)”. However, tux is also an abbreviation of tuxedo, the outfit which often springs to mind when one sees a penguin.——From Wikipedia
(完美的双关,Tux和tuxedo。)
那又为什么会选择企鹅来当吉祥物呢?
选择企鹅来作为吉祥物是 Linus 的决定,因为他在去澳大利亚旅游的时候被澳大利亚国家动物园的企鹅咬了一口,这只企鹅在 Linus 的心里也是留下了非常深刻的印象啊,于是 Linus 在决定吉祥物的时候就想起这只小可爱(?)了。
Re: Linux Logo
Linus Torvalds ([email protected])
Sun, 12 May 1996 09:39:19 +0300 (EET DST)
.
Umm… You don’t have any gap to fill in.
“Linus likes penguins”. That’s it. There was even a headline on it in some Linux Journal some time ago (I was bitten by a Killer Penguin in Australia - I’m not kidding). Penguins are fun.
(这只苏破天际的企鹅哟,咬人之后都能被心心念念着当成吉祥物。)
于是在1996年的时候,Larry Ewing 用 Gimp 创作了这只可爱的企鹅,Tux。
Tux已经成为Linux和开源社群的象征。英国Linux用户组(British LUG)甚至在当地的动物园认养了几只企鹅。
现在Linux下也有很多以Tux为主角的游戏,例如SuperTux和SuperTuxKart等。
之前看到有人问为什么这只企鹅要抠脚(蹼)呢?
额…可能是因为吃得太饱了不抱着脚丫子就要坐不起来了吧-。-(捂脸,这是维基百科的锅,哈哈哈哈)。
Torvalds was looking for something fun and sympathetic to associate with Linux, and a slightly fat penguin sitting down after having had a great meal perfectly fit the bill——From Wikipedia
Linux vs Windows
特点 | Windows | Linux |
---|---|---|
是否免费 | 收费,且非常昂贵 | 免费或少许收费 |
软件与支持 | 数量和质量的优势,不过大部分为收费软件,由微软官方提供支持和服务。 | 开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺;有全球所有的Linux开发者和自由软件社区提供支持。 |
安全性 | 三天两头打补丁安装系统安全更新,还是会中病毒木马。 | 要说 Linux 没有安全问题,那当然是不可能的,这一点仁者见仁智者见智,相对来说肯定比Windows 平台要更加安全。 |
使用习惯 | 普通用户基本都是纯图形界面下操作使用,依靠鼠标和键盘完成一切操作,用户上手容易入门简单。 | 兼具图形界面操作和完全的命令行操作,可以只用键盘完成一切操作,新手入门较困难,需要一些学习和指导,一旦熟练之后效率极高。 |
可定制性 | 封闭的,系统可定制性很差。 | 开源,可定制性非常强。 |
应用场景 | 桌面操作系统主要是 Windows | 支撑百度,谷歌,淘宝等应用软件和服务的,是后台成千上万的Linux服务器主机。世界上大部分软件和服务都是运行在 Linux 之上的。 |
肯•汤普森(Ken Thompson)–UNIX之父
兴趣的力量
肯·汤普森出生于1943年。他小学的时候,当有一堂课讲到二进制的时候,喜欢逻辑的他立刻被吸引住,兴趣驱使他做了很多相关的二进制计算,并借助一台十进制计算器将其扩展到各种进制。
兴趣的力量真是太大了!
大二时他有幸接触到一台模拟计算机,通过自我摸索,仔细研读,学会了编程。之后,仅用了一年时间就拿到了硕士学位,稳稳的学霸一枚。
由于游戏,造就了UNIX
1966 年,肯·汤普森加入贝尔实验室,与丹尼斯·里奇(Dennis Ritchie,又一位大神,后面再讲)一起参与名为 Multics(多路信息计算系统)的项目开发。在那个时期,计算机系统还处在批处理的阶段,只能在既慢又笨重的大型机器上工作,要先将程序卡片装入设备,然后等1个小时后才能取运算的结果。贝尔实验室联合麻省理工学院以及通用电气公司想建立一套多使用者、多任务、多层次的 Multics 操作系统,却由于开发周期过长,成本高,进度缓慢等种种原因,1969 年贝尔实验室最后决定撤出这个项目。
PDP-7小型机
让肯·汤普森失望的是,自己再也不能玩自己写的名为“star travel”的游戏了,因为这个游戏完全是基于 Multics 的。既然实验室撤出了项目,那就自己开发个操作系统来满足想玩游戏的愿望。肯·汤普森找到了一台废弃已久的老式 PDP-7小型机,虽然称为小型机,那时候也得有一个房间那么大!在这台机器上他首先重写了游戏,游戏有了后,肯·汤普森还想着要开发一个全新的操作系统。由此接下来他一周一个内核,一个文件系统,一个编辑器,一个编译程序的,竟然在一个月内编写完了操作系统的内核。这个系统做完后,肯·汤普森将其命名为 UNiplexed Information and Computing System,缩写为 UNICS ,后面陆续做了一些改动后,第一版UNIX操作系统诞生。
那一年,肯·汤普森年仅26岁!
1973 年的 10 月,在 IBM 举办的操作系统原理专题研讨会上 ,还不太为外界所知的UNIX被首次提及,当肯·汤普森和与丹尼斯·里奇在会上宣读论文并展示了UNIX后,整个会场瞬间轰动了。随后UNIX的需求量日益增加,肯·汤普森和与丹尼斯·里奇决定将UNIX进一步改写,以便可以移植到各种不同的硬件系统。由于UNIX的源码中不少是用汇编完成,不具备良好的移植性,正好丹尼斯·里奇在 1973 年在 B 语言的基础上开发出了 C 语言,C 语言灵活,也更高效,与硬件无关,并且不失其简洁性,正是UNIX移植所需要的法宝,于是旧版的UNIX与 C 语言完美结合在一起产生了新的可移植的UNIX系统。随着UNIX的广泛使用,C 语言也成为了当时最受欢迎的编程语言一直延续至今。
UNIX的设计哲学就是KISS——Keep It Simple, Stupid
肯·汤普森和与丹尼斯·里奇
1983 年,美国计算机协会将图灵奖授予肯·汤普森和与丹尼斯·里奇。
原文:
For their development of generic operating systems theory and specifically for the implementation of the UNIX operating system.
翻译:
授予肯·汤普森和与丹尼斯·里奇图灵奖以表彰其在通用操作系统理论领域的贡献,特别是UNIX操作系统的开发与实现。
黑客
根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有同时满足这三个标准,才能被称为“黑客”。它们构成了黑客的价值观,黑客追求的就是这三种价值,而不是实用性或金钱。
UNIX系统在贝尔实验室是供大家免费使用的。有人发现,汤普森总能进入每个人的账户,于是一位同事便分析UNIX代码,重新编译了系统。令人意想不到的是,汤普森仍然能进入他们的账户,贝尔实验室的科学家们却对此束手无策。直到1983年,汤普森才在他的图灵奖获奖感言里揭示了这一秘密,原来,让他轻松“侵入”各位同事账户的秘诀不在UNIX代码,而在编译UNIX代码的C编译器里,而汤普森正是编译器的开发者。
飞行员肯·汤普森
肯·汤普森在随后并没有走上创业的通路,而是在贝尔实验室从事热爱的开发工作直到退休。但传奇者的人生怎么可能就此陨落,肯·汤普森在退休后竟开启了他另一个爱好并当成了职业——那就是飞行员。
飞行员肯·汤普森
Go语言
2006 年,肯·汤普森加入了 Google 公司,开发了Go语言,Go语言也叫Golong语言,是由谷歌公司推出。Go语言的主要开发者有:肯.汤姆逊(Ken Thompson)、罗布.派克(Rob Pike)和罗伯特.格里泽默(Robert Griesemer)。这三个都是大神。
Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go = C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。
评价
他与丹尼斯·里奇一起创造了UNIX。同时也是B程序语言,UTF-8编码,ed文本编辑器的创造者、设计者。Go程序语言的开发者之一。1983年与丹尼斯·里奇一起被授予美国计算机协会图灵奖;1994年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;1998年被授予国家科技奖章;1997年入选计算机历史博物馆名人录。
网络上对肯·汤普森的评价:“世界上最杰出的程序员。”
Unix
UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中,UNIX 诞生于 20 世纪 60 年代末,Windows 诞生于 20 世纪 80 年代中期,Linux 诞生于 20 世纪 90 年代初,可以说 UNIX 是操作系统中的"老大哥",后来的 Windows 和 Linux 都参考了 UNIX。
现代的 Windows 系统已经朝着“图形界面”的方向发展了,和 UNIX 系统有了巨大的差异,从表面上甚至看不出两者的关联。
UNIX 的坎坷历史
UNIX 操作系统由肯•汤普森(Ken Thompson)和丹尼斯•里奇(Dennis Ritchie)发明。它的部分技术来源可追溯到从 1965 年开始的 Multics 工程计划,该计划由贝尔实验室、美国麻省理工学院和通用电气公司联合发起,目标是开发一种交互式的、具有多道程序处理能力的分时操作系统,以取代当时广泛使用的批处理操作系统。
说明:分时操作系统使一台计算机可以同时为多个用户服务,连接计算机的终端用户交互式发出命令,操作系统采用时间片轮转的方式处理用户的服务请求并在终端上显示结果(操作系统将CPU的时间划分成若干个片段,称为时间片)。操作系统以时间片为单位,轮流为每个终端用户服务,每次服务一个时间片。
可惜,由于 Multics 工程计划所追求的目标太庞大、太复杂,以至于它的开发人员都不知道要做成什么样子,最终以失败收场。
以肯•汤普森为首的贝尔实验室研究人员吸取了 Multics 工程计划失败的经验教训,于 1969 年实现了一种分时操作系统的雏形,1970 年该系统正式取名为 UNIX。
想一下英文中的前缀 Multi 和 Uni,就明白了 UNIX 的隐意。Multi 是大的意思,大而且繁;而 Uni 是小的意思,小而且巧。这是 UNIX 开发者的设计初衷,这个理念一直影响至今。
有意思的是,肯•汤普森当年开发 UNIX 的初衷是运行他编写的一款计算机游戏 Space Travel,这款游戏模拟太阳系天体运动,由玩家驾驶飞船,观赏景色并尝试在各种行星和月亮上登陆。他先后在多个系统上试验,但运行效果不甚理想,于是决定自己开发操作系统,就这样,UNIX 诞生了。
自 1970 年后,UNIX 系统在贝尔实验室内部的程序员之间逐渐流行起来。1971-1972 年,肯•汤普森的同事丹尼斯•里奇发明了传说中的C语言,这是一种适合编写系统软件的高级语言,它的诞生是 UNIX 系统发展过程中的一个重要里程碑,它宣告了在操作系统的开发中,汇编语言不再是主宰。
到了 1973 年,UNIX 系统的绝大部分源代码都用C语言进行了重写,这为提高 UNIX 系统的可移植性打下了基础(之前操作系统多采用汇编语言,对硬件依赖性强),也为提高系统软件的开发效率创造了条件。可以说,UNIX 系统与C语言是一对孪生兄弟,具有密不可分的关系。
20 世纪 70 年代初,计算机界还有一项伟大的发明——TCP/IP 协议,这是当年美国国防部接手 ARPAnet 后所开发的网络协议。美国国防部把 TCP/IP 协议与 UNIX 系统、C语言捆绑在一起,由 AT&T 发行给美国各个大学非商业的许可证,这为 UNIX 系统、C语言、TCP/IP 协议的发展拉开了序幕,它们分别在操作系统、编程语言、网络协议这三个领域影响至今。肯•汤普森和丹尼斯•里奇因在计算机领域做出的杰出贡献,于 1983 年获得了计算机科学的最高奖——图灵奖。
图 1 为肯•汤普森与丹尼斯•里奇的合影,天才都是不修边幅的……
随后出现了各种版本的 UNIX 系统,目前常见的有 Sun Solaris、FreeBSD、IBM AIX、HP-UX 等。
Solaris 和 FreeBSD
我们重点介绍一下 Solaris,它是 UNIX 系统的一个重要分支。Solaris 除可以运行在 SPARC CPU 平台上外,还可以运行在 x86 CPU 平台上。在服务器市场上,Sun 的硬件平台具有高可用性和高可靠性,是市场上处于支配地位的 UNIX 系统。
对于难以接触到 Sun SPARC 架构计算机的用户来说,可以通过使用 Solaris x86 来体验世界知名大厂的商业 UNIX 风采。当然,Solaris x86 也可以用于实际生产应用的服务器,在遵守 Sun 的有关许可条款的情况下,Solaris x86 可以免费用于学习研究或商业应用。
FreeBSD 源于美国加利福尼亚大学伯克利分校开发的 UNIX 版本,它由来自世界各地的志愿者开发和维护,为不同架构的计算机系统提供了不同程度的支持。FreeBSD 在 BSD 许可协议下发布,允许任何人在保留版权和许可协议信息的前提下随意使用和发行,并不限制将 FreeBSD 的代码在另一协议下发行,因此商业公司可以自由地将 FreeBSD 代码融入它们的产品中。苹果公司的 OS X 就是基于 FreeBSD 的操作系统。
FreeBSD 与 Linux 的用户群有相当一部分是重合的,二者支持的硬件环境也比较一致,所采用的软件也比较类似。FreeBSD 的最大特点就是稳定和高效,是作为服务器操作系统的不错选择;但其对硬件的支持没有 Linux 完备,所以并不适合作为桌面系统。
其他 UNIX 版本因应用范围相对有限,在此不做过多介绍。
Unix和BSD
说到Linux,我们首先要了解Unix。
Unix是一种在AT&T贝尔实验室已经存在很长时间的操作系统。该项目由两位著名的计算机科学家肯•汤普森(Ken Thompson)和丹尼斯•里奇(Dennis Ritchie)领导。
Unix的正式开发始于1969年的夏天,Unix的第一个版本于1971年3月发布,随后的第二个版本于1972年发布。
如果你在Linux机器上或MacOS上输入date命令,你会得到一个名为Unix时间戳的数字。这个数字是自1970年1月1日00:00:00起的秒数。
为什么是1970年1月1日呢?现在你应该知道答案了,那时Unix正处于开发过程中。
Ken Thompson和Dennis Ritchie创建了B语言,这是Unix早期版本中支持的编程语言。然后,在1972年,里奇(Ritchie)重写了B语言,对它进行了更好的改进,成为了C语言,这种语言在今天仍然非常流行。后来的大多数Unix组件都是用C编写的。
在20世纪70年代后期,AT&T与教育机构和外部商业组织共享了Unix,从而导致了许多不同版本Unix的诞生。其中最突出的是由加州大学伯克利分校的计算机系统研究小组构建的教育版本。此版本被广泛称为Berkeley Software Distribution,即BSD。
最初,BSD是建立在Unix设计和代码库的基础上,但是后来,Unix和BSD的版本变得越来越有特色,导致了Unix BSD版本和AT&T代号为System V的Unix版本之间的“标准竞争”。最终,胜利属于SystemV。后来的BSD版本使System V更接近于学习,并纳入了公认的普遍接受的标准。
随着FreeBSD、NetBSD和OpenBSD等开源项目的出现,BSD分支的历史发展告一段落。BSD的最终版本于1995年推出。Unix的最终版本是1989年发布的Unix 10版本,是由Bell Laps开发的。
尽管作为Unix的官方版本和BSD很久以前就停止了开发,但是目前许多操作系统(从闭源到开源)都是基于这两个分支开发的。
比较著名和成功的商业版本可能是苹果的MacOS。目前iOS、watchOS和tvOS系统以及其他苹果操作系统都基于BSD平台。MacOS也是少数几个被认为是类UNIX的操作系统之一。
UNIX 版本
GNU
GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。这个操作系统是GNU计划的主要目标,名称来自GNU’s Not Unix!的递归缩写,因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。GNU的创始人,理查德·马修·斯托曼,将GNU视为“达成社会目的技术方法”。
作为操作系统,GNU的发展仍未完成,其中最大的问题是具有完备功能的内核尚未被开发成功。GNU的内核,称为Hurd,是自由软件基金会发展的重点,但是其发展尚未成熟。在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux(见GNU/Linux命名争议)。
在Unix的发展过程中,1983年发生了一件重要的事情,这是后来发生剧变的前提。
1983年9月,Richard Stallman宣布引入GNU计划(GNU代表的是GNU,不是Unix)。
GNU项目的目标是创建一个自由的、类unix的操作系统,在这个系统中,人们人们可以自由地复制,开发,修改和分发软件,并且不受限制。
请记住,Unix和Unix的派生版本最初是封闭源的,并拥有版权。
1985年,理查德(Richard)建立了自由软件基金会(FSF),这是一个非营利性组织,旨在促进软件开发的自由。
GNU项目创建了许多重要的产品,如GNU Compiler Collection (gcc)、GNU Debugger、GNU Emacs text editor (Emacs)、GNU build automator (make)等,还有今天使用最广泛的:GNU通用公共许可证(GPL)。
GNU项目取得了许多伟大的成就,创造了许多与Unix相似的工具。然而,GNU仍然缺少一个重要的组成部分:内核(用于处理与硬件设备(CPU、RAM、设备等)的控制和通信的部分)。
Linux
1991年8月25日,一位名叫Linus Torvalds的芬兰学生介绍了一种个人产品,后来成为Linux内核。
Linus的项目很快受到了许多个人和组织的关注。
Linux内核和GNU软件的结合创造了第一个完全免费的操作系统。它的名字是GNU/Linux。
注意:
普遍认为,无论是在MacOS上还是Linux上运行像ls、cat、grep这样的命令,其本质是相同的。但它们其实是两种不同的工具。在Ubuntu上运行grep——help或man grepon可以得到GNU版本的介绍,在Mac上可以得到BSD版本的介绍。当然,大多数GNU和BSD (Unix)工具对于每个选项都是相同的,但是也有例外。
您可以在Mac上安装GNU版本,而不是默认版本,这就可以像Linux一样使用相同的命令。
Linux 的那些往事
Linux 内核最初是由李纳斯•托瓦兹(Linus Torvalds)在赫尔辛基大学读书时出于个人爱好而编写的,当时他觉得教学用的迷你版 UNIX 操作系统 Minix 太难用了,于是决定自己开发一个操作系统。第 1 版本于 1991 年 9 月发布,当时仅有 10 000 行代码。
图1为 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds,1969年12月28日- )早期的老照片
图2为 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds,1969年12月28日- )近期的百度百科上的照片
李纳斯•托瓦兹没有保留 Linux 源代码的版权,公开了代码,并邀请他人一起完善 Linux。与 Windows 及其他有专利权的操作系统不同,Linux 开放源代码,任何人都可以免费使用它。
据估计,现在只有 2% 的 Linux 核心代码是由李纳斯•托瓦兹自己编写的,虽然他仍然拥有 Linux 内核(操作系统的核心部分),并且保留了选择新代码和需要合并的新方法的最终裁定权。现在大家所使用的 Linux,我更倾向于说是由李纳斯•托瓦兹和后来陆续加入的众多 Linux 好者共同开发完成的。
李纳斯•托瓦兹无疑是这个世界上最伟大的程序员之一,何况,他还搞出了全世界最大的程序员交友社区 GitHub (开源代码库及版本控制系统)。
关于 Linux 吉祥物的由来是一个很有意思的话题,它是一只企鹅。
为什么选择企鹅,而不是选择狮子、老虎或者小白兔?有人说因为李纳斯•托瓦兹是芬兰人,所以选择企鹅,有人说因为其他动物图案都被用光了,李纳斯•托瓦兹只好选择企鹅。
我更愿意相信以下说法,企鹅是南极洲的标志性动物,根据国际公约,南极洲为全人类共同所有,不属于世界上的任何国家,可国家都无权将南极洲纳入其版图。Linux 选择企鹅图案作为 Logo,其含义是:开放源代码的 Linux 为全人类共同所有,可公司无权将其私有。
Unix 与 Linux 的亲密关系
二者的关系,不是大哥和小弟,"UNIX 是 Linux 的父亲"这个说法更怡当。之所以要介绍它们的关系,是因为要告诉读者,在学习的时候,其实 Linux 与 UNIX 有很多的共通之处,简单地说,如果你已经熟练掌握了 Linux,那么再上手使用 UNIX 会非常容易。
二者也有两个大的区别:
Linux 受至旷大计算机爱好者的喜爱,主要原因也有两个:
开源软件是不同于商业软件的一种模式,从字面上理解,就是开放源代码,大家不用担心里面会搞什么猫腻,这会带来软件的革新和安全。
另外,开源其实并不等同于免费,而是一种新的软件盈利模式。目前很多软件都是开源软件,对计算机行业与互联网影响深远。
开源软件本身的模式、概念比较晦涩。
近年来,Linux 已经青出于蓝而胜于蓝,以超常的速度发展,从一个丑小鸭变成了一个拥有庞大用户群的真正优秀的、值得信赖的操作系统。历史的车轮让 Linux 成为 UNIX 最优秀的传承者。
总结一下 Linux 和 UNIX 的关系/区别
Linux 是一个类似 Unix 的操作系统,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化,所以 Linux 模仿了 UNIX(但并没有抄袭 UNIX 的源码),使得 Linux 在外观和交互上与 UNIX 非常类似。
说模仿或许会被人喷,你也可以说微创新或者改进。
相比于 UNIX,Linux 最大的创新是开源免费,这是它能够蓬勃发展的最重要原因;而目前的 UNIX 大部分都是收费的,小公司和个人都难以承受。
正是由于 Linux 和 UNIX 有着千丝万缕的联系,所以人们把 Linux 叫做“类UNIX系统”。
Unix / Linux 的系统结构
UNIX/Linux 系统可以粗糙地抽象为 3 个层次(所谓粗糙,就是不够细致、精准,但是便于初学者抓住重点理解),如图 3 所示。底层是 UNIX/Linux 操作系统,即系统内核(Kernel);中间层是 Shell 层,即命令解释层;高层则是应用层。
内核层
内核层是 UNIX/Linux 系统的核心和基础,它直接附着在硬件平台之上,控制和管理系统内各种资源(硬件资源和软件资源),有效地组织进程的运行,从而扩展硬件的功能,提高资源的利用效率,为用户提供方便、高效、安全、可靠的应用环境。
Shell层
Shell 层是与用户直接交互的界面。用户可以在提示符下输入命令行,由 Shell 解释执行并输出相应结果或者有关信息,所以我们也把 Shell 称作命令解释器,利用系统提供的丰富命令可以快捷而简便地完成许多工作。
应用层
应用层提供基于 X Window 协议的图形环境。X Window 协议定义了一个系统所必须具备的功能(就如同 TCP/IP 是一个协议,定义软件所应具备的功能),可系统能满足此协议及符合 X 协会其他的规范,便可称为 X Window。
现在大多数的 UNIX 系统上(包括 Solaris、HP-UX、AIX 等)都可以运行 CDE (Common Desktop Environment,通用桌面环境,是运行于 UNIX 的商业桌面环境)的用户界面;而在 Linux 上广泛应用的有 Gnome(见图 4)、KDE 等。
该图为 Gnome图形界面
X Window 与微软的 Windows 图形环境有很大的区别:
作为服务器部署,绝大多数 Linux 并不安装或并不启用图形环境。
Linux发行版
Linux只是内核部分,GNU提供了在该内核上运行的必要工具。但是,我们可以自由决定内核配置。
一些组织和公司通过将Linux内核与实用程序或程序包管理器相结合来创建完整的操作系统发行版,这些称为Linux发行版。
今天,有无数的Linux发行版,其中许多都是非常熟悉和流行的。一些最常用的发行版包括:Ubuntu, Debian, CentOS, Fedora, Redhat, Linux Mint等。
发行版可以构建在另一个发行版之上。事实上,我上面提到的发行版彼此之间有许多密切的关系。最古老的两个发行版(现在仍然在使用)是Slackware和Debian。它们创建于1993年。
Debian的后代分支也可能是比较大的发行版。除了Debian本身之外,这个分支的主要代表还有Ubuntu(构建在Debian之上)、Linux Mint(构建在Ubuntu之上)和Kali Linux。
另一个著名的发行版是Redhat,主要发行版是CentOS (RHEL),这是一个针对Redhat的企业客户的发行版。除了提供RHEL作为付费发行版之外,Redhat还向社区提供另一个免费发行版,即Fedora。
实际上,通常首先对Fedora版本进行测试以获取反馈和错误修复,然后在稳定的Fedora版本上构建RHEL。此外,Redhat还为RHEL的几乎所有组件提供了免费的源代码,并且社区可以构建发行版(类似于 RHEL)。CentOS是一个社区版本(不受Redhat支持),完全免费,是一个与RHEL类似的企业级质量的发行版。
学习和熟悉Linux,在我个人看来Ubuntu(或Debian)和CentOS将是你应该熟悉的组合。
还有其他完全基于Linux内核的操作系统。其中最突出的就是Android。Android可能是使用Linux内核的比较流行的操作系统。
Linux内核版本
您可以在项目主页上的https://www.kernel.org/上查看Linux内核版本的列表。
要检查正在使用的发行版上的内核版本,可以使用uname -r命令。
使用uname -a命令将打印出整个系统信息,uname -o将打印出操作系统名称。您将得到的结果是:操作系统名称是GNU / Linux,而不仅仅是Linux。
类Unix
MacOS是少数通过Single UNIX Specification(SUS)认证的操作系统之一,并且被认为是类Unix的操作系统。
当前,UNIX商标版权归Open Group所有(请注意,UNIX商标名称中的字母均大写,而对于操作系统,我们可以写成Unix或UNIX)。
“类Unix(Unix-like”)”用于表示具有SUS认证的操作系统,并且可以使用UNIX品牌。
问题是:按照上述定义,Linux是“类Unix”操作系统吗?答案是否定的。现在Linux发行版不允许使用UNIX商标。
除了将“Unix-like”解释为SUS的一个组成部分之外,还有人建议应该在更广泛的意义上使用“Unix-like”这个词。具体来说,它可分为三类:
下面是一个简图,描述了Unix的形成和开发过程以及与Unix密切相关的操作系统。
学习 Linux 需要一个环境,需要创建一个虚拟机,然后在虚拟机上安装一个 CentOS 系统来学习。
购买服务器这里不作说明。
VMware Workstation 16 Pro
)CentOS 8
)IDM
或 迅雷
下载,这样下载速度非常快**进入BIOS设置主要按键:**DEL, ESC, F1, F2, F8, F9, F10, F12
不同主板台式机进入BIOS按键:
Award BIOS:按“Del”键
AMI BIOS:按“Del”或“ESC”键
Phoenix BIOS:按“F2”键
品牌台式机以及笔记本电脑进入BIOS按键:
开机进入BIOS设置步骤:
按下电源键开机或重新启动计算机,多数电脑会出现品牌LOGO界面,并且提示进入BIOS的按键,以下图为例子,进入BIOS按键为DEL,打开Boot Menu启动菜单的按键是F11;
按下键盘上的DEL键,这时候电脑就会进入BIOS设置主界面,通过↑↓←→方向键选择设置选项;
也可以通过启动快捷键F11(比较常见的是F12、Esc)先调出启动菜单,然后鼠标移动到底部Enter Setup回车即可进入BIOS,有些显示的是BIOS Setup。
详细参考以下热键大全:
品牌笔记本 | |
---|---|
笔记本品牌 | 启动按键 |
戴尔Dell | F2 |
宏基Acer | F2 |
东芝Toshiba | 冷开机时按ESC然后按F1 |
富士通Fujitsu | F2 |
联想Thinkpad | F12 |
IBM | F1 |
HP(惠普) | F2或F10 |
SONY(索尼) | F2 |
Compaq(康柏) | F10 |
lenovo(联想) | F2 (部分机型需关机时按Novo恢复键) |
enq(明基) | F2 |
品牌台式机 | |
---|---|
台式机品牌 | 启动按键 |
IBM | F1 |
惠普HP | F2 |
索尼SONY | F2 |
戴尔Dell | F2 |
宏碁Acer | F2 |
东芝Toshiba | 冷开机时按ESC然后按F1 |
康柏Compaq | F10 |
富士通Fujitsu | F2 |
大多数国产品牌 | F2 |
组装机主板 | |
---|---|
主板品牌 | 启动按键 |
Award BIOS | Del |
Ami BIOS | Del或ESC |
Phoenix BIOS | F2 |
大部分是F2或Del或ESC,还有一少部分是F9或F10或F12。 |
BIOS类型一:技嘉主板
Del
键进入BIOS,在BIOS Features
下,按↓
方向键选择Intel Virtualization Technology
,按Enter键,选择Enabled
,回车;F10
,选择Yes
回车保存,重启。BIOS类型二:惠普笔记本
电脑关机再开机,开机启动时,狂按F10
进入BIOS,选择system configuration
,点击Device Configurations
;
勾选virtualization technology
,点击Save
,点击File
,选择Save Changes And Exit
,保存退出,重启即可。
BIOS类型三:华硕UEFI BIOS
电脑关机再开机,开机启动时,狂按F2
或F8
或Del
进BIOS,在Advanced
下,选择CPU Configuration
回车;
找到Intel Virtualization Technology
回车改成Enabled
,按F10
保存退出,重启即可。
BIOS类型四:ThinkPad笔记本
F1
或Fn+F1
进入BIOS,切换到Security
,选择Virtualization
,回车;Intel(R) Virtualization Technology
回车,改成Enabled
,按F10
保存退出,重启即可。BIOS类型五:Phoenix、InsydeH20主板
电脑关机再开机,开机启动时,狂按Del
或F1
或F2
等按键进入BIOS,Phoenix主板在Configuration
下,选择Intel Virtualization Technology
回车,改成Enabled
,按F10
保存退出,重启即可。
InsydeH20也是在Configuration
下将Intel Virtualization Technology
改成Enabled
,按F10
保存退出,重启即可。
…
以上就是虚拟机VMware提示此主机支持Intel VT-x,但Intel VT-x处于禁用状态的解决方法,也就是开启Intel Virtualization Technology虚拟化技术。
IDM 官网 下载地址:https://www.internetdownloadmanager.com/
Vmware 官网下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html
CentOS 官网下载地址:https://www.CentOS.org/download/
CentOS 国内镜像下载地址(官网不行,就选国内镜像下载,以下载 8 版本为例,其它版本同理):
# CentOS 7 版本说明
CentOS-7.0-x86_64-DVD-1503-01.iso # 标准安装版,一般下载这个就可以了(推荐)
CentOS-7.0-x86_64-NetInstall-1503-01.iso # 网络安装镜像(从网络安装或者救援系统)
CentOS-7.0-x86_64-Everything-1503-01.iso # 对完整版安装盘的软件进行补充,集成所有软件。(包含CentOS7的一套完整的软件包,可以用来安装系统或者填充本地镜像)
CentOS-7.0-x86_64-GnomeLive-1503-01.iso # GNOME桌面版
CentOS-7.0-x86_64-KdeLive-1503-01.iso # KDE桌面版
CentOS-7.0-x86_64-livecd-1503-01.iso # 光盘上运行的系统,类拟于winpe
CentOS-7.0-x86_64-minimal-1503-01.iso # 精简版,最小安装版,自带的软件最少
# CentOS 7 版本 https://mirrors.163.com/CentOS/7/isos/x86_64/
# 镜像版本 # 更新发布时间 # 大小
Index of /CentOS/7/isos/x86_64/
../
0_README.txt 06-Nov-2020 22:32 2495
CentOS-7-x86_64-DVD-2009.iso 04-Nov-2020 19:37 4G
CentOS-7-x86_64-DVD-2009.torrent 06-Nov-2020 22:44 176K
CentOS-7-x86_64-Everything-2009.iso 02-Nov-2020 23:18 10G
CentOS-7-x86_64-Everything-2009.torrent 06-Nov-2020 22:44 381K
CentOS-7-x86_64-Minimal-2009.iso 03-Nov-2020 22:55 973M
CentOS-7-x86_64-Minimal-2009.torrent 06-Nov-2020 22:44 39K
CentOS-7-x86_64-NetInstall-2009.iso 27-Oct-2020 00:26 575M
CentOS-7-x86_64-NetInstall-2009.torrent 06-Nov-2020 22:44 23K
sha256sum.txt 04-Nov-2020 19:38 398
sha256sum.txt.asc 06-Nov-2020 22:37 1258
# CentOS 8 版本 https://mirrors.aliyun.com/CentOS/8/isos/x86_64/
# 镜像版本 # 更新发布时间 # 大小
Index of /CentOS/8/isos/x86_64/
../
CHECKSUM 02-Jun-2021 04:45 319
CHECKSUM.asc 17-Aug-2021 02:51 811
CentOS-8.4.2105-x86_64-boot.iso 02-Jun-2021 04:21 723M
CentOS-8.4.2105-x86_64-boot.iso.manifest 02-Jun-2021 04:25 635
CentOS-8.4.2105-x86_64-boot.torrent 17-Aug-2021 14:45 29K
CentOS-8.4.2105-x86_64-dvd1.iso 02-Jun-2021 04:43 9G
CentOS-8.4.2105-x86_64-dvd1.iso.manifest 02-Jun-2021 04:43 477K
CentOS-8.4.2105-x86_64-dvd1.torrent 17-Aug-2021 14:45 370K
小提示:安装前,记得在 [BIOS](#2.3.1.3 进入 BIOS 的快捷键) 里,[开启 虚拟化设备支持技术](#2.3.1.4 开启虚拟化技术)
安装要求:尽量硬件配置高一点,cpu核数线程数尽量至少8核双线程以上,RAM内存尽量至少16G,32G以上,磁盘空间要么单独拿一块SSD固态来装虚拟机,要么分区一块大点的固态,尽量把虚拟机和其它软件的运行独立出来,虚拟机运行是很耗资源的,否则,会有卡顿的现象
没下载 VMware® Workstation 16 Pro 的点击 [Vmware下载地址](#2.3.2 下载地址) 跳转到下载地址。
下载好 VMware® Workstation 16 Pro 后,一路 Next(下一步),自行选择一个安装路径(不选C盘就行
),傻瓜式安装即可。
下面是安装截图:
安装向导,点击下一步
同意一下协议
更改一下 安装路径,一般不要在 C 盘
取消更新检查,要换新版本,建议卸载旧版本,去官网重新下载新版本安装,至于什么体验计划,无外乎就是收集数据,获取用户的一些使用数据、习惯行为等有用的数据,促使改善他们的产品。
快捷方式看自己留不留
安装完成
需要重启,就重启一下吧
我把所有可用的许可证都放这了,选择对应版本的,填进去,即可
# 许可证密钥
VM 16:
ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
VM 15:
FC7D0-D1YDL-M8DXZ-CYPZE-P2AY6
VZ182-0NDE6-0817Y-KMMZZ-YKAC4
ZC75R-0YW5P-H809Y-QYWQZ-NZ8G8
ZV7XK-02D56-480JZ-ENZEX-YF8XD
YC588-FTDDL-H852Y-UXYGE-YZKE2
VM 14:
FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA
CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD
VM 12:
ZC3TK-63GE6-481JY-WWW5T-Z7ATA
ZY3MR-6LD10-H80XZ-9PW7T-QY290
FC11U-8NXDQ-081QZ-2QYGE-NFUYA
FZ54R-8VG96-084CY-YMY5V-X78C2
AV100-6LFE4-081VZ-GQZX9-WFAX0
VM 11:
VY790-6FF9M-H8D3Q-1PY5T-YFUTD
AA5M8-8NGD3-M805Y-K5Q7G-X28E6
UY3TR-88W40-0818Q-65ZXZ-N22RA
VM 10:
1Z0G9-67285-FZG78-ZL3Q2-234JG
5A6F6-88247-XZH59-HL0Q6-8CD2V
HF6QX-20187-2Z391-522NH-9AELT
5F29M-48312-8ZDF9-A8A5K-2AM0Z
这便是那个界面了,我这里呈暗黑,是因为长期工作的原因,白色刺眼,所以,将系统主题颜色改为了深色模式(也就是暗黑模式)
到这里,就基本安装完成了,下面是一些 设置选项【可选】
编辑-首选项
修改虚拟机默认位置,改在哪,自己开心就好
为虚拟机分配内存
没下 CentOS 镜像文件的,[点击 CentOS 镜像下载地址](#2.3.2 下载地址) 跳转到下载地址
下载好后,开始安装
点击文件创建、点击 + 号创建、或者快捷键创建都可以
典型和自定义随便,怎样都行,小白或想省事的建议典型,反之,自定义
这里先稍后安装
选择 Linux 和 CentOS 8 64位
自定义虚拟机名称及文件放置路径
给的磁盘空间不得低于 20G,建议 40G、50G及以上,磁盘储存方式,单个或多个文件根据自己实际需求就好
这里可以直接点击完成,也可以自定义硬件
去编辑虚拟机设置
指定内存大小,根据自己宿主机得性能决定,自己的物理内存多大,适当给一些内存给虚拟机即可,不得低于1G
同理,根据自己宿主机的CPU,配置一下虚拟机的处理器,不地超过或等于宿主机的性能
选择 ISO 镜像文件
网络连接模式,要稍提一下,往下看,根据自己实际需要,选择适合自己的方式即可。
VMware虚拟机常见的网络类型有bridge(桥接),NAT(地址转换)、host-only(仅主机)3种。
NAT(地址转换)
NAT(network address translation),网络地址转换,简单的理解,NAT模式的虚拟机就是通过宿主机(物理电脑)上网和交换数据的。所有的虚拟机构成了一个局域网,宿主机就是这些虚拟机的上网网关,这样有个好处,宿主机的地址变化了,虚拟机的地址不用改。
Bridge(桥接模式)
桥接模式可以理解为通过物理主机网卡架设了一座桥梁,从而连入了实际的网络中。因此,虚拟机可以被分配与物理主机相同网段的独立IP,所有网络功能和网络中的真实机器几乎完全一样。桥接模式下的虚拟机和网内的真实计算机所处的位置是一样的,它就像是区域网中的一台机器。
在Bridge模式下,电脑设备创建的虚拟机就像一台真正的计算机一样,它会直接连接到实际的网络上,上网宿主机(物理机)没有关系。Bridge网络类型的原来逻辑图如下所示。
如果虚拟机要往物理机发数据,桥接模式下数据还得先经过路由器,路由器的带宽会被占用的。
Host-only(仅主机)
在Host-only模式下,虚拟机的网卡会连接到宿主机的VMnet1上,但宿主机系统并不为虚拟机提供任何路由服务,因此虚拟机只能和宿主机进行通信,不能连接到实际网络上,即无法上网。Host-only网络类型的原理逻辑图如图:
小提示
虚拟机A连接到交换机VMnet1,虚拟机A连接到交换机VMnet8,虚拟机A与虚拟机B是不能通信的,它们处在不同的子网中,
即使你把IP设置为同一个网段也不行。虚拟机A和虚拟机B是访问不了物理机的,因为它们连接的交换机VMnet1、VMnet8与物理网卡没有连通。
虚拟机C连接到交换机VMnet0,虚拟机C与虚拟机机A、B处在不同网络,它们之间也是不能连通的。虚拟机C可以访问物理机,因为虚拟机C与物理机地位相同,同处一个网络。
指定固件类型位 UEFI,然后点击确定,完成虚拟机设置
小提示:
USB,声卡,打印机,一般都直接移除掉,服务器基本用不着,除非用桌面板(带GUI的),但都是开发,谁会用桌面版,加上Linux本身桌面版也是精简的,没有Windows和Mac桌面版强大,Linux一般都是作服务器,作桌面版玩玩儿是可以的
UEFI 和 BIOS 的区别
1.UEFI是一种所谓的“固件”,负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件时的中介角色。
2.与BIOS相比,UEFI编码99%都是由C语言完成。
3.UEFI 一改之前的中断、硬件端口操作的方法,而采用了Driver/protocol的新方式。
4.UEFI将不支持X86实模式,而直接采用Flat mode(也就是不能用DOS了,现在有些 EFI 或 UEFI 能用是因为做了兼容,但实际上这部分不属于UEFI的定义了)。
5.UEFI输出也不再是单纯的二进制code,改为Removable Binary Drivers。
6.OS启动不再是调用Int19,而是直接利用protocol/device Path。
7.对于第三方的开发,BIOS基本上做不到,除非参与BIOS的设计,但是还要受到ROM的大小限制,而UEFI就便利多了。
8.UEFI弥补BIOS对新硬件的支持不足的问题。
9.与BIOS显著不同的是,UEFI是用模块化、C语言风格的参数堆栈传递方式、动态链接的形式构建系统,它比BIOS更易于实现,容错和纠错特性也更强,从而缩短了系统研发的时间。更加重要的是,它运行于32位或64位模式,突破了传统16位代码的寻址能力,达到处理器的最大寻址,此举克服了BIOS代码运行缓慢的弊端。
点击开启此虚拟机
开启过程中,如果遇到有该错误提示,说明未开启虚拟化技术
解决方法:根据对应的主板型号,进入[BIOS](#2.3.1.3 进入 BIOS 的快捷键),[开启网络虚拟技术](#2.3.1.4 开启虚拟化技术)即可
BIOS类型一:技嘉主板
Del
键进入BIOS,在BIOS Features
下,按↓
方向键选择Intel Virtualization Technology
,按Enter键,选择Enabled
,回车;F10
,选择Yes
回车保存,重启。BIOS类型二:惠普笔记本
电脑关机再开机,开机启动时,狂按F10
进入BIOS,选择system configuration
,点击Device Configurations
;
勾选virtualization technology
,点击Save
,点击File
,选择Save Changes And Exit
,保存退出,重启即可。
BIOS类型三:华硕UEFI BIOS
电脑关机再开机,开机启动时,狂按F2
或F8
或Del
进BIOS,在Advanced
下,选择CPU Configuration
回车;
找到Intel Virtualization Technology
回车改成Enabled
,按F10
保存退出,重启即可。
BIOS类型四:ThinkPad笔记本
F1
或Fn+F1
进入BIOS,切换到Security
,选择Virtualization
,回车;Intel(R) Virtualization Technology
回车,改成Enabled
,按F10
保存退出,重启即可。BIOS类型五:Phoenix、InsydeH20主板
电脑关机再开机,开机启动时,狂按Del
或F1
或F2
等按键进入BIOS,Phoenix主板在Configuration
下,选择Intel Virtualization Technology
回车,改成Enabled
,按F10
保存退出,重启即可。
InsydeH20也是在Configuration
下将Intel Virtualization Technology
改成Enabled
,按F10
保存退出,重启即可。
…
以上就是虚拟机VMware提示此主机支持Intel VT-x,但Intel VT-x处于禁用状态的解决方法,也就是开启Intel Virtualization Technology虚拟化技术。
这里仅使用最小安装作服务器,桌面版不作说明
提示:
从Windows进入虚拟机:
单击
或Ctrl+G
退出虚拟机回到Windows:
Ctrl+Alt
开启Intel Virtualization Technology
后,重启电脑,开启此虚拟机,启动界面如下:
小提示:
若
检查安装文件
到达100%时,
测试的edu的镜像,检测不通过,报错,发现有问题:
① 若取消检查,发现在点击开始安装之后,就一直卡在安装进度里,以失败告终
② 若不取消检查,发现报检查失败,检查不通过,拒绝继续执行后续程序,亦以失败告终
所以,需要重新下载一个镜像,换成其它镜像就OK了
测试的aliyun和163的镜像,检测通过,It‘s OK!
检查通过后,进入安装语言选项设置
默认时区为美国-纽约,需要改为中国的,需要修改一下时区,不然和系统时间相差 8 小时。
一般默认在:亚洲-上海,可能是西方国家开发出来这个产品之时,认为中国只有上海最繁华,这种旧思想一直沿用至今,估计他们也懒改这些小细节。
选择需要安装地软件,需要的就勾选上
我这里最小化安装
这里选择自定义分区,小白或不知道咋分区就自动就好了,反之,自定义分区。
分区这里自定义,不会分区就自动
这里简单分配一下,根据自己实际情况去分配就好了
选择接受更改
设置网络和主机名
更改主机名和打开网络
设置 root 用户和密码
设置密码,密码太简单要点击两次完成
点击开始安装
安装中…
重启系统即可
到这里,基本安装结束了,可以开始使用了
带 GUI 的图形化界面,稍多几个步骤。
进入许可协议
同意一下许可协议,点击完成
创建普通用户【可选】,然后结束配置
进入欢迎界面
关闭地理位置和自动提交报告,开启与关闭,自己开心就好。
跳过在线账号登录
创建主目录用户名
自定义设置密码,然后继续
密码设置好后,就可以开始使用了
然后就是这个干干净净的桌面了,点击活动可以打开菜单栏
这个图形化界面确实还是干净、清爽、雅观、暗黑等,低调、素雅的感觉,非常舒服。
# 进入网络配置目录
cd /etc/sysconfig/network-scripts/
# 查看当前路径的文件
ll
# 编辑网络配置文件
vi ifcfg-ens32 或 vim ifcfg-ens32
vi ifcfg-enp0s3 或 vim ifcfg-enp0s3
# 配置如下
# =============== ens32 ===============
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none # static为静态IP
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens32
UUID=b03s206b-sa7f-4cc4-8d3c-d7aatahcfed9
DEVICE=ens32
ONBOOT=yes # yes表示设置开机启动
IPV6_PRIVACY=no
HWADDR=00:0C:29:95:A9:8F
IPADDR=xxx.xxx.xxx.xxx # 静态IP地址,保持在同一网段即可
PREFIX=24
GATEWAY=xxx.xxx.xxx.xxx # 网关
DNS1=xxx.xxx.xxx.xxx # DNS
# =============== eth0 ===============
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=“static” # static为静态IP
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=3d9407ec-c449-4d84-822b-9b1ffa986d97
DEVICE=eth0
ONBOOT=yes # yes表示设置开机启动
IPADDR=xxx.xxx.xxx.xxx # 静态IP地址,保持在同一网段即可
GATEWAY=xxx.xxx.xxx.xxx # 网关
NETMASK=xxx.xxx.xxx.xxx # 子网掩码
DNS1=114.114.114.114 # DNS
# 设置完后,按 ESC 退出编辑模式,输入 :wq 保存退出
:wq
# 重启
reboot
# 测试 分别 ping 静态ip、ping 网关、ping 外网,若 ping 得通,表示网络设置OK
ping xxx.xxx.xxx.xxx
因为有些用的 CentOS 7 版本,有些用的 CentOS 8 版本,所以,在这里简单提一下。
CentOS 7 与 CentOS 8 都是采用 XFS
CentOS 8 采用 4.18.0-xxx
CentOS 7 采用 3.10-0-xxx
CentOS 8 采用 2019-05-07(Kernel Version 4.18.0-80)
CentOS 7 采用 2014-06-09(Kernel Version 3.10.0-123)
# CentOS 7
Repo ID: rhel-7-server-rpms
Repo Name: CentOS 7 Server (RPMs)
# CentOS 8
Repo ID: rhel-8-for-x86_64-appstream-rpms
Repo Name: CentOS 8 for x86_64 - AppStream (RPMs)
Repo ID: rhel-8-for-x86_64-baseos-rpms
Repo Name: CentOS 8 for x86_64 - BaseOS (RPMs)
# CentOS 7
最大. (单独) 文件大小= 500TiB
最大. 文件系统大小 = 500TiB
# CentOS 8
XFS 文件系统,支持的最大文件大小,已从 500 TiB 增加到 1024 TiB。
(此最大文件大小,仅适用于 64 位机器。CentOS 不支持 32 位机器上的 XFS.)
# CentOS 7
yum基于3.0.x版本
# CentOS 8
包管理由 DNF (YUMv4)完成。
yum4 基于 DNF 技术,yum4 命令提供了与早期版本中使用的 Yum v3 的向后兼容性。yum 命令只是到 dnf 的一个符号链接。
# CentOS 7
只支持12TB
# CentOS 8
24TB,64位架构
# CentOS 7
CentOS 7 firewalld 守护进程使用 iptables 作为其默认后端。
# CentOS 8
CentOS 8 使用 nftables 取代了 iptables
nftables 是默认的网络包过滤,它取代了以前的 iptables 框架。firewalld 守护进程现在使用 nftables 作为默认后端。这将取代以前使用的“iptables”、“ip6tables”、“arptables”和“ebtables”工具。“nftables”确实为IPv4和IPv6协议提供了一个单一的框架。
# CentOS 7
CentOS 7 中 MySQL的默认实现是 MariaDB
# CentOS 8
MySQL 8.0
MariaDB 10.3
PostgreSQL 10 and PostgreSQL 9.6
Redis 5.0
# CentOS 7
64-bit AMD
64-bit Intel
IBM POWER7
IBM System z
# CentOS 8
AMD and Intel 64-bit architectures
The 64-bit ARM architecture
IBM Power Systems, Little Endian
IBM Z
# CentOS 7
Boot ISO
Binary(二进制) DVD ISO
Supplementary(追加的) Binary DVD
# CentOS 8
Binary(二进制) DVD ISO
Boot ISO
# CentOS 7
Cockpit默认情况下没有安装,需要通过启用extra和optional存储库通道来安装。
# CentOS 8
Cockpit是默认安装和可用的。这将在非最小模式下自动安装,并在防火墙中启用所需端口。
Cockpit提供了一个增强的框架,可以用来访问/编辑/更改许多系统设置。这提供了通过web接口的访问,可以使用浏览器访问url地址http://:9090进行管理。
# CentOS 7
virt-manager将用于基于KVM的虚拟系统管理。
# CentOS 8
默认情况下,它由Cockpit管理。如果需要,还可以安装virt-manager。
# CentOS 7
CentOS 7 是用 RPM 4.11 发布的。在RHEL7上,RPM实用程序在解压时验证单个文件的有效负载内容。
# CentOS 8
CentOS 8 是用 RPM 4.14 发布的。现在,RPM 在开始安装之前验证整个包的内容。
这有很多改进,其中一些值得注意的功能是:
debuginfo包可以并行安装
支持弱依赖关系
支持丰富的或布尔依赖
支持封装文件超过4 GB的大小
支持文件触发器
构建在RHEL8上的包在压缩负载上使用一个新的SHA-256散列。
# CentOS 7
CentOS 7 系统上,CUPS日志被存储中 /var/log/cups directory.
nobody用户替换nfsnobody
# CentOS 8
CentOS 8 所有类型的CUPS日志都与来自其他程序的日志一起集中记录在systemd journald守护进程中。要访问CUPS日志,请使用“journalctl -u CUPS”命令。
ID为99的nobody用户和组
nfsnobody用户和组对的ID为65534,这也是默认的内核溢出ID。
nobody和nfsnobody用户和组合并到nobodyID(65534)中。
# CentOS 7
与三个最流行的开源修订控制系统,一起发布:Git、SVN和CVS。
# CentOS 8
Git 2.18
Mercurial 4.8
Subversion 1.10
并发版本系统(CVS)和版本控制系统(RCS)在RHEL8中都不可用。
# CentOS 7
Python 2 ( 2.7.X)
PHP 5.4
Ruby 2.0.0
# CentOS 8
Python 3
PHP 7.2
Ruby 2.5
Node.js 10
# CentOS 7
Docker和Docker Registry是 CentOS 7中的Extras订阅频道的一部分。
# CentOS 8
Docker不包括在CentOS 8 .0中。使用容器时,需要使用podman、buildah、skopeo和runc工具。
podman工具已经作为一个完全支持的特性发布了。
# CentOS 7
OpenJDK8用作默认的Java开发工具包(JDK),而Java 8用作默认的Java版本。
# CentOS 8
提供OpenJDK 11、OpenJDK 8、IcedTea-Web和各种Java工具,如Ant、Maven或Scala。
# CentOS 7
默认的NFS配置文件是/etc/sysconfig/nfs
# CentOS 8
NFS配置文件是/etc/ NFS .conf。
当从RHEL7升级时,CentOS 8 尝试自动将所有选项从/etc/sysconfig/nfs转换为/etc/nfs。并不再支持NFS / UDP。
# CentOS 7
默认显示服务器是X.org
# CentOS 8
Gnome display Manager使用的默认显示服务器是Wayland
CentOS7
CentOS 7 使用 network 管理网络,NetworkManager 默认是关闭的,CentOS 7 mini 版:两个都是开启的
# CentOS版本
[root@yang ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
# 内核版本
[root@yang ~]# uname -r
3.10.0-1160.24.1.el7.x86_64
# 默认是启动的
systemctl status network
# 默认是关闭的
systemctl status NetworkManager
CentOS8
CentOS 8 没有 network ,使用 NetworkManager 管理网络
修改 ip 地址等操作之后,使用 systemctl restart NetworkManager 重启网络服务
# CentOS版本
[root@VM-0-13-CentOS ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
CentOS Linux release 8.4.2105 # 当前新版本
# 内核版本
[root@VM-0-13-CentOS ~]# uname -r
4.18.0-193.28.1.el8_2.x86_64
4.18.0-305.3.1.el8.x86_64 # 当前新版本
# CentOS 8 没有 network
[root@VM-0-13-CentOS ~]# systemctl status network
Unit network.service could not be found.
CentOS 7 只有 yum,CentOS 8 有 yum 和 dnf
Dandified 像花花公子的
yum | dnf |
---|---|
YUM(Yellowdog Updater, Modified) | DNF(Dandified YUM) |
YUM 使用公开的 API 来解析依赖关系 | DNF 使用 libsolv 来解析依赖关系,由 SUSE 开发和维护 |
API 没有完整的文档 | API 有完整的文档 |
只用 Python 编写 | 由 C、C++、Python 编写的 |
YUM 目前在 RHEL 6/7、CentOS 6/7、OEL 6/7 中使用 | DNF 目前在 Fedora、RHEL 8、CentOS 8、OEL 8 和 Mageia 6/7 中使用 |
Yum 只支持基于 Python 的扩展 | DNF 支持各种扩展 |
因为 API 没有正确的文档化,所以创建新功能非常困难 | API 有良好的文档,因此很容易创建新的功能 |
在同步存储库的元数据时,YUM 使用了过多的内存 | DNF 在同步存储库的元数据时,使用的内存较少 |
由于使用公开 API 的原因,Yum 依赖性解析变得迟钝 | DNF 使用满足性算法来解决依赖关系解析(它是用字典的方法来存储和检索包和依赖信息) |
总的来说,在很多因素的影响下,表现不佳 | 从内存使用量和版本库元数据的依赖性解析来看,性能都不错 |
YUM 将在没有验证的情况下更新软件包 | DNF 更新:在 DNF 更新过程中,如果包中包含不相关的依赖,则不会更新 |
如果有存储库不可用,YUM 会立即停止 | 如果启用的存储库没有响应,DNF 将跳过它,并继续使用可用的存储库处理事务 |
在 Yum 中则不同 | dnf update 和 dnf upgrade 是等价的 |
Yum 为这种行为提供了一个选项 | 安装包的依赖关系不更新 |
Yum 不会这样做 | 清理删除的包:当删除一个包时,DNF 会自动删除任何没有被用户明确安装的依赖包 |
Yum 也会这样做 | 存储库缓存更新计划:默认情况下,系统启动后 10 分钟后,DNF 每小时会对配置的存储库检查一次更新。这个动作由系统定时器单元 dnf-makecache.timer 控制 |
Yum 不允许你删除运行中的内核 | 内核包不受 DNF 保护。不像 Yum,你可以删除所有的内核包,包括运行中的内核包 |
Yum 不使用单独的库来执行这些功能 | libsolv:用于解包和读取资源库。hawkey: 为 libsolv 提供简化的 C 和 Python API 库。librepo: 提供 C 和 Python(类似 libcURL)API 的库,用于下载 Linux 存储库元数据和软件包。libcomps: 是 yum.comps 库的替代品。它是用纯 C 语言编写的库,有 Python 2 和 Python 3 的绑定。 |
Yum 包含 56000 行代码 | DNF 包含 29000 行代码 |
YUM 由 Zdenek Pavlas、Jan Silhan 和团队成员开发 | DNF 由 Ales Kozumplik 开发 |
CentOS 7:firewalld 底层使用iptables
CentOS 8:nftables 取代 iptables
# 但是使用都是一样的
systemctl status firewalld
CentOS 7 支持 NTP 和 Chronyd
CentOS 8 只支持 Chronyd,不支持 NTP
CentOS 8 默认安装 podman
docker 与 podman 的区别
早期的RHEL版本中使用了elevator内核命令行参数来设置所有设备的磁盘调度程序。在CentOS 8 中,该参数被弃用。
上游Linux内核已经取消了对elevator参数的支持,但是出于兼容性的原因,CentOS 8 中仍然可以使用它。
在CentOS 8 中,网络脚本在默认情况下不可用。有一个新版本的ifup和ifdown正在使用,这将需要NetworkManager守护进程运行,并在后端使用nmcli。
如果需要早期的网络脚本,则必须安装“network-scripts”包。
在早期版本中,有4级分页实现,可以处理48/46位虚拟/物理地址,并且物理总线上限为64TB。在即将推出的Intel处理器中,这些限制已经扩展到57/52位的虚拟/物理内存寻址,具有128 PiB的虚拟地址空间和4 PB的物理内存容量。
以前,Anaconda没有向订阅管理器提供系统用途信息。在CentOS 8.0中,您可以在安装期间使用Anaconda的system purpose窗口或Kickstart的syspurpose命令设置系统的预期目标。
有一个CodeReady Linux构建器存储库,可用于所有RHEL订阅。这为开发人员提供了额外的包。CodeReady Linux构建器存储库中包含的包不支持生产使用。
OpenSSH的版本是7.8p1,与早期版本相比有很多改进。其中一些是:
不再支持SSH version 1.
默认不开启DNS支持.
最小可接受RSA密钥大小设置为1024位.
移除 ‘Blowfish’, ‘CAST’, ‘RC4’ ciphers.
默认关闭DSA 公钥算法.
useradd和groupadd命令不允许用户名和组名完全由数字字符组成。这是RHEL7中不支持的特性,现在RHEL8完全不支持它。
默认情况下禁用了securetty PAM模块,并且从 CentOS 8 中删除了/etc/securetty文件。
CentOS 8 拥有TCP网络栈版本4.18,可以提供更高的性能、更好的可伸缩性和更稳定的性能。性能得到了提高,特别是在繁忙的TCP服务器与高进入连接速率。
除了新的TCP栈之外,还有两种新的TCP拥塞算法。在大多数情况下,BBR和NV可以提供比cubic更低的延迟和更好的吞吐量。
在CentOS 8中,pcs完全支持Corosync 3集群引擎和用于集群通信的Kronosnet (knet)网络抽象层。无法将集群节点从RHEL7就地升级到RHEL8。
用于管理共享存储逻辑卷的clvmd已被删除,取而代之的是lvmlockd(lvm lock 守护进程)
vmtools 安装后,可以在 windows下更好的管理 vm 虚拟机
小提示:
一般使用远程工具连接服务器,一般不会使用虚拟机或到本地服务器上操作,建议使用远程操作。
安装 VmTools 步骤:
虚拟机 --> 安装 Vmware Tools 即可,Vmware 16 基本不需要手动去安装,会自动安装。
Vmware 16 版本以下的,可能需要手动安装,装一下也简单。
终端复制、粘贴快捷键默认是 Ctrl + Shift + C
、Ctrl + Shift + V
桌面版
进入centos
点击 vm 菜单 -> install vmware tools
centos 会出现一个 vm 的安装包
点击右键解压, 得到一个安装文件
进入该 vm 解压的目录,该文件在 /root/桌面/vmware-tools-distrib/ 下
安装 ./vmware-install.pl
全部使用默认设置即可
需要reboot重新启动即可生效
设置共享文件夹,可以便于 Windows 和 Linux 操作系统之间的文件传输共享。但在实际开发中,一般不会用到,传输文件(文件的上传和下载)一般是使用远程方式完成。
Windows 端:
菜单 -> Vmware(虚拟机) -> Setting(设置),点击选项,选择 always enable(总是启用) 即可
Linux 端:
共享目录在 CentOS 的 /mnt/hgfs/
路径下,我这里未共享,所以,没有目录
Linux 的文件系统:采用级层式
的树状
目录结构(倒栽的树状结构),最上层是根目录/
,在根目录下可以创建其它目录。
Linux 世界有一句经典的语句:在 Linux 世界里,一切皆文件
。
bin -> usr/bin
boot
dev
etc
home
lib -> usr/lib
lib64 -> usr/lib64
lost + found
media
mnt
opt
proc
root
run
sbin -> usr/sbin
selinux
srv
sys
tmp
usr
是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows 下的 program files 目录。
local
var
说明:公司开发时候,具体的情况是这样的
简图:
sshd 服务默认是开启的,该服务会监听 22
号端口
# 查看 sshd 服务状态
service sshd status
# 或者 查看 systemd 系统中所有服务,这里往下翻也可以看到 sshd 服务的状态
systemctl
XShell、XFtp 安装很简单,一路 Next,傻瓜式安装即可,就省略了。
# 查看 Linux 的ip地址
ifconfig 或 ip addr
新建会话,输入服务器 ip、用户名和密码,即可登录
同理,傻瓜式安装好 XFtp 7 即可,打开新建会话,输入服务器 ip、用户名和密码,将文件拖到服务器窗口上即可
所有的Linux 系统都会内建vi 文本编辑器。
Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
以vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用『复制、粘贴』来处理你的文件数据。【使用快捷键】
按下i, I, o, O, a, A, r, R
等任何一个字母之后才会进入编辑模式, 一般来说按 i
即可.【输入编辑内容】
在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开vim 、显示行号等的动作则是在此模式中达成的!【输入命令,保存退出】
# ================ 【一般正常模式】 ================
# 复制、拷贝当前行
yy
# 复制当前向下的几行
5yy # 复制当前行向下的 5 行
# 粘贴
p
# 删除当前行
dd
# 删除当前第几行
5dd # 删除当前行下的 5 行
# 到达文件首行或末尾
G # 文档末尾
gg # 文档首行
# 撤销
u
# 移动光标到指定行
:set nu # 首先显示行号【命令模式】
20 # 输入跳转行数
shift + g # 按快捷键
# ================ 【命令模式】 ================
# 保存退出
:wq
# 不保存退出
:q
# 强制退出
:q!
# 查找文档中某个关键词
/hello # 查找与 hello 相关的关键词
# 取消搜索关键词高亮显示
:noh 或 :nohlsearch # 仅取消当前搜索时的高亮状态,再次搜索关键词时,仍会高亮显示
# 设置或取消文件行号
:set nu # 设置行号
:set nonu # 取消行号
# 立即关机
shutdown now 或 shutdown -h now # 立即关机
halt # 等价于关机
# 自定义时间关机
shutdown -h 1 # "hello,1 分钟后关机"
# 立即重启
shutdonw -r now # 现在重启系统
reboot # 现在重启系统
# 将内存数据同步到磁盘
sync
# 注:无论关机还是重启,记得先运行 sync 命令,将内存中的数据写到磁盘中,防止数据丢失
登录时尽量少用root帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用”su - 用户名’命令来切换成系统管理员身份.
在提示符下输入logout即可注销用户
# 切换用户登录
su - root # 切换到 root 用户,普通用户切到管理员用户,需要密码,反之,不要
# 注销用户
logout # 注:logout 注销指令在图形化界面终端,运行级别无效,在运行级别 3 下有效.
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
Linux 的用户至少需要属于一个组。【一个用户至少属于一个组,一个组可以有多个用户】
当创建用户成功后,会自动的创建和用户同名的家目录
也可以通过 useradd -d 指定目录新的用户名,给新创建的用户指定家目录
# 添加用户
useradd 用户名 # 默认创建与用户名同名的家目录,然后将用户添加进去
useradd -d 用户名 # 创建指定家目录的用户
# 添加用户时,指定用户组
useradd -g 用户组 用户名 # 指定组,然后将用户添加进入
# 指定密码给用户【相当于修改密码】
passwd 用户名
只有root用户才能创建用户(useradd xxx)、删除用户(userdel xxx),其它用户无此权限。
# 删除用户
userdel 用户名 # 删除用户,保留家目录(工作中,一般不会删除用户的家目录)
userdel -r 用户名 # 删除用户和家目录
当我们想删除某个用户的时候,出现 userdel: user admin is currently used by process xxx,可能的原因是你创建用户user1之后,使用su命令切换到user1用户下,之后又想删除user1用户,使用su root切换到root用户下,使用userdel user1。出现上述情况的根本原因在于切换回root用户之后,user1还被某个进程占用。
解决方案:ctrl+d(退出当前用户)
第一次使用ctrl+d退出root用户,回到user1用户;
第二次使用ctrl+d退出user1用户,此时会返回到root用户(再按ctrl+d退出登陆连接),此时使用userdel user1正常删除。
# 查询用户信息
id 用户名 # 当查询的用户不存在时,返回:无此用户
在操作 Linux 中,如果当前用户的权限不够,可以通过 su - 用户名,切换到高权限用户,比如:root
# 切换用户
su - 用户名 # 普通用户(低权限用户)切换到管理员用户(高权限用户),需要输入密码,反之,不需要
# 查看当前登录用户
whoami # 返回当前登录的用户名称
who am i # 返回当前登录的用户信息
类似于角色,系统可以对有共性的多个用户进行统一的管理。
# 添加组
groupadd 组名
# 删除组
groupdel 组名
# 修改组
usermod -g 组名 用户名 # 修改用户所在组
usermod -d 目录名 用户名 # 修改用户登录的初始目录
用户(user)的配置文件,记录用户的各种信息
每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
# 编辑 /etc/passwd 文件(或者cat查看一下也可以,这里为了有颜色好看点,就使用vim了)
vim /etc/passwd
口令的配置文件,已加密处理过
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
# 编辑 /etc/shadow 文件(或者cat查看一下也可以,这里为了有颜色好看点,就使用vim了)
vim /etc/shadow # 默认是只读,最后面的标志看不到了
组(group)的配置文件,记录Linux包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
# 编辑 /etc/group 文件(或者cat查看一下也可以,这里为了有颜色好看点,就使用vim了)
vim /etc/group # 默认是只读,组内用户列表已作处理,看不到了
运行级别
centos 6.8 版本,还是运行级别的方式,7、8 版本改为启动模式
0:# 关机
1:# 单用户【找回丢失密码】
2:# 多用户状态无网络服务
3:# 多用户状态有网络服务
4:# 系统未使用保留给用户
5:# 图形界面
6:# 系统重启
/usr/lib/systemd/system/ctrl-alt-del.target
# 常用运行级别是 3 和 5,要修改默认的运行级别可改文件 /etc/inittab 的 id:5:initdefault: 这一行中的数字
init [012356] # 0~6,除了4,因为4暂未使用
示意图
现在的版本有些改动,如:8 版本
# 查看 /etc/inittab 下都写了些啥
vim /etc/inittab
# 它不再像旧版本那样设置 id num:initdefault,而是设置当前默认启动模式的方式【root用户权限下】:systemctl set-default multi-user.target (命令行) 或 systemctl set-default graphical.target (图形化)
可以发现,inittab文件已经不再使用了,而是使用systemd了。
查看与设置当前默认模式
# 查看当前默认启动模式
systemctl get-default # 最小安装:multi-user.target,图形化界面:graphics.target
vim /etc/systemd/system/default.target # 默认的启动模式配置文件 /etc/systemd/system/default.target
# 设置当前默认启动模式:
# 设置为 命令行,设置后,它会删除 default.target,并创建一个快捷方式,链接到multi-user.target
systemctl set-default multi-user.target
# Removed /etc/systemd/system/default.target.
# Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
# 设置为 图形化界面,设置后,它会删除 default.target,并创建一个快捷方式,链接到multi-user.target
systemctl set-default graphical.target
# Removed /etc/systemd/system/default.target.
# Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.
# 通过查看 /etc/systemd/system/default.target,发现 Description、Requires、After几个变量改变了
# 这是 命令行 模式时的配置
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
# 通过查看 /etc/systemd/system/default.target,发现 Description、Requires、After几个变量改变了
# 这是 图形化界面 模式时的配置
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
运行级别方式,在 /etc/inittab
运行级别配置文件中,设置与修改
# 如:设置为 运行级别 3 的模式
init 3 # num:0~6,除了4
# 或者编辑 /etc/inittab 这个运行级别配置文件
vim /etc/inittab
id:3:initdefault: # 数字0~6,别设置为4就行,因为暂还未使用
# 命令行 --> 图形化界面
# 若需要转为图形化界面,需要执行
yum groupinstall "GNOME Desktop"
# 然后执行命令
startx
# 图形化界面 --> 命令行
Ctrl + Alt + F2
非运行级别方式,而是启动模式,由 systemctl set-default xxx.target
命令修改当前默认启动模式,在 /etc/systemd/system/default.target
当前默认启动模式配置文件中,可以查看得到。所以,若仍然使用以前的 init num(num:0~6,除了4) 的方式,就无任何效果。
# 查看当前默认启动模式
systemctl get-default
# 修改当前默认启动模式
# 命令行 --> 图形化界面
systemctl set-default graphical.target
# 图形化界面 --> 命令行
systemctl set-default multi-user.target
# 去这个配置文件查看就知道了
vim /etc/systemd/system/default.target
方法:进入单用户模式(root不需要密码就可以登录),修改 root 密码。
# 启动 Linux 系统
# 按任意键进入菜单,如:enter
enter
# 启动菜单,输入 e 键
e
# 选择 kernel xxx,再次输入 e 键
e
# 空 1 格,输入数字 1(进入单用户模式)
1
# 告诉内核要进入单用户模式的运行级别,而不进入其它运行级别,按b引导启动,进入单用户模式,自动进入 root 用户(无需密码)
b
# 修改 root 用户新密码,正常重启即可
passwd root # 输入新密码并确认即可
# 修改好 root 新密码后,正常重启系统即可
reboot
方法:修改 Linux 系统启动 kernel 参数
# ① 启动 Linux 系统,选择 kernel 启动菜单
e
# ② 按上下左右键,定位到 linux($root)行,在行尾追加内核参数:rd.break
rd.break
# ③ 按下 Ctrl + X 启动系统,进入 switch_root 模式
# 修改原则:switch_root模式:将原有系统的 / 根目录以ro(只读模式)挂载在 /sysroot/ 目录下,修改root密码,必须将原有系统的 / 根目录挂载为rw(可读写模式)
# ④ 查看挂载的 /sysroot 根分区信息
mount -l |grep /sysroot
# ⑤ 重挂 /sysroot g为 rw(可读写模式)
mount -o remount,rw /sysroot
# 再次查看挂载的 /sysroot 目录信息
mount -l |grep /sysroot
# ⑥ 切换 /sysroot 根分区
chroot /sysroot
# ⑦ 修改root密码(无需输入原root密码),直接修改为新的 root 密码即可。
passwd root # 密码要求必须是 8 位以上的复杂密码
提示:【无需操作,了解即可】
# ⑧ 自动重置 /etc/passwd SELinux 文件上下文,autorelabel 这个名称一定不要写错了,一旦写错了,就登录不进,需要重新来一遍。
touch /.autorelabel
# ⑨ 退出 shell,会回到 switch_root 模式
exit
# ⑩ 退出 switch_root 模式,系统会自动重启,等待重启完成即可
exit
# 小提示:
# ① 重置 root 密码需要访问到 kernel 启动菜单,远程重置 root 密码需要远程控制卡访问物理 Console。
# ② 在第 ⑩ 步系统重启过程中,一定要耐心等待系统自送完成重启过程,千万不要关闭系统或硬重启操作。
当对某个指令不熟悉时,可以使用 Linux 提供的帮助命令,来了解这个指令的使用方法。
# 获取帮助文档
man 命令或配置文件 # 如:man ls
# 查看帮助文档时,按如下键
enter # 一行一行的往下浏览,按上、下键也是一样的
pagedown(PgDn) # 下一页
pageup(PgUp) # 上一页
G # 跳转到文档首行(开头)
gg # 跳转到文档末尾(结束)
h(help) # 请求去帮助命令查看
q(quit) # 退出查看帮助文档
# 获取 shell 内置命令的帮助信息
help 命令 # 如:help cd
退而求次的方法。
以上两个帮助命令可以获取指令帮助信息,但需要简单的英语翻译的过程,耗时且有些不通俗易懂,尤其是需要快速获取结果时,或者英语不太佳的,不建议慢慢去一句一句看,直接搜索或看一下翻译,可以快速解决问题,有时间了,再慢慢去深究原文档都可以。
通用的一些搜索方法
国内:百度、知乎、博客、公众号、订阅号、B站、阿里巴巴等搜索,可以快速获取帮助信息,一般可以解决 80% 以上的问题。
国外:谷歌、雅虎、微软、NHN、eBay、时代华纳、Ask、Yandex等,有些可能需要科学(自行解决,不作介绍)。
专业人士:仍未解决,可以像相关专业人士、官方文档或在线解答咨询。
网页标签【可选】:当第一次搜索到关键信息答案时,若觉得重要,可以保存一下网页,添加一下标签,标签中自行分类整理,自己方便浏览即可。这样做是为了方便下次查询,当需要再次查询时,直接输入相关网址/域名信息,会快速列出相关网页,或者直接在标签中选择也可以,这样既精确了搜索目标,节省了大量时间,又减少了像第一次那样去一个一个网页找想要的答案。
好习惯,好生活
搜索用得好,一点没烦恼。
# 显示当前工作目录的绝对路径
pwd # 可以看到当前在哪个路径下
# 列出当前目录的文件和目录【后面可以带路径】
ls # 默认仅显示当前目录的所有文件和目录【不包括隐藏文件和隐藏目录】
ls -a # 显示当前目录的所有文件和目录【包括隐藏的】
ls -l 或 ll # 以列表的方式显示当前目录的所有文件和目录【不包括隐藏的】
ls -lh 或 ll -h # 以列表的方式显示当前目录的所有文件和目录【不包括隐藏的,按照人类的方式显示,h:human】
ls -al # 以列表的方式显示当前目录的所有文件和目录【包括隐藏的】
ls -ahl # 以r列表的方式显示当前目录的所有文件和目录【包括隐藏的】
ls
ls -a
ls -l
ll:ls -l 的简写
ls -al
可以叫目录,也可以叫路径,若是路径,叫路径,似乎更好好些,是文件夹或者目录,叫目录,似乎更好些。
绝对路径与相对路径
# 绝对路径:从根目录开始定位 到 目标目录 的路径,如:/root/admin # 意味着切到根目录下的root目录下的admin目录
# 相对路径:从当前工作目录开始定位 到 目标目录 的路径,如:./admin/../temp # 意味着切到当前目录下的admin目录下的上一级目录下的temp目录
. … ~ /
# .:一个点(英文符号),代表当前路径,如:cd ./temp # 意味着切到当前目录下的temp目录
# ..:两个点(英文符号),代表返回上一级目录,如:cd ../admin # 意味着切到当前目录的上一级目录下的admin目录
# ~:一个波浪符号,代表用户的家目录,如:cd ~ # 意味着切到当前用户的家目录(主目录)
# /:① 表示根目录,如:cd / # 切到根目录 ② 表示路径间隔符,如:cd ./etc/ # 切到当前目录下的etc目录
# 注:切换目录/路径时,cd 后面目录的/ 可写可不写,建议写上,如:cd /etc <==> cd /etc/ 【建议】
切到指定目录/路径
# 切换到指定目录
cd [选项] 要切换的路径 # [option]:[选项]
mkdir(make directory):用于创建目录
# 创建指定目录
mkdir [选项] 要创建的目录 # 创建一级目录
mkdir -p 要创建的多级目录 # 创建多级目录
# 删除空目录
rmdir [选项] 要删除的空目录 # 删除空目录
rm -rf 要删除的目录 # 强制删除文件和目录
# 创建空文件
touch 文件名称
# cp 指令拷贝文件到指定目录
cp [选项] 源文件/目录 目标目录/路径 # 拷贝源文件/目录到指定的目标目录/路径【拷贝单个源文件/目录,不包括子目录】
cp -r 源文件/目录 目标目录/路径 # 拷贝源文件/目录到指定的目标目录/路径【递归复制整个目录,包括子目录】
\cp 源文件/目录 目标路径 # 强制覆盖不提示【不包括子目录】
\cp -r 源文件/目录 目标目录/路径 # 强制覆盖不提示【包括子目录】
# 移除(删除)文件或目录
rm [选项] 要删除的文件或目录 # 删除单个文件或目录
rm -r 要删除的文件或目录 # 递归删除整个目录
rm -f 要删除的文件或目录 # 强制删除不提示
rm -rf 要删除的文件或目录 # 强制删除不提示【递归删除不提示】
# 移动或重命名文件与目录
mv 旧文件 新文件 # 重命名文件与目录
mv 源路径 目标路径 # 移动文件与目录
# 查看文件内容
cat [选项] 要查看的文件
cat -n 要查看的文件 # 查看文件内容【显示行号】
cat 要查看的文件 | more # 将要查看的文件通过管道符交给 more,进行分页显示
cat -n 要查看的文件 | more # 将要查看的文件通过管道符交给 more,进行分页显示【显示行号】
cat 只能浏览文件,不能修改文件,为了浏览方便,一般会带上管道命令| more
more指令是一个基于 vi 编辑器的文本过滤器,它以全屏幕的方式,按页显示文本文件的内容。
# 全屏分页显示文件内容
more 要查看的文件
more 指令内置的一些快捷键
操作 | 描述 |
---|---|
Space(空格键) | 向下翻一页 |
Enter(回车键) | 向下翻一行 |
q(quit) | 立即退出 more,不再显示该文件内容 |
Ctrl + B | 向上滚动一屏 |
Ctrl + F | 向下滚动一屏 |
=(等于号) | 输出当前行的行号 |
:f | 输出文件名和当前行的行号 |
less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容(分屏显示),对于显示大型文件具有较高的效率。
# 分屏查看文件内容
less 要查看的文件 # 一般,大型日志文件,推荐 less
less 的一些快捷操作
操作 | 描述 |
---|---|
Space(空格键) | 向下翻一页 |
PageDown(PgDn) | 向下翻一页 |
PageUp(PgUp) | 向上翻一页 |
/字符串 | 向下搜索字符串:n:向下查找 N:向上查找 |
?字符串 | 向上搜索字符串:n:向上查找 N:向下查找 |
q(quit) | 立即退出 less |
>:输出重定向,新内容会覆盖原来的内容【覆盖写】
> >:追加,在内容末尾追加新内容,不会覆盖原来的内容【追加写】
# 输出重定向和追加【如果文件不存在,就创建文件,如果文件存在,就覆盖或追加文件】
ls -l > 文件 # 将显示列表的内容,写入文件中去【覆盖写】
ls -al >> 文件 # 将显示列表的内容,追加到文件的末尾【追加写】
cat 文件1 > 文件2 # 将文件1的内容覆盖到文件2
cat 文件1 >> 文件2 # 将文件1的内容追加到文件2
echo "内容" >> 文件 # 将内容追加到文件中去
# 输出内容到控制台
echo [选项] [输出内容]
# head用于显示文件的开头部分内容,默认情况下head指令显示文件的前 10 行内容
head 文件 # 默认查看文件头前 10 行内容
head -n 8 文件 # 查看文件头前 8 行内容,num:可以是任意行数
# tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的尾 10 行内容。
tail 文件 # 默认查看文件尾 10 行内容
tail -n 8 文件 # 查看文件尾 8 行内容,num:可以是任意行数
tail -f 文件 # 实时追踪该文档的所有更新,看日志较多
软链接也成为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径
小提示:当使用 pwd 指令查看目录时,看到的是 软链接
所在目录。
# 创建一个软连接
ln -s [原文件或目录] [软链接名] # 给原文件创建一个软链接
rm -rf 软链接名称 # 删除软连接时,软连接名称后面不要带斜杠
查看已经执行过历史命令,也可以执行历史指令
# 查看已执行过的历史命令
history # 显示所有已执行过的历史命令
history 6 # 显示最近已执行过的 6 个历史命令,num:自定义显示已执行过的历史命令条数
!203 # 执行历史编号为 203 的指令,执行哪条历史命令,就选哪个历史命令编号
# 显示当前日期【建议加上""】
date # 显示当前系统日期(默认格式:星期 月 日 时:分:秒 时区 年)
date +%Y 或 date "+%Y" # 显示当前年份
date +%m 或 date "+%m" # 显示当前月份
date +%d 或 date "+%d" # 显示当前是哪一天
date "+%Y-%m-%d %H:%M:%S" # 显示年月日时分秒,年月日的 - 连接符可以任意替换,时分秒的 : 连接符也是一样的道理,可任意替换
# 设置日期
data -s 字符串时间 # 设置当前系统日期,如:date -s "2020-02-20 20:20:20",如要恢复时间同步,请看下面设置系统时间与同步网络时间
一些相关时间的基本概念
格林尼治标准时间、世界协调时、中国标准时间和夏令时
世界协调时(UTC)
整个地球分为二十四个时区,每个时区都有自己的当地时间。在国际无线电通信的场合,为了统一,使用统一的时间,称为世界协调时(UTC,Universal Time Coordinated)。
格林尼治时间(GMT)
格林威治标准时间(Greenwich Mean Time)是指位于英国伦敦郊区皇家格林威治天文台的标准时间,因为本初子午线被定义为经过那里的子午线。(UTC和GMT时间基本相同,本文不做区分)
科技委(CST)
中国标准时间( China Standard Time)
GMT + 8 = UTC + 8 = CST
钻杆测试(DST)
夏令时(Daylight Saving Time)是指夏天太阳升起较早时,时钟向前拨一小时,以提前日光的使用。(国内不使用)
硬件时钟和系统时钟
硬件时钟(RTC)
RTC(实时时钟)或CMOS时钟,通常由主板上的电池供电,在服务器切断后将继续运行。仅保存日期和时间值,不能保存时区和夏令时设置。
)系统时钟
通常,服务器开始时会复制实时时钟时间,然后独立运行,节省时间、时区和夏令时设置。
# Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC)。
# 系统时间:指当前Linux Kernel中的时间。
# 硬件时间:主板上有电池供电的时间。
# 手动设置时间到一个时间点,可能与当前网络的时间有误差。
date # 查看系统时间
date -set # 设置系统时间
hwclock # 查看硬件时间,如:2021-11-09 15:53:21.800643+08:00
hwclock --set --date = 'xx:xx' # 设置硬件时间
# hwclock man # 查看帮助文档
--date=date_string
This option must be used with the --set or --predict functions, otherwise it is ignored.
hwclock --set --date='16:45'
hwclock --predict --date='2525-08-14 07:11:05'
# 设置系统时间同步同步到网络时间
yum -y install ntp ntpdate # ① 安装ntpdate工具
ntpdate cn.pool.ntp.org # ② 设置系统时间与网络时间同步
hwclock --systohc # ③ 将系统时间写入硬件时间
hwclock -w 或 clock -w # ④ 强制系统时间写入 CMOS 中,防止重启失效
# ========================= 【以上部分为了解,具体配置在下面】 =========================
# 若在安装完Centos Linux操作系统之后,点击系统的时间发现与现在所使用的时间不一致,相差有8小时,而在安装系统的时候,选择的时区是上海,但是CentOS Linux默认的bios时间是utc时间(UTC是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时,以1999年1月1日0000UTC为例,UTC时间是零点,北京时间为1999年1月1日早上8点整。),所以我们在时间上面相隔了8个小时。这个时候bios的时间和系统的时间当然是不一致,一个代表 utc 时间,一个代表cst(+8时区),即上海的时间。
# 下面将操作系统的时间进行同步,【这种方法不建议】
# 编辑系统时间配置文件
vi /etc/sysconfig/clock
# 修改内容如下
ZONE="Asia/Shanghai"
UTC=false #设置为false,硬件时钟不于utc时间一致
ARC=false
# 时区设置为上海时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 校对时间
ntpdate 192.43.244.18
# 安装 ntp 服务器
yum install ntp
# 设置硬件时间和系统时间一致并校准
/sbin/hwclock --systohc
# 修改时区
timedatectl set-timezone Asia/Shanghai
# 查看时间是否正确
date
# 安装 chrony
yum -y install chrony
# 修改配置文件
vi /etc/chrony.conf 或 vim /etc/chrony.conf
# 配置同步 NTP 服务器时间地址,建议配置二个以上
server ntp.aliyun.com iburst
server cn.pool.ntp.org iburst
server time1.cloud.tencent.com iburst
# 重启服务
systemctl start chronyd.service
# 设置开机启动服务
systemctl enable chronyd.service
# 查看时间同步源,查看时间同步进度
chronyc sources -v
# 小提示:
* # 说明时间同步完成
? # 说明时间同步不成功,这时,检查一下防火墙,再看看 chronyd 有没有重启,开启防火墙永久允许 NTP 服务
# 永久允许对外提供NTP时间服务
firewall-cmd --add-service=ntp --permanent
firewall-cmd --reload
# 查看当前日历
cal [选项] # 不加选项,默认显示本月日历
cal 2021 # 显示一整年的日历,如:2021年
# 从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端
find [搜索范围/路径] [选项]
# 结果返回的是查找文件的路径
find /root -name temp.txt # 查找 /root 下文件名为 temp.txt 的文件
find /root -name *.txt # 查找 /root 下文件后缀为 .txt 的所有文件
find /opt -user root # 查找 /opt 下面用户为 root 的文件
find / -size +10M # 查找 / 下面文件大于 10M 的文件(+n:大于 -n:小于 n:等于)
find / -size -100240k # 查找 / 下面文件小于 100240k 的文件(+n:大于 -n:小于 n:等于)
常用选项
选项 | 功能 |
---|---|
-name(文件名) | 按照指定的文件名查找文件 |
-user(用户名) | 按照指定用户名查找文件 |
-size(文件大小) | 按照指定文件大小查找文件(+n:大于 -n:小于 n:等于) |
# 快速定位文件路径,由于 locate 指令基于数据库进行查询,所以,第一次运行前,必须使用 updatedb 指令创建 locate 数据库。
updatedb # 创建 locate 数据库
locate 搜索文件 # 搜索指定文件,返回文件路径
小提示,若有报错:
# 若执行 updatedb,报错:-bash: updatedb: command not found
解决方法
# 安装 mlocate
yum -y install mlocate
# 再次使用 updatedb 更新
updatedb
# 即可查找文件
locate xxx
grep 过滤查找,管道符 “|”,表示将前一个命令的处理结果输出传递给后面的命令处理。
# 过滤查找
grep [选项] 查找内容源文件
# 如:
cat temp.txt | grep 宇宙 # 过滤查找 temp.txt 文件中,含有"宇宙"的关键词及所在的行
cat temp.txt | grep -n 宇宙 # 过滤查找 temp.txt 文件中,含有"宇宙"的关键词及所在的行,并显示行号
cat temp.txt | grep -ni w # 过滤查找 temp.txt 文件中,含有"w"的关键字及所在的行,忽略大小写并显示行号
常用选项
选项 | 描述 |
---|---|
-n | 显示匹配行及行号 |
-i | 忽略字母大小写 |
gzip 用于压缩文件,gunzip 用于解压的
# 解压缩文件
gzip 文件 # 压缩文件,只能将文件压缩为*.gz文件【不保留被压缩源文件】
gunzip 文件.gz # 解压缩文件【不保留gz压缩包】
zip 用于压缩文件,unzip 用于解压的,这个在项目打包发布中很有用的
# 解压缩文件
zip [选项] xxx.zip 将要压缩的内容 # 压缩文件和目录
unzip [选项] xxx.zip # 解压缩文件
zip 常用选项
选项 | 描述 |
---|---|
-r | 递归压缩,即压缩目录 |
unzip 常用选项
选项 | 描述 |
---|---|
-d | 指定解压文件目录/路径 |
tar 指令是打包指令,最后打包后的文件是.tar.gz 的文件。根据不同的参数,即可实现打包压缩,又可实现解压缩。
# 打包
tar [选项] xxx.tar.gz 要打包的文件或目录 # 打包目录,压缩后的文件格式.tar.gz
tar -zcvf xxx.tar.gz 要打包的文件或目录 # 打包压缩
tar -zxvf xxx.tar.gz # 解压 tar.gz 包
tar -zxvf xxx.tar.gz -C 解压的指定目录 # 解压 tar.gz 包到指定目录下【指定的解压目录必须要存在】
常用选项
选项 | 描述 |
---|---|
-c | 打包为 xxx.tar 文件 |
-v | 显示详细信息,显示打包压缩或解压过程 |
-f | 指定打包压缩文件名称 |
-z | 打包压缩 |
-x | 解压 xxx.tar 文件 |
# 最小化安装的,一般需要安装的工具,如:vim(编辑)、ifconfig(网络配置ip)、wget(下载)、chrony(同步网络时间)、mlocate(locate数据库)、zip(压缩文件)、tree(目录结构)、psmisc(进程树)、iptables-services(防火墙:iptables-services 与 firewalld 二选一)等
yum -y install vim net-tools wget chrony mlocate zip tree psmisc ...
# 仅举例几个,不作过多解释
在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有所有者、所在组、其它组的概念。
一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
# 查看文件或目录的所有者
ls -ahl
# 修改文件或目录所有者
chown 用户名 文件或目录名
默认情况下,当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组。
# 查看文件/目录所在组
ls -ahl
# 修改文件所在组
chgrp 组名 文件或目录名
除文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组。
# 改变用户所在组,在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组。
usermod -g 组名 用户名 # 修改用户所在组
usermod -d 目录名 用户名 # 修改用户登录的初始目录
0-9位
# ls -l 中显示的内容如下:
drwxr-xr-x. 2 admin admin 6 Nov 9 15:01 admin
-rw-r--r--. 1 root root 13495 Nov 9 20:23 adminpackage.zip
drwxr-xr-x. 4 root root 31 Nov 9 20:25 admins
drwxr-xr-x. 3 root root 19 Nov 8 22:38 admins0
drwxr-xr-x. 2 root root 23 Nov 8 22:50 admins1
-rw-------. 1 root root 1564 Nov 8 10:36 anaconda-ks.cfg
-rw-r--r--. 1 root root 168 Nov 9 09:45 cal.txt
-rw-r--r--. 1 root root 9537 Nov 9 10:47 Poems.txt
drwxr-xr-x. 2 root root 6 Nov 9 21:15 tem
drwxr-xr-x. 2 root root 56 Nov 9 21:16 temp
-rw-r--r--. 1 root root 806 Nov 9 09:39 temp1.txt
-rw-r--r--. 1 root root 372 Nov 9 00:32 temp2.txt
-rw-r--r--. 1 root root 573 Nov 9 20:54 temp.tar.gz
-rw-r--r--. 1 root root 3493 Nov 9 19:23 temp.txt
探索文件其它组的用户权限后面一个点的含义的过程
# 经过一番实践,得出最终结果是:这个点表示存在 SELinux 的安全标签
. # 表示存在 SELinux的安全标签
# ============= 接下来,看看这个结果怎么来的 =============
# getenforce来查看SELinux的运行模式
[root@root ~]# getenforce
Enforcing # 说明SELinux是启动的
# 随便创建个文件
[root@root ~]# touch tempfile
[root@root ~]# ls -l tempfile
-rw-r--r--. 1 root root 0 Nov 9 19:23 tempfile # 可以看到这个文件的其它组的用户权限后面是有点的
# 接下来,关闭这个 SELinux,然后重新启动系统
# 编辑 /etc/sysconfig/selinux 配置文件
[root@root ~]# vim /etc/sysconfig/selinux
# SELINUX=enforcing
SELINUX=disabled # 将其值修改为:disabled
# 保存退出,重新启动系统.
:wq
reboot
# 重新进入系统后,再来看一下 SELinux 的运行模式
[root@root ~]# getenforce
Disabled
# 然后创建一个文件
[root@root ~]# touch tempfile1
[root@root ~]# ls -l tempfile* # 比较这两个文件:发现一个带点,一个不带点
-rw-r--r--. 1 root root 0 Nov 9 19:23 tempfile
-rw-r--r-- 1 root root 0 Nov 9 19:28 tempfile1
# 再来看看这两个文件的安全上下文有没有什么区别
# ① 关掉 SELinux,查看创建的文件的安全上下文
[root@root ~]# ls -Z tempfile* # 发现:关掉 SELinux 的情况下,创建的文件没有安全上下文,也就没有这个点.
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 tempfile
-rw-r--r-- root root ? tempfile1
# ② 开启 SELinux,重启系统,查看创建的文件的安全上下文
[root@root ~]# ls -Z tempfile* # 重启后发现:tempfile1 文件的其它组的用户权限,后面自动多了一个点.,也自动加上安全标签
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 tempfile
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 tempfile1
Linux 的文件或目录权限,有rwx三种
r(Read,读取,4
):文件,具有 读取
、查看
文件内容的权限;目录,具有 读取
、查看
目录内容的权限。
w(Write,写入,2
):文件,具有新增
、修改
文件内容的权限,若要删除该文件,前提是对该文件所在的目录有w权限,否则,不可以删除该文件
;目录,具有新建
、删除
、修改
、重命名/移动
目录内文件的权限。
x(eXecute,执行,1
):文件,具有 执行
文件的权限;目录,具有 进入
目录的权限。
-:没有权限
小结一下
# rwx作用到文件
1) [ r ]代表可读(read): 可以读取,查看
2) [ w ]代表可写(write): 可以修改,但不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件
3) [ x ]代表可执行(execute):可以被执行
# rwx作用到目录
1) [ r ]代表可读(read): 可以读取,ls查看目录内容
2) [ w ]代表可写(write): 可以修改,目录内创建 + 删除 + 重命名目录
3) [ x ]代表可执行(execute):可以进入该目录
如果还没弄明白,再看一下面,或许会有更进一步的了解,明白了,就跳过。
linux ls -l 详解
以root的家目录为例:
可以看到,用 ls -l
命令查看某一个目录会得到一个7
个字段的列表。
第1行:总计(total)
Total后面的数字是指当前目录下所有文件所占用的空间总和。可以使用ls –hl
查看,也可使用ls –ahl
查看。
第1字段: 文件属性字段
-rw-r--r-- 1 root root 762 07-29 18:19 exit
文件属性字段总共有10个字母组成;第一个字符代表文件的类型。
字母**“-”**表示该文件是一个普通文件
字母**“d”**表示该文件是一个目录,字母"d",是dirtectory(目录)的缩写
**注意:**目录或者是特殊文件,这个特殊文件存放其他文件或目录的相关信息
字母**“l”**表示该文件是一个链接文件。字母"l"是link(链接)的缩写,类似于windows下的快捷方式
字母**“b”**的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)
字母为**“c”**表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节。
字母为**“p”**表示该文件为命令管道文件。与shell编程有关的文件。
字母“s”表示该文件为sock文件。与shell编程有关的文件。
在此重申下文件链接这个重要概念:
链接文件的概念类似于windows里的快捷方式。多个链接文件同时指向一个“源文件”。链接文件分为硬链接或符号链接两种。
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号inode 。软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软连接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)
硬连接是不会建立inode的,他只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个inode,当然inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息。一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除源文件的时候,系统调用会检查inode link count的数值,如果他大于等于1,那么inode不会被回收,因此文件的内容不会被删除,相当于删除了一个索引。
硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
软链接可以跨文件系统,硬链接不可以;软链接可以对一个不存在的文件名(filename)进行链接(当然此时如果你vi这个软链接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在);软链接可以对目录进行连接,硬链接不可以。两种链接都可以通过命令 ln 来创建。ln 默认创建的是硬链接。使用 -s 开关可以创建软链接
第1字符的后面9个字母表示该文件或目录的权限位。
r表是读 (Read) 、w表示写 (Write) 、x表示执行 (eXecute)
其中前三个表示文件拥有者的权限,中间三个表示文件所属组拥有的权限,最后三个表示其他用户拥有的权限。
比如:
-rw-r--r-- 1 root root 762 07-29 18:19 exit
表示文件的拥有者root对文件有读写权限,其他人(同组用户和其他用户只有读的权限)
另外,权限组还有一些特殊的表示法:
[root@localhost ~]# ll /usr/X11R6/bin/XFree86
-rws--x--x 1 root root 1960262 2003-02-28 /usr/X11R6/bin/XFree86
s表示这个是网络接口程序"s"是socket的缩写。该程序在运行过程中会打开一个网络接口。
其他UNIX类系统如FreeBSD中还有t权限,表示一个临时(temporary)文件
#ls -l /tmp可以看到这样的权限:drwxrwxrwt 它的最后一位是字母"t"
第2字段:文件硬链接数
-rw-r--r-- 1 root root 762 07-29 18:19 exit
如果一个文件不是目录,此时这一字段表示这个文件所具有的硬链接数,
第2字段的值为1,说明这个文件只有exit这一个文件名。即只有一个指向该链接的硬链接。。
如果使用ln,做一个指向该文件的硬链接再查看该文件,该文件的第2字段就会变成2
此时exit 和aexit称为互为硬链接。他们指向同一个文件,无论是修改哪一个文件,另一个里也做相应的变化,因为实际上他们指向同一个文件(即同一文件的不同文件名)
互为硬链接的文件具有相同的文件节点。
可以看出,这两个文件具有相同的文件节点号:162302
可以设置符号链接(软链接),格式如下
Ln –s 源文件 目标链接文件
注意:软链接时文件节点号不一样;
如果知道一个文件有多个文件名(链接文件)如何查找他的其他文件名分布在什么地方呢?
可以先用 ls -i
获得它的节点号,然后用find查找,如 /etc/sysconfig/networking/ifcfg-eth0
就具有多个文件名,要查找与它互为硬链接的文件
得到它的节点号为 452946
再用find查找:
这样就得到了同一个文件的不同文件名的位置。
第2字段: 链接占用的节点
lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit
该字段文件占用一个节点,属于软链接(符号链接)
如果是一个目录,则第2字段表示该目录所含子目录的个数。
新建一个空目录,这个目录的第二字段就是2,表示该目录下有两个子目录。为什么新建的目录下面会有两个子目录呢?
因为每一个目录都有一个指向它本身的子目录"。" 和指向它上级目录的子目录"。。",这两个默认子目录是隐藏的。ls -a可以看到
每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加。
第3字段:文件(目录)拥有者
lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit
该字段表示此文件是属于哪个用户。linux类系统都是多用户系统,每个文件都有它的拥有者。只有文件的拥有者才具有改动文件属性的权利。当然, root用户具有改动任何文件属性的权利。对于一个目录来说,只有拥有该目录的用户,或者具有写权限的用户才有在目录下创建文件的权利
如果某一个用户因为某种原因,被删除,而该用户的文件还存在,那么用ls -l 查看该文件将显示一个代表用户存在前ID号的数字。
先创建一个用户test,将其加入wang用户组,并用su切换,使用ls –l查看文件拥有者,随即删除用户test,用root进入test家目录,查看刚刚创建的文件testing。
可以看到,第三字段成了一个数字,这个数字是原test用户的ID号。因为文件系统对每个文件记录文件所有者的ID,而非用户名。
第4字段:文件(目录)拥有者所在的组
lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit
一个用户可以加入很多个组,但是其中有一个是主组,就是显示在第4字段的名称。
可以在useradd的时候用-g指定该用户所在的主组,用-G指定其他组
格式如下:Useradd –g 组名 用户名
第5字段: 文件所占用的空间(以字节为单位)
lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit
第5字段表示文件大小,如果是一个文件夹(目录),则表示该文件夹的大小。请注意是文件夹本身的大小,而不是文件夹以及它下面的文件的总大小。
很多人不能理解文件夹是一个特殊的文件的含义,这样的话理解文件夹大小的含义就比较困难了。
第6字段:文件(目录)最近访问(修改)时间
lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit
文件创建的时间可以通过touch命令来修改。如:
[root@localhost ~]# touch exit
可以把exit的创建时间修改为当前时间,另外,一个文件还有最后访问时间,最后修改时间等属性。
这些属性可以用ls 的其它参数显示出来。
第7字段:文件名
lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit
如果是一个符号链接,那么会有一个 “->" 箭头符号,后面根一个它指向的文件名
通过 chmod
指令,可以修改文件或者目录的权限。
# 使用 + 、-、= 变更权限
u:所有者
g:所在组
o:其它组
a:所有组(u、g、o 的总和)
# 如:
chmod u=rwx,g=rx,o=x 文件或目录名 # 给所有者授予读、写、执行权限,所在组授予读、执行权限,其它组授予执行权限
chmod o+w 文件或目录名 # 给其它组增加写权限
chmod a-x 文件或目录名 # 给所有组减去执行权限
# 通过数字变更权限
r=4
w=2
x=1
rwx=4+2+1=7
# 如:
chmod u=rwx,g=rx,o=x 文件或目录名 # 给所有者授予读、写、执行权限,所在组授予读、执行权限,其它组授予执行权限
chmod 751 文件或目录名 # 相当于 751
使用 root 用户修改
chown newowner file # 改变文件的所有者
chown newowner:newgroup file # 改变用户的所有者和所在组
-R # 如果是目录则使其下所有子文件或目录递归生效
chown -R newowner file # 改变文件的所有者【递归所有子目录】
chown -R newowner:newgroup file # 改变用户的所有者和所在组【递归所有子目录】
使用 root 用户修改
基本语法
chgrp newgroup file # 改变用户的所在组
-R # 如果是目录则使其下所有子文件或目录递归生效
chgrp -R newgroup file # 改变用户的所在组【递归所有子目录】
crond 是工具,是linux的一个定时执行的服务项,可以通过crontab 命令添加或者编辑需要定时执行的任务。
crontab 是一个命令 qs,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。因此,crond的概念和crontab是不可分割的。
crond 与 crontab 详解
crontab是什么?
定时任务软件种类
at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。
crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现
anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未>执行的任务,下次开机时可以补上执行
注:crontab为最常用的定时任务。
crontab工作
运行linux后,开机自启动crond任务,系统会每分钟检查是否有要执行的任务工作(循环检测)默认系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过/etc/cron.allow文件限制权限。
crontab支持两种状态:
a.直接编写计划任务;
b.使用目录的方式,放在目录里面的都会定时执行,定时目录可在/etc/crontab中设定。
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度
和用户任务调度
。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab
文件内容如下:
前四行是用来配置crond任务运行的环境变量。
第一行:SHELL变量指定了系统要使用哪个shell,这里是bash
第二行:PATH变量指定了系统执行命令的路径
第三行:MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
第四行:HOME变量指定了在执行命令或者脚本时使用的主目录
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
使用者权限文件
# 该文件中所列用户不允许使用 crontab 命令
/etc/cron.deny
# 该文件中所列用户允许使用 crontab 命令
/etc/cron.allow
# 所有用户 crontab 文件存放的目录,以用户名命名
/var/spool/cron/
crontab 文件的含义
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段。
# 格式如下:
minute hour day month week command
# 其中:
minute # 表示分钟,可以是从0到59之间的任何整数。
hour # 表示小时,可以是从0到23之间的任何整数。
day # 表示日期,可以是从1到31之间的任何整数。
month # 表示月份,可以是从1到12之间的任何整数。
week # 表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command # 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
# 在以上各个字段中,还可以使用以下特殊字符:
星号(*) # 代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,) # 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-) # 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/) # 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crond 服务
/sbin/service crond start # 启动服务
/sbin/service crond stop # 关闭服务
/sbin/service crond restart # 重启服务
/sbin/service crond reload # 重新载入配置
# 查看 crontab 服务状态
service crond status
# 手动启动 crontab 服务
service crond start
# 查看 crontab 服务是否已设置为开机启动
ntsysv
# 设置为开机自动启动
chkconfig –level 35 crond on
crontab 命令详解
# 命令格式
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
# 命令功能
通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。
# 命令参数
-u user # 用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file # file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e # 编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l # 显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r # 从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i # 在删除用户的crontab文件时给确认提示。
常用方法
创建一个新的crontab文件
在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其中加入这样一行:
EDITOR=vi; export EDITOR
然后保存并退出。不妨创建一个名为 cron的文件,其中是用户名,例如, davecron。在该文件中加入如下的内容。
# (put your own initials here)echo the date to the console every
# 15minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console
# 保存并退出。确信前面5个域用空格分隔。
在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:
$ crontab davecron
现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。
同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。
列出crontab文件
为了列出crontab文件,可以用:
$ crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1
你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:
$ crontab -l > $HOME/mycron
这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。
编辑crontab文件
如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:
$ crontab -e
可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。
我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;
现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。
现在让我们使用前面讲过的crontab -l命令列出它的全部信息:
$ crontab -l
# (crondave installed on Tue May 4 13:07:43 1999)
# DT:ech the date to the console every 30 minites
0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;
删除crontab文件
要删除crontab文件,可以用:
$ crontab -r
恢复丢失的crontab文件
如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/,其中是用户名。如果由于权限问题无法完成拷贝,可以用:
$ crontab <filename>
# 其中,是你在$ H O M E目录中副本的文件名。
建议在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。
有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按,否则你将丢失crontab文件。
使用实例
实例1:每1分钟执行一次command
命令:
* * * * * command
实例2:每小时的第3和第15分钟执行
命令:
3,15 * * * * command
实例3:在上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * * command
**中间有空格,不要忘了
查看 cron 运行日志
看 /var/log/cron.log这个文件就可以,可以用tail -f /var/log/cron.log观察
crontab
进行定时任务的设置
任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类
基本语法
# 定时任务的设置
crontab [选项]
# 设置任务调度文件
/etc/crontab
# 设置个人任务调度
crontab –e
# 接着输入任务到调度文件,如:
*/1 * * * * ls –l /etc/ > /tmp/to.txt # 意思是:每小时的每分钟执行 ls –l /etc/ > /tmp/to.txt 命令
常用选项
选项 | 描述 |
---|---|
-e | 编辑 crontab 定时任务 |
-l | 查询 crontab 任务(列出当前有哪些任务调度) |
-r | 删除当前用户所有的 crontab 任务(终止任务调度) |
5 个占位符
占位符 | 含义 | 范围 |
---|---|---|
第 1 个 * | 一小时当中的第几分钟(minute) | 0 ~ 59 |
第 2 个 * | 一天当中的第几小时(hour) | 0 ~ 23 |
第 3 个 * | 一个月当中的第几天(day) | 1 ~ 31 |
第 4 个 * | 一年当中的第几月(month) | 1 ~ 12 |
第 5 个 * | 一周当中的星期几(week) | 0 ~ 7(0 和 7 都代表星期日) |
特殊符号
特殊符号 | 含义 |
---|---|
* | 代表任何时间。如:第一个 *,代表一小时中每分钟都执行一次命令。 |
, | 代表不连续的时间。如:0 8,12,16 * * * 命令,代表在每天的8点0分,12点0分,16点0分都执行一次命令 |
- | 代表连续的时间范围。如:0 5 * * 1-6 命令,代表在周一到周六的凌晨5点0分执行命令 |
*/n | 代表每隔多久执行一次。如:* /10 * * * * 命令,代表每隔10分钟就执行一遍命令 |
特定时间执行任务案例
时间 | 含义 |
---|---|
45 22 * * * 命令 | 在22点45分执行命令 |
0 17 * * 1 命令 | 每周1的17点0分执行命令 |
0 5 1,15 * * 命令 | 每月1号和15号的凌晨5点0分执行命令 |
40 4 * * 1-5 命令 | 每周一到周五的凌晨4点40分执行命令 |
*/10 4 * * * 命令 | 每天的凌晨4点,每隔10分钟执行一次命令 |
0 0 1,15 * 1 命令 | 每月1号和15号,每周1的0点0分都会执行命令。 注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。 |
案例 1:每隔1分钟,就将当前的日期信息,追加到 /root/temptask/datelog 文件中
# 创建一个目录,用于存放执行脚本后,产生的文件,如:mkdir /root/temptask
mkdir /root/temptask
# 编写一个 shell(脚本) 文件
vim /root/datetask1.sh
# 编写命令(要执行的任务,即真正要干的事),如下:
date >> /root/temptask/datelog # 将当前的日期信息,追加到 /root/temptask/datelog 文件中
:wq # 保存退出
# 授予 datetask1.sh 可执行权限
chmod 744 datetask1.sh
# 编辑 crontab 定时任务
crontab -e
# 调用脚本,内容如下:
*/1 * * * * /root/datetask1.sh # 每隔1分钟执行 /root/datetask1.sh 脚本
:wq # 保存退出
案例 2:每隔1分钟,将当前日期和日历都追加到 /root/temptask/datelog2 文件中
# 创建一个目录,用于存放执行脚本后,产生的文件,如:mkdir /root/temptask
mkdir /root/temptask
# 编写一个 shell(脚本) 文件
vim /root/datetask2.sh
# 编写命令(要执行的任务,即真正要干的事),如下:
date >> /root/temptask/datelog2 # 将当前的日期信息,追加到 /root/temptask/datelog2 文件中
cal >> /root/temptask/datelog2 # 将当前的日历信息也追加进去
:wq # 保存退出
# 授予 datetask2.sh 可执行权限
chmod 744 datetask2.sh
# 编辑 crontab 定时任务
crontab -e
# 调用脚本,内容如下:
*/1 * * * * /root/datetask2.sh # 每隔1分钟执行 /root/datetask2.sh 脚本
:wq # 保存退出
案例 3: 每天凌晨 2:00 将 mysql 数据库 testdb ,备份到文件 /root/temptask/myqldb.bak 中。
# 创建一个目录,用于存放执行脚本后,产生的文件,如:mkdir /root/temptask
mkdir /root/temptask
# 编写一个 shell(脚本) 文件
vim /root/mysqldbtask.sh
# 编写命令(要执行的任务,即真正要干的事),如下:【改为自己要备份的mysql登录用户和密码即可】
/usr/local/mysql/bin/mysqldump -u mysql用户 -pmysql密码 testdb >> /root/temptask/myqldb.bak # 将当前的日期信息,追加到 /root/temptask/myqldb.bak 文件中
:wq # 保存退出
# 授予 mysqldbtask.sh 可执行权限
chmod 744 mysqldbtask.sh
# 编辑 crontab 定时任务
crontab -e
# 调用脚本,内容如下:
0 2 * * * /root/mysqldbtask.sh # 每隔1分钟执行 /root/mysqldbtask.sh 脚本
:wq # 保存退出
与前面同理,就不再截图雷同说明
# crond 相关命令
conrtab –r # 终止任务调度。
crontab –l # 列出当前有那些任务调度
service crond restart # 重启任务调度
计算机 - 管理
win 7
win 10
这里在分区时,都分为主分区了,并未创建逻辑分区,所以,这里看不到逻辑分区。
图解说明
# 查看当前系统分区和挂载的情况
lsblk # 可以查看分区大小
lsblk -f # 较详细些
案例:以增加一块硬盘(以 2G 为例),并挂载到 /home/newdisk 为例,来熟悉磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念。
如何增加一块硬盘
1.虚拟机添加硬盘
点击虚拟机 --> 设置
选择磁盘,点击添加
选择硬盘,点击下一步
选择 SCSI(S),点击下一步
点击创建新虚拟磁盘(V),点击下一步
以 2G 为例演示,点击下一步
保持默认,点击完成
点击确定
# 重启系统【
reboot
重启系统前
重启系统后
2.分区
开始分区后输入n,新增分区,然后选择p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q。
# 给磁盘分区
fdisk 分区目录
# 如
fdisk /dev/sdb
3.格式化
# 格式化磁盘
mkfs [选项] 分区类型 分区目录
# 如:(ext4:分区类型)
mkfs -t ext4 /dev/sdb1
4.挂载
# 先创建将要挂载到系统的目录,如
mkdir /home/newdisk
# 临时挂载【重启系统,挂载关系会失效】
mount 设备名称 挂载目录
mount /dev/sdb1 /home/newdisk # 如,将 /dev/sdb1 挂载到 /home/newdisk 目录下
# 永久挂载【重启系统,挂载关系仍在】
vim /etc/fstab # 编辑 /etc/fstab 记录分区及挂载点的配置文件
:wq # 保存退出
mount –a # a:auto(自动挂载的意思),执行后永久挂载生效,即使以后重启系统,这个挂载关系仍然自动成立
# 卸载(取消挂载)
umount 设备名称或挂载目录
# 如:
umount/dev/sdb1 或 umount/newdisk
【临时挂载】
【永久挂载】
永久挂载关系仍然成立,挂载成功
# 查询系统整体磁盘使用情况
df -l
df -h
df -lh
# 查询指定目录的磁盘占用情况
du -h 查询目录/路径 # 默认为当前目录
-s # 指定目录占用大小汇总
-h # 带计量单位
-a # 含文件
--max-depth=1 # 子目录深度(几级子目录,1:最大深度 1 级子目录,2:最大深度为 2 级子目录,...)
-c # 列出明细的同时,增加汇总值
# 如:查询 /usr 目录及其下面1级子目录(含文件)的磁盘使用情况(列出明细并目录大小汇总)
du -ach --max-depth=1 /usr
# 1) 统计 /root 目录下文件的个数
ls -l /root | grep "^-" | wc -l # ^:定位符 -:文件类型 wc:统计数量,先列所有文件与目录出来,再过滤,保留只含文件类型,最后统计数量
# 2) 统计 /root 目录下子目录的个数
ls -l /root | grep "^d" | wc -l
# 3) 统计 /root 目录下文件的个数,包括子目录里的
ls -lR /root | grep "^-" | wc -l
# 4) 统计目录下目录的个数,包括子目录里的
ls -lR /root | grep "^d" | wc -l
# 5) 以树状显示 /root 目录结构
# 先安装一下tree
yum -y install tree
# 以树状显示 /root 目录结构
tree /root # 显示指定目录的树状结构
tree # 默认显示当前目录的树状结构
默认配置的 NAT 模式网络环境
编辑 --> 虚拟网络编辑器
选择VMnet8 --> 修改虚拟网卡的 IP 地址,修改子网 IP(根据自己实际需求决定是否需要修改) --> 应用,确定即可
选择 VMnet8 --> NAT 设置
自定义网关,确定即可
# 进入 DOS 命令窗口
win + R,输入cmd,回车(Enter)
# 查看网络配置
ipconfig
任务栏右键网络图标 --> 打开"网络和 Internet"设置
点击更改适配器选项
选择 VMnet8 适配器 --> 右键 --> 点击属性
双击 IPv4
自定义配置 IP地址、子网掩码、网关、DNS,配置好确定即可
# 测试主机之间网络连通性(Linux ping windows,反之也可以)
ping 主机ip地址 # 测试当前服务器是否可以连接目的主机
ping 网关
ping 外网
# 如:(都没问题就OK了)
ping 192.168.2.18
ping 192.168.155.255
ping baidu.com
以 ping 外网为例,ping 通了结果一样(不丢数据包即可),就不一一雷同截图了
登陆后,通过界面来设置自动获取 ip
或者 /etc/sysconfig/network-scripts/ifcfg-xxx
网络配置文件为非静态的,未配置静态 IP、网关、DNS等
这种配置方式:
直接修改配置文件来指定IP,并可以连接到外网(xxx工程师推荐),编辑 vim /etc/sysconfig/network-scripts/ifcfg-xxx
网络配置文件
# 示例:将 ip 地址配置的静态的,ip 地址:192.168.155.29
# 编辑 vim /etc/sysconfig/network-scripts/ifcfg-xxx 网络配置文件
vim /etc/sysconfig/network-scripts/ifcfg-xxx # ifcfg-后面名称有些是eth0、ens33...,配置都是一样的
# 修改配置内容,如下:【除了要修改配置的几个参数,其它无需修改或配置】
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 修改为静态 IP 的方式
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens33
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DEVICE=ens33
ONBOOT=yes # 配置系统启动时,网络接口有效(yes)
IPADDR=xxx.xxx.xxx.xxx # 修改静态 IP
NETMASK=255.255.255.0 # 配置子网掩码
PREFIX=24 # 配置子网掩码长度
GATEWAY=xxx.xxx.xxx.xxx # 配置网关
DNS1=xxx.xxx.xxx.xxx # 配置 DNS
IPV6_PRIVACY=no
# 重启网络服务或者重启系统生效
service network-manager restart # 方式①:重启网络服务生效【CentOS 7.x 及其以下】
nmcli c reload # 方式①:重启网络服务生效【CentOS 8.x 】
service networking restart # 方式①:重启网络服务生效【Kali Linux(Debian)】
reboot # 方式②:重启系统失效
# 用 ip addr 或 ifconfig 查看配置的 ip 情况
ip addr # 系统自带
ifconfig # 需要安装 net-tools,即:yum -y install net-tools
# 测试是否配置网络成功【ping 通了表示网络配置成功】
ping 宿主机ip # ping windows 本机ip
ping 网关 # ping linux 配置的网关
ping 外网 # ping baidu.com 外网如:百度、腾讯等都可以
# ===================== 重启网络服务,报错小提示 =====================
# 【解决报错】Failed to restart network.service: Unit network.service not found.
# 问题描述:使用systemctl restart network 或 service network restart 命令重启网卡失败。
# 简要分析:命令用得不对,导致找不到相应的网卡服务。
# 解决方法:
service network-manager restart # 方式①:重启网络服务生效【CentOS 7.x 及其以下】
nmcli c reload # 方式①:重启网络服务生效【CentOS 8.x 】
service networking restart # 方式①:重启网络服务生效【Kali Linux(Debian)】
reboot # 方式②:重启系统失效
# 指定主机名与 IP 地址
# /etc/hosts
# 常用来存放设备名到IP地址的映射,格式:IP地址 主机名。
# 使用/etc/hosts存放的映射是本机的映射,需要在每台主机上维护。
# 常常用来存放在启动时需要的映射信息:默认网关、主机本身、域名服务器
[root@root ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.170.130.1 root
# 在 /etc/sysconfig/network-scripts/ifcfg-xxx 对网卡的配置文件进行永久性配置
# eth和ens的区别
一个是真实物理网卡,一个是虚拟网络会话,两者之间的关系就是一个真实物理网卡上可以绑定多个虚拟网络会话。eth0是真实物理网卡,ens33是虚拟网络会话。
# 所有可能出现的内容
示例:
[root@root ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=0cad6372-6ae7-4163-b24e-b24b53e54964
DEVICE=ens33
ONBOOT=yes
# 网卡类型,一般是Ethernet,还有其他的如bond,bridge
TYPE=Ethernet
# 获取IP地址的方式,启动的协议,获取配置的方式。
# dhcp表示动态获取
# static或none表示静态手工配置,若想使用本地配置好的IP则应该设置成这个
BOOTPROTO=dhcp
# 是否设置默认路由,yes表示该配置
# 若为yes则可以在该文件通过IPADDR和PREFIX两个参数来设置网关
DEFROUTE=yes
# dns服务器可以在该文件(网卡的配置文件)中设置,也可以在/etc/resolv.conf中设置。
# 若该选项指定为yes,则表示网络启动后加载的dns服务器的位置是从/etc/resolv.conf读取。(大多情况下就在这里设置)
# 若该选项指定为yes,则表示网络启动后加载的dns服务器的位置该文件内的DNS参数,而不是/etc/resolv.conf文件。
PEERDNS=yes
# IP地址相关配置
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
# 这个参数对应的值是网卡名,是给用户看的
NAME="ens33"
# UUID由以下几部分的组合:
# 当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
# 时钟序列。
# 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
# 通用唯一识别码,若vmware克隆的虚拟机无法启动网卡可以去除此项
UUID=0cad6372-6ae7-4163-b24e-b24b53e54964
# 系统逻辑设备名
DEVICE=ens33
# 开机启动时是否激活网卡设备
# centos7装完网卡后默认设置成no
ONBOOT=yes
# 以太网硬件地址,mac地址(hardware)。若是vmware克隆的虚拟机无法启动网卡,也要改这个
HWADDR
# 是否通过NetworkManager管理网卡设备
NM_CONTROLLED=yes
# 设置网卡对应的IP地址,网络服务启动,网卡激活后会自动将该地址配置到网卡上
# 不用dhcp的方式拿ip地址的时候指定这个才有意义(BOOTPROTO=static)
IPADDR
# 子网掩码长度
# 不要这么写PREFIX=255.255.255.0
PREFIX=24
# 该网卡配置的IP对应的网关(默认路由)
# 若主机是多网卡设备,该参数只能在一个网卡的配置文件里面出现,也就是说一台机只有一个默认路由
GATEWAY=192.170.130.1
# 主DNS,若这里设置了值,则会优先于/etc/resolv.conf中设置的DNS服务器的地址
# 不建议使用该参数,一般dns都是需要主机全局生效的,所以放在/etc/resolv.conf更加方便批量管理网卡
# 需要和“PEERDNS=no”配合使用
DNS1="192.170.0.5"
# 次dns,若这里设置了则会优先于/etc/resolv.conf中设置的DNS服务器的地址
# 需要和“PEERDNS=no”配合使用
DNS2="192.170.0.6"
# 生产环境中一般用这种方式指定子网掩码
NETMASK=255.255.255.0
# USERCTL=yes/no 是否允许非root用户控制该设备
USERCTL=no
ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数.
# ps 显示系统进程执行的进程
ps
ps -a # 显示当前终端的所有进程信息
ps -e # 显示所有进程
ps -f # 以全格式显示系统进程
ps -u # 以用户的格式显示进程信息
ps -x # 显示后台进程运行的参数
ps -aux # 以用户的格式显示当前系统所有进程信息
ps -aux | more # 以用户的格式分页显示当前系统所有进程信息
ps -aux | grep 具体进程名称 # 查看具体某个进程的信息,进程名称:如:systemd、sshd...
ps -ef | more # 以全格式显示当前系统所有的进程,即查看进程的父进程
ps -ef | grep 具体进程名称 # 查看具体某个进程的父进程信息
ps 显示的信息选项
ps 显示的字段 | 描述 |
---|---|
PID | 进程识别号 |
TTY | 终端机号 |
TIME | 此进程所消耗 CPU 时间 |
CMD | 正在执行的命令或进程名 |
ps -aux | more 详解
# 进程的状态【补注】:
S:睡眠
s:该进程是会话的先导进程
N:进程用有比普通优先级更低的优先级
R:正在运行
D:短期等待
Z:僵死进程
T:被跟踪或被停止进程
...
ps -aux | more 显示的字段 | 描述 |
---|---|
USER | 用户名称 |
PID | 进程号,进程 ID |
PPID | 父进程 ID【为了跟 PID 对应,方便理解,所以,放在此处:ps -ef | more 可以查看父进程的信息】 (0:没有父进程,其它数字:分别指向对应的父进程 ID) |
%CPU | 进程占用 CPU 的百分比 |
%MEM | 进程占用物理内存的百分比 |
VSZ | 进程占用的虚拟内存大小(单位:KB) |
RSS | 进程占用的物理内存大小(单位:KB) |
TTY | 使用的终端名称,缩写TT(?:隐藏) |
STAT | 进程的状态 |
START | 进程的启动时间 |
TIME | 执行进程总计占用 CPU 总时间 |
COMMAND | 启动进程时所用的命令和参数,若过长会截断显示 |
ps -aux | grep 进程名称
ps -eff | more 详解
# CPU 用于计算执行优先级的因子【补注】:
数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;
数值越小,表明进程是 I/O 密集型运算,执行优先级会提高.
ps -ef more 显示的字段 | 描述 |
---|---|
UID | 用户 ID |
PID | 进程 ID |
PPID | 父进程 ID |
C | CPU 用于计算执行优先级的因子。 |
STIME | 进程启动的时间 |
TTY | 使用的终端名称,缩写TT(?:隐藏) |
TIME | 执行进程总计占用 CPU 总时间 |
CMD | 启动进程所用的命令和参数,过长会截断显示 |
ps -ef | grep 具体进程名称
Linux 三种风格(Unix、BSD、GNU)下的 ps 参数说明
Linux 系统中使用 GNU ps 命令支持 3 种不同类型的命令行参数:
Unix 风格
参数 | 描述 |
---|---|
-A | 显示所有进程 |
-N | 显示与指定参数不符的所有进程 |
-a | 显示除控进程(session leader①)和无终端进程外的所有进程 |
-d | 显示除控进程外的所有进程 |
-e | 显示所有进程 |
-C cmdlist | 显示包含在 cmdlist 列表中的进程 |
-G grplist | 显示组 ID 在 grplist 列表中的进程 |
-U userlist | 显示属主的用户 ID 在 userlist 列表中的进程 |
-g grplist | 显示会话或组 ID 在grplist 列表中的进程① |
-p pidlist | 显示 PID 在 pidlist 列表中的进程 |
-s sesslist | 显示会话 ID 在 sesslist 列表中的进程 |
-t ttylist | 显示终端 ID 在 ttylist 列表中的进程 |
-u userlist | 显示有效用户 ID 在 userlist 列表中的进程 |
-F | 显示更多额外输出(相对 -f 参数而言) |
-O format | 显示默认的输出列以及 format 列表指定的特定列 |
-M | 显示进程的安全信息 |
-c | 显示进程的额外调度器信息 |
-f | 显示完整格式的输出 |
-j | 显示任务信息 |
-l | 显示长列表 |
-o format | 仅显示有 format 指定的列 |
-Y | 不要显示进程标记(process flag,表明进程状态的标记) |
-Z | 显示安全标签(security context)①信息 |
-H | 用层级格式来显示进程(树状,用来显示父进程) |
-n namelist | 定义了 WCHAN 列显示的值 |
-w | 采用宽输出模式,不限宽度显示 |
-L | 显示进程中的线程 |
-V | 显示 ps 命令的版本号 |
其中 -f 显示的完整格式输出信息有:
-l 输出的信息还会增加一些:
BSD 风格
参数 | 描述 |
---|---|
T | 显示跟当前终端关联的所有进程 |
a | 显示跟任意终端关联的所有进程 |
g | 显示所有的进程,包括控制进程 |
r | 仅显示运行中的进程 |
x | 显示所有的进程,甚至包括未分配任何终端的进程 |
U userlist | 显示归 userlist 列表中某用户 ID 所有的进程 |
p pidlist | 显示 PID 在 pidlist 列表中的进程 |
t ttylist | 显示所有关联的终端在 ttylist 列表中的进程 |
O format | 除了默认输出的列之外,还输出由 format 指定的列 |
X | 按过去的 Linux i386 寄存器格式显示 |
Z | 将安全信息添加到输出中 |
j | 显示任务信息 |
l | 采用长模式 |
o format | 仅显示由 format 指定的列 |
s | 采用信号格式显示 |
u | 采用基于用户的格式显示 |
v | 采用虚拟内存格式显示 |
N namelist | 定义在 WCHAN 列中使用的值 |
O order | 定义显示信息列的顺序 |
S | 将数值信息从子进程加到父进程上,比如:CPU 和内存的使用情况 |
c | 显示真实的命令名称(用以启动进程的程序名称) |
e | 显示命令使用的环境变量 |
f | 用分层格式来显示进程,表明哪些进程启动了哪些进程 |
h | 不显示头信息 |
k sort | 指定用以将输出排序的列 |
n | 和 WCHAN 信息一起显示出来,用数值表示用户 ID 和组 ID |
w | 为较宽屏幕显示宽输出 |
H | 将线程按进程来显示 |
m | 在进程后显示线程 |
L | 列出所有格式指定符 |
V | 显示 ps 命令的版本号 |
在BSD风格下的l参数输出的信息基本与Unix一致,但也有一些不一样:
许多系统管理员都喜欢BSD风格的 l 参数。它能输出更详细的进程状态码(STAT列)。双字符状态码能比Unix风格输出的单字符状态码更清楚地表示进程的当前状态。
第一个字符采用了和Unix风格 S 列相同的值,表明进程是在休眠、运行还是等待。第二个参数进一步说明进程的状态。
GNU 风格
GNU的参数是长参数。
参数 | 描述 |
---|---|
–deselect | 显示所有进程,出了命令行中列出的进程 |
–Group grplist | 显示组 ID 在 grplist 列表中的进程 |
–User userlist | 显示用户 ID 在 userlist 列表中的进程 |
–group grplist | 显示有效组 ID 在 grplist 列表中的进程 |
–pid pidlist | 显示 PID 在 pidlist 列表中的进程 |
–ppid pidlist | 显示父 PID 在 pidlist 列表中的进程 |
–sid sidlist | 显示会话 ID 在sidlist 列表中的进程 |
–tty ttylist | 显示终端设备号在 ttylist 列表中的进程 |
–user userlist | 显示有效用户 ID 在 userlist 列表中的进程 |
–format format | 仅显示由 format 指定的列 |
–context | 显示额外的安全信息 |
–cols n | 将屏幕宽度设置为 n 列 |
–columns n | 将屏幕宽度设置为 n 列 |
–cumulative | 包含已停止的子进程的信息 |
–forest | 用层级结构显示出进程和父进程之间的关系 |
–headers | 在每页输出中都显示列的头 |
–no-headers | 不显示列的头 |
–lines n | 将屏幕高度设为 n 行 |
–rows n | 将屏幕高度设为 n 排 |
–sort order | 指定将输出按哪列排序 |
–width n | 将屏幕宽度设为 n 列 |
–help | 显示补注信息 |
–info | 显示调试信息 |
–version | 显示 ps 命令的版本号 |
更多详见《Linux命令行与shell脚本编程大全第3版》
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。
# 终止进程
kill [选项] 进程号 # 通过进程号杀死进程
killall 进程名称 # 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
# 常用选项
-9 # 表示强迫进程立即停止
案例1:踢掉某个非法登录用户(如,这里的 admin 用户)
# kill 非法进程
ps -aux | grep sshd # 查看某个进程的信息
kill 1881 # 根据进程号杀死进程
ps -aux | grep sshd # 再次查看就没有被kill的进程信息
案例2:终止远程登录服务sshd, 在适当时候再次重启sshd服务
kill 1014 # 根据进程号杀死进程
案例3: 终止多个 gedit 编辑器
killall gedit # 根据进程名称杀死所有与它相关的进程,如,杀掉父进程,那该父进程下的所有子进程将全部被终止。
案例4:强制杀掉一个终端 bash
# kill -9 强制杀掉某个进程,因有些进程被认为是重要的,所以,kill被忽略了,因此,需要强制杀掉,才可以终止进程
kill -9 3048
# 查看进程树,需要安装 psmisc,yum -y install psmisc
pstree [选项] # 可以更加直观的来看进程信息
# 常用选项
-p # 显示进程的 PID
-u # 显示进程的所属用户
pstree # 默认以树状的形式显示进程的用户 id
pstree -p # 以树状的形式形式显示进程的 pid
pstree -u # 以树状的形式显示进程的用户 id
# pstree 详解
# pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序。若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用户的所有程序。
# 使用ps命令得到的数据精确,但数据庞大,这一点对掌握系统整体概况来说是不容易的。pstree命令正好可以弥补这个缺憾。它能将当前的执行程序以树状结构显示。pstree命令支持指定特定程序(PID)或使用者(USER)作为显示的起始。
pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>
# 主要参数
-a # 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c # 不使用精简标示法。
-G # 使用VT100终端机的列绘图字符。
-h # 列出树状图时,特别标明执行的程序。
-H<程序识别码> # 此参数的效果和指定"-h"参数类似,但特别标明指定的程序。
-l # 采用长列格式显示树状图。
-n # 用程序识别码排序。预设是以程序名称来排序。
-p # 显示程序识别码。
-u # 显示用户名称。
-U # 使用UTF-8列绘图字符。
-V # 显示版本信息。
服务(service) 本质就是进程,是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如:(mysql、sshd、防火墙等),因此,又称为守护进程。
# 服务:开启、停止、重启、重载、状态,在 CentOS7.0 后,不再使用 service,而是 systemctl
service 服务名 [start | stop | restart | reload | status] # CentOS 7.0 以下
systemctl [start | stop | restart | reload | status] 服务名 # CentOS 7.0 以上
# 【两种方式,任一即可】
# ================= 方式① firewalld =================
# 自带【无需安装】
# 查看防火墙状态
sudo systemctl status firewalld
# 查看已开放的端口(ports)
sudo firewall-cmd --list-all
# 添加目标端口到防火墙(防火墙关闭就不用配置了)
sudo firewall-cmd --add-port=3306/tcp --permanent # 如:3306 端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent # 如:8080 端口
# 参数
--zone # 作用域
--add-port=8080/tcp # 添加端口,格式为:端口/通讯协议
--permanent # 永久生效,没有此参数重启后失效,不会永久生效
# 重启防火墙
sudo firewall-cmd --reload
# 关闭防火墙
# ① 临时关闭
sudo systemctl stop firewalld
# ② 永久关闭,reboot后生效
sudo systemctl disable firewalld
# 查看当前所有 tcp 端口
sudo netstat -ntlp # 查看当前所有 tcp 端口
sudo netstat -ntulp | grep 3306 # 查看具体 3306 端口的使用情况
# ================= 方式② iptables 方式 =================
# 【需要安装】iptables-services
yum -y install iptables-services
# 启动 iptables
systemctl status iptables # 状态
systemctl enable iptables # 开机自启
systemctl disable iptables # 禁用开机自启
systemctl start iptables # 开启
systemctl stop iptables # 停止
systemctl restart iptables # 重启
# windows cmd 窗口查看某个 Linux 端口是否在监听,且可以访问
win+R,输入 cmd
telnet ip port
# 如:
telnet 192.133.167.23 3306
可能会报错:‘telnet’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
原因:系统中的 telnet 客户端是关闭状态。即:Win10 默认没有安装 telnet 功能。
解决方法:进入控制面板 --> 程序(或 程序和功能) --> 启用或关闭Windows功能 --> 勾选Telnet客户端 --> 确定,打开系统中的 telnet 客户端,即可
# 进入控制面板
按 win 徽标键,输入 control(或 控制面板),打开(或 回车)
# 找到程序和功能
点击 程序和功能
# 启用或关闭 Windows 功能
点击 启用或关闭 Windows 功能
# 勾选 Telnet Client,默认未勾选
勾选 Telnet Client
# 勾选确定后,再次测试 telnet 192.133.167.23 3306
telnet 192.133.167.23 3306
# 查看系统服务【防火墙配置、键盘配置、网络配置、系统服务、验证配置】(*:自启动,按空格键取消自启动)
setup
# 可能会报错:-bash: setup: command not found,说明没有安装 setuptool 软件(因是 Minimal 安装模式)
# 解决方法:安装 setuptool(setuptool 软件)、ntsysv(系统服务管理)、system-config-securitylevel-tui(setup 中的防火墙设置)、system-config-network-tui(setup中配套的网络设置)、system-config-date(时区)、authconfig-gtk(setup 工具配套的 authconfig-gtk)、system-config-keyboard(setup 工具配套的键盘配置组件)
yum -y install setuptool ntsysv system-config-securitylevel-tui system-config-network-tui system-config-date authconfig-gtk system-config-keyboard
# 设置 setup 为中文,设置好后重启系统。
echo LANG="zh_CN.UTF-8" > /etc/sysconfig/i18n
echo SUPPORTED="zh_CN.UTF-8:zh_CN:zh" >> /etc/sysconfig/i18n
echo SYSFONT="latarcyrheb-sun16" >> /etc/sysconfig/i18n
reboot # 重启系统
# setup 命令中,若防火墙配置选项无法打开,出现错误
# 解决方法:安装 system-config-firewall、system-config-firewall-tui dbus eggdbus,并开启 messagebus 服务
yum -y install system-config-firewall system-config-firewall-tui dbus eggdbus && service messagebus start
# 查看系统服务
ll /etc/init.d/ # CentOS 7.0 以下
systemctl # CentOS 7.0 以上
# init 已被 systemd 取代
# 输入 ll /etc/init.d/ 或 ll /etc/rc.d/init.d/,里面有个 README 文档,其内容如下:
You are looking for the traditional init scripts in /etc/rc.d/init.d,
and they are gone?
Here's an explanation on what's going on:
You are running a systemd-based OS where traditional init scripts have been replaced by native systemd services files. Service files provide very similar functionality to init scripts. To make use of service files simply invoke "systemctl", which will output a list of all currently running services (and other units). Use "systemctl list-unit-files" to get a listing of all known unit files, including stopped, disabled and masked ones. Use "systemctl start foobar.service" and "systemctl stop foobar.service" to start or stop a service, respectively. For further details, please refer to systemctl(1).
Note that traditional init scripts continue to function on a systemd system. An init script /etc/rc.d/init.d/foobar is implicitly mapped into a service unit foobar.service during system initialization.
Thank you!
Further reading:
man:systemctl(1)
man:systemd(1)
http://0pointer.de/blog/projects/systemd-for-admins-3.html
https://www.freedesktop.org/wiki/Software/systemd/Incompatibilities
# 翻译
您正在 /etc/rc.d/init.d 中寻找传统的 init 脚本,
他们走了吗?
以下是对正在发生的事情的解释:
您正在运行基于 systemd 的操作系统,其中传统的 init 脚本具有被本机 systemd 服务文件取代。服务文件提供与 init 脚本的功能非常相似。使用服务文件简单地调用"systemctl",它将输出所有当前正在运行的服务(和其他单元)。使用"systemctl list-unit-files" 以获取所有已知单元文件的列表,包括停止,禁用和蒙面的。使用"systemctl 启动foobar.service" 和 "systemctl stop foobar.service" 来启动或停止一个服务,分别。欲知更多详情,请参阅系统控制(1)。
请注意,传统的 init 脚本继续在 systemd 上运行系统。 init 脚本 /etc/rc.d/init.d/foobar 被隐式映射在系统初始化期间进入服务单元 foobar.service。
谢谢!
进一步阅读:
man:systemctl(1)
man:systemd(1)
http://0pointer.de/blog/projects/systemd-for-admins-3.html
https://www.freedesktop.org/wiki/Software/systemd/Incompatibility
至于 systemd 为什么要取代 init
init 进程是 Linux 内核启动的第一个进程,自然也是其他进程的父进程,但是当我们在终端下执行 pstree 命令时,即 以树的形式显示所有进程的层次 时,会发现应该是 init进程 的地方却变成了 systemd。
systemd 简介
systemd 是 linux 系统中最新的初始化系统,systemd 和 ubuntu 中的 upstart 是竞争对手,但是 ubuntu 现在也采用了systemd,其实 systemd 的很多概念都来源于 Mac OC 系统上的 launchd。
systemd 和 init 都由 linux 内核加载运行, 都是系统中第一个进程,PID 永远为 1。
systemd 取代 init 的原因
init:
启动时间长,init是串行(后面有介绍)启动,只有前一个进程启动完,才会启动下一个进程;
启动脚本复杂,init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长;
而且当sysvinit系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行,并且系统必须等待所有的服务都启动就绪后,才允许用户登录,那么它的缺点也就很显而易见了:
某些服务可能在很长一段时间内都没有被使用,比如打印服务在多数服务器上很少被真正使用到。所以说,启动这些服务是没有必要的,浪费资源又浪费时间。
systemd:
按需启动服务,顾名思义,只有当某个服务真正被请求的时候才启动它,当该服务结束,systemd可以关闭它,等待下次需要时再次启动它,减少系统资源消耗;
尽可能启动更少进程,尽可能多的并行启动进程,尽可能减少对shell脚本的利用,减少系统启动等待时间;
串行、并行、并发?,举例说明:
吃饭吃到一半,电话来了,一直吃完了以后才去接,这说明支持串行;
吃饭吃到一半,电话来了,停下来接了电话,接完后继续吃饭,这说明支持并发;
吃饭吃到一半,电话来了,一边打电话,一边吃饭,说明支持并行;
并发的关键是你有处理多个任务的能力,不一定要同时,并行的关键是你有同时处理多个任务的能力
关键在于同时:
并发是轮流的处理多个任务,并行是同时处理多个任务;
结合csapp上的定义:
并发流的思想与流运行的处理器核数或者计算机数无关。如果两个流在时间上重叠,那么它们就是并发的,即使它们是运行在同一个处理器上的;如果两个流并发的运行在不同的处理器核或者计算机上,称为并行流;
此处某些作者的理解是:
并发是在一个cpu上同时(并不是真正的同时,因为cpu在多个程序中切换的时间很短,看起来是同时)跑多个程序; 并行是每一个cpu运行一个程序(同时);
而且systemd采用linux的cgroups跟踪和管理进程的生命周期:
systemd利用了linux内核的特性即cgroups来完成跟踪的任务,当停止服务时,通过查询cgroups,systemd可以确保找到所有的相关进程,从而干净的停止服务。
cgroups已经出现了很久,它主要用来实现系统资源配置管理。当进程创建子进程时,子进程会继承父进程的cgroups,所以无论创建多少子进程,所有的这些相关进程都会属于同一个cgroups,systemd只需要遍历指定的cgroups即可找到所有相关的进程,将它们一一停止即可。
cgroups 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
Linux系统有7种运行级别(runlevel):常用的是级别 3 和 5
# 查看或编辑默认的运行级别
vim /etc/inittab # CentOS 7.0 以下
systemctl get-default # CentOS 7.0 以上,设置运行级别:systemctl set-default TARGET.target
开机流程说明
# 查看所有服务运行级别列表
chkconfig --list # CentOS 7.0 以下
systemctl list-unit-files # CentOS 7.0 以上
# 可能会提示:
Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use 'systemctl list-dependencies [target]'.
# 译文
注意:此输出仅显示 SysV 服务,不包括本机系统服务。 SysV 配置数据可能会被本机覆盖系统配置。
如果要列出 systemd 服务,请使用'systemctl list-unit-files'。
查看针对特定目标使用启用的服务 'systemctl list-dependencies [target]'。
# 查看具体某个服务的运行级别列表
chkconfig 服务名 --list # CentOS 7.0 以下,如:chkconfig sshd --list,效果等同于 chkconfig --list | grep 服务名
chkconfig --list | grep 服务名 # CentOS 7.0 以下,如:chkconfig --list | grep sshd
systemctl list-dependencies 服务名 # CentOS 7.0 以上,如:systemctl list-dependencies sshd
# 修改某个服务在哪个运行级别下是否自启动【chkconfig 重新设置服务自启动或关闭后,需要重启机器 reboot 才能生效】
# on:开启自启动 off:关闭自启动 level:运行级别
chkconfig --level 5 服务名 on/off # CentOS 7.0 以下,如:chkconfig --level 5 sshd off
# enable:开启自启动,disable:关闭自启动
systemctl enable/disable 服务名 # CentOS 7.0 以上,如:systemctl disable sshd
# 开启:Created symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /usr/lib/systemd/system/sshd.service.
# 关闭:Removed /etc/systemd/system/multi-user.target.wants/sshd.service.
top 与 ps 命令很相似。它们都用来显示正在执行的进程。top 与 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的的进程。有点类似于 windows 任务管理器,实时显示运行进程的效果。
# 实时动态监控进程
top [选项]
top -hv | -bcEHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
top # 默认每隔 3 秒,刷新一次
top -u 用户名 # 查看某个用户的实时动态进程信息,如:top -u root
# 常规操作
top # 每隔 3 秒,显式所有进程的资源占用情况
top -d 2 # 每隔 2 秒,显式所有进程的资源占用情况
top -c # 每隔 3 秒,显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 5476 -p 8781 # 每隔 3 秒,显示 pid 为 5476 和 pid 为 8781 的两个进程的资源占用情况
top -d 2 -c -p 4356 # 每隔 2 秒,显示 pid 为 4356 的进程的资源使用情况,并显式该进程启动的命令行参数
常用选项
选项 | 描述 |
---|---|
-d | 指定 top 命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行的命令: |
-i | 使 top 不显示任何闲置或者僵死进程。 |
-p | 通过指定监控进程 ID 来仅仅监控某个进程的状态。 |
快捷键操作
快捷键操作 | 描述 |
---|---|
P | 以 CPU 使用率排序,默认就是此项 |
M | 以内存的使用率排序 |
N | 以 PID 排序 |
q | 退出 top |
[root@root ~]# top
top - 15:10:41 up 5:10, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st
MiB Mem : 3709.4 total, 3093.4 free, 259.4 used, 356.7 buff/cache
MiB Swap: 4032.0 total, 4032.0 free, 0.0 used. 3210.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
922 root 20 0 352120 12976 9160 S 0.7 0.3 0:22.77 vmtoolsd
3344 root 20 0 65432 4444 3792 R 0.7 0.1 0:00.38 top
11 root 20 0 0 0 0 I 0.3 0.0 0:04.46 rcu_sched
3260 root 20 0 0 0 0 I 0.3 0.0 0:04.22 kworker/0:2-events_power_efficient
1 root 20 0 188580 16636 9136 S 0.0 0.4 0:03.23 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
10 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
13 root rt 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
16 root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/1
17 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
18 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/1
20 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-events_highpri
21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2
22 root rt 0 0 0 0 S 0.0 0.0 0:00.04 watchdog/2
23 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/2
24 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/2
26 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/2:0H-events_highpri
27 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/3
[root@root ~]#
# top 详解
# ① 第一部分:任务队列信息(系统概况)
15:10:41 # 当前系统时间
up 5:10 # 当前系统运行时间(从开机到当前)
1 user # 当前登录系统的用户数
load average: 0.00, 0.00, 0.00 # 目前的负载均衡(一般加起来除以3,超过0.7,说明系统有点跑不动了)
# ② 第二部分:进程信息
Tasks # 任务(或进程)
162 total # 进程总数,总共162个
1 running # 正在运行的进程数,1个进程正在运行
161 sleeping # 睡眠的进程数,161个进程正在睡眠
0 stopped # 已停止的进程数,0个进程已停止
0 zombie # 僵死的进程数,0个进程僵死
# ③ 第三部分:CPU 信息
%Cpu(s) # 占用 CPU 空间百分比(%:百分比,s:space)
0.1 us # 用户空间占用 CPU 的百分比,0.1% 被用户空间占用(us:user space)
0.1 sy # 内核空间占用 CPU 的百分比,0.1% 被系统内核占用(sy:sysctl)
0.0 ni # 改变过优先级的进程占用 CPU 的百分比,0.0% 被改变过优先级的进程占用(ni:nice)
99.8 id # 空闲 CPU 百分比,99.8% 被空闲占用(id:idolt)
0.0 wa # 等待输入输出(IO)的 CPU 时间百分比,0.0%被等待输入输出占用(wa:wait)
0.1 hi # 硬中断占用 CPU 的时间百分比,0.1% 被硬件中断占用(hi:Hardware IRQ)
0.0 si # 软中断占用 CPU 的时间百分比,0.0% 被软件中断占用(si:Software Interrupts)
0.0 st # 虚拟机被 hypervisor 偷去的 CPU 时间占用百分比,0.0%被虚拟机占用(st:Steal time)
# ④ 第四部分:内存信息
# 小提示:MiB --> 标准的国际电工委员会(IEC)制定的单位
# KB、KiB、MB、MiB 之间的关系
# MB 等单位,以 10 为底数标示数据大小,MiB 是以 2 为底数标示数据大小;
# 在国际单位制中 TB、GB、MB、KB 是以 1000 进制来计量,而国际电工协会(IEC)拟定 KiB、MiB、GiB 以二进制单位计量,专用于标示 1024 进位的数据大小;即:如:1KB=10^3B=1000B, 1MB=10^6B=1000000B=1000KB,1GB=10^9B=1000000000B=1000MB,而 1KiB=2^10B=1024B,1MiB=2^20B=1048576B=1024KiB。
MiB Mem # 内存使用情况,单位是 MiB(mebibyte):2^20 B(bytes 字节)
3709.4 total # 物理内存总量,总共 3709.4 MiB
3093.4 free # 空闲内存总量,空闲 3093.4 MiB
259.4 used # 已使用的内存总量,已使用 259.4 MiB
356.7 buff/cache # 内核缓存的内存总量,缓存 356.7 MiB
# ⑤ 第五部分:swap 交换区信息
MiB Swap # 交换区使用情况(单位:MiB):2^20 B(bytes 字节)
4032.0 total # 交换区总量,总共 4032.0 MiB
4032.0 free # 空闲交换区总量,空闲 4032.0 MiB
0.0 used # 已使用的交换区总量,已使用 0.0 MiB
3210.5 avail Mem # 缓冲可用的交换区总量,缓冲可用 3210.5 MiB ,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。可用内存=free + buffer + cached
# ⑥ 第六部分:当前运行中的进程详细列表
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID # 进程的ID。
USER # 进程属主的名字。
PR # 进程的优先级。
NI # 进程的谦让度值。
VIRT # 进程占用的虚拟内存总量。
RES # 进程占用的物理内存总量。
SHR # 进程和其他进程共享的内存总量。
S # 进程的状态(D:可中断的休眠状态,R:在运行状态,S:休眠状态,T:跟踪状态或停止状态,Z:僵死状态)。
%CPU # 进程使用的CPU时间比例。
%MEM # 进程使用的内存占可用内存的比例。
TIME+ # 自进程启动到目前为止的CPU时间总量。
COMMAND # 进程所对应的命令行名称,也就是启动的程序名。
# ⑦ 第七部分:拓展
列名 含义
PID # 进程id
PPID # 父进程id
RUSER # Real user name
UID # 进程所有者的用户id
USER # 进程所有者的用户名
GROUP # 进程所有者的组名
TTY # 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR # 优先级
NI # nice值。负值表示高优先级,正值表示低优先级
P # 最后使用的CPU,仅在多CPU环境下有意义
%CPU # 上次更新到现在的CPU时间占用百分比
TIME # 进程使用的CPU时间总计,单位秒
TIME+ # 进程使用的CPU时间总计,单位1/100秒
%MEM # 进程使用的物理内存百分比
VIRT # 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP # 进程使用的虚拟内存中,被换出的大小,单位kb。
RES # 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE # 可执行代码占用的物理内存大小,单位kb
DATA # 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR # 共享内存大小,单位kb
nFLT # 页面错误次数
nDRT # 最后一次写入到现在,被修改过的页面数。
S # 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
COMMAND # 命令名/命令行
WCHAN # 若该进程在睡眠,则显示睡眠中的系统函数名
Flags # 任务标志,参考 sched.h
# 查看系统网络情况
netstat # 查看所有网络服务
-an # 按一定顺序排列输出
-p # 显示哪个进程在调用
netstat -anp | more # 分页查看所有网络服务
netstat -anp | grep sshd # 查看某个具体的网络服务
# ping 是一种网络检测检测工具,它主要是用检测远程主机是否正常,或是两部主机间的介质是否为断、网线是否脱落或网卡故障。
ping IP地址 # ping 对方 ip 地址【或 域名】,如:ping 176.123.16.21、ping baidu.com
一种用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中。它生成具有.RPM
扩展名的文件。RPM 是 RedHat Package Manager
(RedHat 软件包管理工具)的缩写,类似 windows 的 setup.exe,这一文件格式名称虽然打上了 RedHat 的标志,但理念是通用的。
Linux 的分发版本都有采用(suse、redhat、centos 等等),可以算是公认的行业标准了。
# 查询已安装的 rpm 列表
rpm –qa | grep 软件包名 # 查看指定软件的 rpm 软件包
# 如:查看是否有已安装 kenel 内核相关的软件
rpm -qa | grep kernel
rpm -qa # 查询已安装的所有 rpm 软件包
rpm -qa | more # 分页显示已安装的所有 rpm 软件包
rpm -qa | grep 软件包名 # 查看指定软件的 rpm 软件包,如:rpm -qa | grep firefox
rpm -q 软件包名 # 查询是否已安装指定的软件包,如:rpm -q firefox
rpm -qi 软件包名 # 查询软件包信息,如:rpm -qi filefox
rpm -ql 软件包名 # 查询软件包中的文件,如:rpm -ql firefox
rpm -qf 文件全路径名 # 查询文件所属的软件包,如:rpm -qf /etc/passwd、rpm -qf /root/install.log
# 卸载指定的 RPM 包
rpm -e 软件包名 # 如:rpm -e firefox
# 可能遇到问题:如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
# 报错描述:removing these packages would break dependencies:xxx is needed by xxx
# 解决方法:① 放弃删除 ② 强制删除:增加参数--nodeps ,强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行
rpm -e --nodeps 软件包名 # 强制删除(不管依赖的软件包)指定的软件包
桌面版、图形化界面,默认已安装的 RPM 包位置在 /media/xxx Final/Packages
里面(前提:需要挂载 CentOS 的 iso 镜像文件,安装系统时,有勾选安装一些常用软件),最小化安装模式的系统,/media
里面没有任何包文件
# 安装指定的 RPM 包
rpm -ivh 软件包名 # i:install(安装),v:verbose(提示),h:hash(进度条),如:rpm -ivh xxx.rpm
Yum 是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
前提:要求可以联网
# 查询 yum 服务器是否有需要安装的软件
yum list|grep 软件包名
# 安装指定的软件包
yum install 软件包名 # 默认安装 yum 服务器上最新版本的软件、相关依赖,有更新或升级时,会提示
# 卸载指定的软件包
yum remove 软件包名
1.先将软件通过 xftp7 上传到自定义目录下(使用其它上传方式也可以,但试了一下,xftp 7 上传挺快的,也不会有什么乱码等问题,所以,就使用它了)
2.解压缩到 /opt 路径下
# 切到上传的压缩软件包路径
cd /home/software
# 列出所有包
ll
# 解压 jdk 压缩包至 /opt 路径下
tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /opt
3.配置环境变量
# 修改配置文件
vim /etc/profile
# 内容修改如下(一般追加在末尾):
JAVA_HOME=/opt/jdk-17.0.1 # JAVA_HOME
PATH=/opt/jdk-17.0.1/bin:$PATH # PATH 路径
export JAVA_HOME PATH # 输出变量,使环境变量生效
# 保存退出
:wq
4.注销用户,使环境变量生效。
# 注销用户,重新登录即可
logout
# 或者 重启脚本,随便哪个都可以
source /etc/profile # 重启脚本
5.测试环境变量是否配置成功
# 测试环境变量是否配置成功
java -version
javac
java
编写一个简单的 HelloWorld.java,输出 “hello,world!”
# 编写一个 HelloWorld.java 测试文件
vim HelloWorld.java
// 内容如下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
# 编写好后,保存退出
:wq
# 编译一下 HelloWorld.java 文件,产生 .class 文件
javac HelloWorld.java
# 运行一下
java HelloWorld
1.解压缩到 /opt 路径下
# 解压 tomcat 压缩包至 /opt 路径下
tar -zxvf apache-tomcat-10.0.12.tar.gz -C /opt
2.启动 tomcat
# 进入 tomcat 的 bin 目录(不想切进去执行命令,可以配置一下环境即可,这里暂不配置环境变量)
cd /opt/apache-tomcat-10.0.12/bin
# 启动 tomcat
./startup.sh
3.开放 8080 端口
# linux 本地访问
http:localhost:8080 # linux 桌面端(本地环境),可以进浏览器去访问一下,会显示 tomcat 首页,但 windows(非本地环境)还访问不了,需要开放 8080 端口
# 开放 8080 端口
# 方式①【建议】
systemctl status firewalld # 查看防火墙状态,未开放 8080 端口
firewall-cmd --list-all # 查看防火墙开放的端口
firewall-cmd --add-port=8080/tcp --permanent # 开放 8080
firewall-cmd --reload # 重启防火墙
firewall-cmd --list-all # 再次查看防火墙列表,显示已开放 8080 端口
# 方式②【未测试,有兴趣,自行深究】
service iptables status # 查看防火墙状态,它未添加 8080 端口
vim /etc/sysconfig/iptables # 编辑 /etc/sysconfig/iptables 文件
# 追加内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT # 放行 8080 端口
service iptables restart # 重启防火墙,或 systemctl restart iptables
service iptables status # 再次查看防火墙状态,它已添加 8080 端口了
访问 tomcat 首页,看到 tomcat 首页,表示 tomcat 已安装成功。
# Windows Chrome 浏览器访问 Linux 上的 tomcat
http://187.153.18.12:8080/ # 在浏览器地址栏,输入服务器ip:8080,回车即可
# 关闭 tomcat命令
./shutdown.sh
1.解压缩到 /opt (上传步骤已略过)
# 解压 eclipse 至 /opt 路径下
tar -zxvf eclipse-java-2021-09-R-linux-gtk-x86_64.tar.gz -C /opt
2.启动 eclipse,配置 jre 和 server
# 切到 eclipse 路径下
cd /opt/eclipse
# 在 linux 图形界面中打开终端(不要在外面通过远程的方式执行此启动命令),启动 eclipse(也可以创建软链接方式启动和配置环境变量)
./eclipse # 启动 eclipse、diea 等都一样,在图形化界面上去执行
3.编写 Hello world 程序并测试成功!
# 同理,输出 HelloWorld 测试程序结果即可,这里懒得装图形化界面,因此,测试步骤省略。
这里的安装环境:CentOS 8.4.2105 安装 MySQL 8.0.27
1.卸载旧版本
# 查看系统是否已安装 mysql 相关软件包
rpm -qa | grep mysql 或者 rpm -qa | grep -i mysql
# 卸载与 mysql 相关的包
rpm -e mysql-xxx # 正常删除,有依赖时,会有提示,如:rpm -e mysql-communnity-libs
rpm -e --nodeps mysql-xxx # 不管依赖,强制删除,如:rpm -e mysql-communnity-libs
yum -y remove mysql-xxx # 或者使用 yum 卸载也可以,如:yum -y remove mysql-community-libs【建议使用 yum 卸载,卸得干净些】
# 再次查看是否卸载干净
rpm -qa | grep mysql 或者 rpm -qa | grep -i mysql
# 查找根目录下所有与 mysql 相关目录
find / -name mysql
# 删除找到有相关的目录(有可能会有这些或部分目录,有哪些目录就删除哪些目录)
rm -rf /var/lib/mysql
rm -rf /var/lib/selinux/targeted/active/modules/100/mysql
rm -rf /var/log/mysql
rm -rf /usr/share/bash-completion/completions/mysql
rm -rf /usr/share/selinux/packages/mysql
rm -rf /usr/share/selinux/targeted/default/active/modules/100/mysql
# 删除/etc/my.cnf 文件
rm -rf /etc/my.cnf # 首次没有,安装过就有
# 删除 /var/log/mysqld.log文件
rm -rf /var/log/mysqld.log # 首次没有,安装过就有
2.安装环境准备
# 创建mysql安装目录与数据存放目录:
mkdir /usr/local/mysql
mkdir /usr/local/mysql/data
# 给安装 和 存放目录授权,默认是 755 的权限
sudo chmod -R 777 /usr/local/mysql
sudo chmod -R 777 /usr/local/mysql/data
# 创建mysql组
cat /etc/group | grep mysql # 检查 mysql 组和用户是否存在,如无创建
cat /etc/passwd | grep mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql # 说明:创建 MySQL 用户,但该用户不能登陆(-s /bin/false参数:指定mysql用户仅拥有所有权,而没有登录权限)
3.上传并解压
# 将安装包 mysql-8.0.27-linux-glibc2.17-x86_64-minimal.tar.xz 通过 xftp 7 上传至服务器 /home/software (自定义指定目录)里,并解压
tar -Jxvf mysql-8.0.27-linux-glibc2.17-x86_64-minimal.tar.xz -C /opt/ # 解压至 /opt 目录
cd /opt # 切到 /opt 目录
mv mysql-8.0.27-linux-glibc2.17-x86_64-minimal/ mysql-8.0.27 # 重命名
mkdir -p /opt/mysql-8.0.27/data # 创建 mysql 的数据存放目录
4.创建用户组、用户,并授权
groupadd mysql # 创建组 mysql
useradd -r -g mysql mysql # 将添加的用户 mysql 指定到 mysql 组
chown -R mysql:mysql /opt/mysql-8.0.27/data # 修改 data 目录的所有者为 mysql,所在组为 mysql
5.配置 my.conf 配置文件
# 在 /etc/路径下,编写一个 my.cnf
vim /etc/my.cnf
# ===================== 配置 my.conf 内容如下 =====================
[mysqld]
# 跳过密码验证
# skip-grant-tables
# skip-name-resolve
bind-address=0.0.0.0
# 设置3306端口
port=3306
user=mysql
# 设置 mysql 的安装目录
basedir=/opt/mysql-8.0.27
# 设置 mysql 数据库的数据的存放目录
datadir=/opt/mysql-8.0.27/data
socket=/tmp/mysql.sock
log-error=/opt/mysql-8.0.27/data/mysql.err
pid-file=/opt/mysql-8.0.27/data/mysql.pid
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的 latin1 字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
symbolic-links=0
explicit_defaults_for_timestamp=true
# ===================== 自定义配置好后,:wq 保存退出 =====================
6.初始化安装
# 切到 mysql 安装目录的 bin 目录下
cd /opt/mysql-8.0.27/bin
./mysqld --defaults-file=/etc/my.cnf --basedir=/opt/mysql-8.0.27 --datadir=/opt/mysql-8.0.27/data --plugin-dir=/opt/mysql-8.0.27/data/lib/plugin --user=mysql --log-error=/opt/mysql-8.0.27/data/mysql.err --open-files-limit=65535 --pid-file=/opt/mysql-8.0.27/data/mysql.pid --socket=/opt/mysql-8.0.27/data/mysql.sock --port=3306 --initialize # 初始化后,到 mysql 安装目录的 data 目录下的 mysql.err 文件查找生成的随机密码,root@localhost:后面便是生成的临时登录随机密码
cat /opt/mysql-8.0.27/data/mysql.err # 示例:root@localhost: oiiSsicdd9.+
7.创建软链接并启动服务
ln -s /opt/mysql-8.0.27/support-files/mysql.server /usr/local/bin/mysqlserver # 创建 mysqlserver 的软链接
ln -s /opt/mysql-8.0.27/bin/mysql /usr/local/bin/mysql # 创建 mysql 的软链接
mysqlserver start # 启动 mysqlserver 服务
ps -ef | grep mysql # 查看 mysql 的进程
8.mysql 初始登录
# cd /opt/mysql-8.0.27/bin/ # 登录前注意:路径在 mysql 的 bin 目录
# 登录 mysql,使用前面生成的初始随机登录密码
mysql -u root -p
# ======================= 首次登录,可能遇到的报错,如下 =======================
# ① 若报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
# 报错原因:密码验证不通过,意思是:用户 'root'@'localhost' 的错误 1045 (28000) 访问被拒绝(使用密码:YES)
# 解决方法:跳过密码验证,修改 mysql 配置文件 /etc/my.cnf
vim /etc/my.cnf # 修改 /etc/my.cnf
skip-grant-tables # 跳过密码验证,登录时不需要密码,追加到 [mysqld]下面,然后保存退出
systemctl restart mysqld # 重启 mysqld 服务
mysqlserver restart # 重启 mysql 服务
mysql -u root -p # 重新登录
# ② 若报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
# 报错原因:没有重启 mysqld 或 mysql 服务,都重启一下,再登录就好了,意思是:用户 '=root'@'localhost' 访问被拒绝(使用密码:否)
# 解决方法:重启 mysqld、mysql 服务
systemctl restart mysqld
mysqlserver restart
# ③ 若报错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
# 解决方法:安装 libncurses*
yum -y install libncurses*
# ======================= 首次登录,可能遇到的报错,如上 =======================
# 首次登录成功,需要修改登录密码
alter user 'root'@'localhost' identified by 'new password'; # 修改登录密码,new password:修改为你的新密码
# 修改密码时,若报错:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
# 报错原因:未刷新权限
# 解决方法:刷新权限
flush privileges;
# 再次修改密码
alter user 'root'@'localhost' identified by 'new password'; # 现在密码已修改,自己记录一下
# 退出 mysql,将 mysql 的配置文件 /etc/my.cnf 中,[mysqld]下面的 skip-grant-tables 注释掉,然后保存退出
exit # 退出 mysql
vim /etc/my.cnf # 编辑 /etc/my.cnf 配置文件
# skip-grant-tables # 注释掉跳过密码验证
systemctl restart mysqld # 再次重启 mysqld 服务
mysqlserver restart # 再次重启 mysql 服务
mysql -u root -p # 以修改的新登录密码登录
# 设置 mysql 允许远程访问
use mysql; # 使用 mysql 数据库
select host,user from user; # 查看 user 表,localhsot:仅支持本地访问
update user set host = '%' where user = 'root'; # 修改 root 用户的 host 为任何机器可以访问,%:支持所有访问
flush privileges; # 刷新权限
exit # 退出,如需要,可以配置一下防火墙,开放 3306 端口
# 开放 3306 端口(仅针对防火墙开启的状态,防火墙已关闭状态无需配置,两种方法任选其一)
# 方法①:开启防火墙,并指定开放端口
systemctl status firewalld # 查看防火墙状态,未开放 3306 端口
firewall-cmd --list-all # 查看防火墙开放的端口
firewall-cmd --add-port=3306/tcp --zone=public --permanent # 开放 3306 端口
firewall-cmd --reload # 重启防火墙
firewall-cmd --list-all # 再次查看列表,显示已开放 3306 端口
firewall-cmd --query-port=3306/tcp # 查看防火墙是否已开放 3306 端口
# 方法②:关闭防火墙
systemctl stop firewalld # ① 临时关闭防火墙
systemctl disable firewalld # ② 永久关闭防火墙
# 配置环境变量
vim /etc/profile
# 编辑内容如下
MYSQL_HOME=/opt/mysql-8.0.27
PATH=$PATH:$MYSQL_HOME/bin
export MYSQL_HOME
# 重启环境变量配置文件,立即生效
source /etc/profile
# mysql 服务开启、关闭、重启、重载、状态、开机自启、关闭开机自启
mysqlserver start 或 systemctl start mysql
mysqlserver stop 或 systemctl stop mysql
mysqlserver restart 或 systemctl restart mysql
mysqlserver reload 或 systemctl reload mysql
mysqlserver force-reload
mysqlserver status 或 systemctl status mysql
systemctl enable mysql
systemctl disable mysql
手酸了,截图省了
Navicat 15 测试连接,可以连接上即可
为什么要 Shell 编程
Shell 是什么
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
# 单行注释 #
# 单行注释内容(井号:代表单行注释内容)
# 多行注释
:<<!
多行注释内容
!
#!/bin/bash
开头需求:创建一个 Shell 脚本,输出 hello world!
# 随便创建一个目录,用于存放 shell 脚本
mkdir shell
# 编写一个简单的 shell 测试脚本
vim helloworld.sh
# 其内容如下,写好之后,:wq,保存退出
#!/bin/bash
echo "Hello World!"
方式①:至少要授予需要要执行脚本的用户 x 权限【推荐】
# 授予可执行权限(x)
chmod 744 helloworld.sh
# 执行 shell 脚本
./helloworld.sh
方式②:不给可执行权限,使用 sh 执行【不推荐】
# 直接执行 shell 脚本文件(一般使用方式①,通常都给可执行权限)
sh ./helloworld1.sh
# 编写一个脚本,查看当前 shell 中的系统变量
vim var.sh
# 内容如下,写好 :wq,保存退出
echo "PATH=$PATH" # 输出预定义变量,系统变量
echo "UAER=$USER"
# 授权 var.sh 可执行权限(x)
chmod 744 var.sh
# 执行 var.sh,输出系统变量
./var.sh
# 显示当前 shell 中所有变量
set # 太多了
set | more # 分页显示一下
定义变量
变量=变量值
name=admin # 如:name 为 admin
撤销变量
unset 变量
unset name # 如:撤销掉 name 变量
声明静态变量
readonly 变量 # 注:静态变量不能 unset
示例:自定义变量
# 编写一个 shell,自定义一个变量
vim customvariable.sh
# 内容如下,写好,:wq,保存退出
name=admin # 自定义变量
echo "name=$name" # 使用变量
unset name # unset 变量
echo "name=$name"
# 授予 customvariable.sh 可执行权限(x)
chmod 744 customvariable.sh
# 执行脚本
./customvariable.sh
# 编写一个 shell,自定义一个静态变量
vim week.sh
# 内容如下,写好,:wq,保存退出
readonly week=7 # 定义静态变量
echo "Fixed days of week = $week days" # 使用静态变量
unset week # unset 静态变量,这里会报错:cannot unset: readonly variable,不能 unset 静态变量
echo "Fixed days of week = $week days" # 这里静态变量仍然是可以使用的
# 授予 week.sh 可执行权限(x)
chmod 744 week.sh
# 执行
./week.sh
# 编写一个 shell,自定义一个变量,并将命令的返回值赋给变量
vim returnvariable.sh
# 内容如下,写好,:wq,保存退出
CURRENT_DATE=`date` # 使用反引号 `` 将命令引起来
echo "date=$CURRENT_DATE"
echo ""
CURRENT_DATE=$(date) # 或者使用 $() 括起来
echo "date=$CURRENT_DATE"
# 授予 customvariable.sh 可执行权限(x)
chmod 744 returnvariable.sh
# 执行脚本
./returnvariable.sh
基本语法
export 变量名=变量值 # 将 shell 变量输出为环境变量
source 配置文件 # 让修改后的配置信息立即生效
echo $变量名 # 查询环境变量的值
# 注:在输出 xxx 环境变量前,需要 source 配置文件,让其立即生效
source /etc/profile # 方式①【推荐】
logout # 方式②
示例:配置 TOMCAT 的环境变量,并使其立即生效
# 在 /etc/profile 配置文件中,定义 TOMCAT_HOME 环境变量
vim /etc/profile
# 追加内容如下,写好后,:wq,保存退出
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
# 使环境变量配置文件立即生效
source /etc/profile
# 输出环境变量 TOMCAT_HOME 的值
echo $TOMCAT_HOME
# 在另外一个 shell 程序中,使用 TOMCAT_HOME
vim printtomcathome.sh # 编写
echo "tocmat_home=$TOMCAT_HOME" # 编辑内容,输出自定义的环境变量
chmod 744 printtomcathome.sh # 授权
./printtomcathome.sh # 执行
简介
当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如:./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
基本语法
$n # n为数字,$0代表命令本身,$1-$9:代表第 1 到第 9 个参数,10 个及以上的参数,需要用大括号包起来,如:${10}
$* # 代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ # 代表命令行中所有的参数,$@把每个参数区分对待
$# # 代表命令行中所有参数的个数
示例
# 案例:编写一个 shell 脚本 positionParameter.sh ,在脚本中获取到命令行的各个参数信息。
vim positionParameter.sh
# 编辑内容如下,写好,保存退出
#!/bin/bash
# 获取各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "Number of parameters = $#"
# 授予可执行权限(x)
chmod 744 positionParameter.sh
# 执行
./positionParameter.sh 100 200 id name date
简介
预定义变量:是 shell 设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$ # 当前进程的进程号(PID)
$! # 后台运行的最后一个进程的进程号(PID)
$? # 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
示例
# 在一个 shell 脚本中,简单使用一下预定义变量
vim predefinedVariables.sh
# 其内容如下,写好后,:wq,保存退出
#!/bin/bash
echo "Current process ID = $$"
./helloworld.sh & # 后台方式运行 helloworld.sh,&:后台方式运行
echo "Last process ID = $!"
echo "Executed value = $?" # 0:正确 非0:不正确
# 授予可执行权限(x)
chmod 744 predefinedVariables.sh
# 执行
./predefinedVariables.sh
基本语法
$((运算式)) 或 $[运算式] 或 expr
# 如:
expr m + n # 注:expr 运算符间要有空格
expr m - n
expr \*, /, % # 乘,除,取余
示例
# 案例1:计算 (12+16)*2 的值
vim operator.sh
# 编辑内容如下,写好后,:wq,保存退出
VALUE1=$(((12+16)*2)) # 方式①:$((表达式))
echo "VALUE1=$VALUE1"
VALUE2=$[(12+16)*2] # 方式②:$[表达式]【推荐】
echo "VALUE2=$VALUE2"
TEMPVALUE=`expr 12 + 16`
VALUE3=`expr $TEMPVALUE \* 2` # 方式③:expr 表达式
echo "VALUE3=$VALUE3"
chmod 744 operator.sh # 授权
./operator.sh # 执行
# 案例2:求出命令行的两个参数[整数]的和(仍用上面的 operator.sh,已授权x)
vim operator.sh
SUM=$[$1+$2]
echo "sum = $SUM"
./operator 100 200
基本语法
[ condition ] # 注:condition(条件)前后要有空格,非空返回 true,可使用 $? 验证(0 为 true,>1(非0)为false)
# 如
[ admin ] # 返回 true
[] # 返回 false
[condition] && echo OK || echo notok # 条件满足,执行后面的语句
常用判断条件
# 1.两个整数的比较
= # 字符串比较
-lt # 小于
-le # 小于等于
-eq # 等于
-gt # 大于
-ge # 大于等于
-ne # 不等于
# 2.按照文件权限进行判断
-r # 有读的权限
-w # 有写的权限
-x # 有执行的权限
# 3.按照文件类型进行判断
-f # 文件存在并且是一个常规的文件
-e # 文件存在
-d # 文件存在并是一个目录
示例
# 案例1:判断 "admin" 是否等于 "admin"
vim conditional_judgment.sh
if [ "admin" = "admin" ]
then
echo "admin is equal admin"
fi
chmod 744 conditional_judgment.sh
./conditional_judgment.sh
# 案例2:判断 10 是否大于 8
if [ 10 -gt 8 ]
then
echo "10 is greater than 8"
fi
# 案例3:/root/shell/aaa.txt 目录中的文件是否存在
if [ -e /root/shell/helloworld.sh ]
then
echo "/root/shell/helloworld.sh 文件存在"
fi
基本语法
# if 语法格式(注:[ 条件判断式],中括号和条件判断式之间必须有空格,建议使用第②种格式)
# 格式①:
if [ 条件判断式 ];then
# 逻辑代码
fi
# 格式②:
if [ 条件判断式 ]
then
# 逻辑代码
elif [ 条件判断式 ]
then
# 逻辑代码
fi
示例
# 案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出"分数及格",如果小于60,则输出"分数不及格"
vim score.sh
if [ $1 -ge 60 ]
then
echo "分数及格"
elif [ $1 -lt 60 ]
then
echo "分数不及格"
fi
chmod 744 score.sh
./score.sh 100
基本语法
# case 语法格式
case $变量名 in
"值1")
# 若变量的值等于值1,则执行程序1
;;
"值2")
# 若变量的值等于值2,则执行程序2
;;
# …其他分支…
*)
# 如果变量的值都不是以上的值,则执行此程序
;;
esac
示例
# 案例1 :当命令行参数是1 时,输出"周一", 是2 时,就输出"周二",其它情况输出"other"
vim isweek.sh
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
"3")
echo "周三"
;;
"4")
echo "周四"
;;
"5")
echo "周五"
;;
"6")
echo "周六"
;;
"7")
echo "周日"
;;
*)
echo "输入星期非法,星期范围 1 ~ 7"
;;
esac
chmod 744 isweek.sh
./isweek.sh 6
./isweek.sh 20
./isweek.sh 7
基本语法
# for 循环格式
# 格式①:
for 变量 in 值1 值2 值3 …
do
# 循环体
done
# 格式②:
for ((初始值;循环控制条件;迭代条件))
do
# 循环体
done
示例
# 案例1:打印命令行输入的参数(这里可以看出 $* 和 $@ 的区别)
vim for.sh
for i in "$*" # 遍历参数 $*,并赋给 i
do
echo "the num is $i"
done
echo "==========================="
for j in "$@" # 遍历参数 $@,并赋给 j
do
echo "the num is $j"
done
chmod 744 for.sh
./for.sh 100 200 400
# 案例2:从 1 加到 100 的值输出显示
vim for.sh
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
./for.sh
基本语法
while [ 条件判断式 ]
do
# 循环体
done
示例
# 案例1 :从命令行输入一个数n,统计从1+..+ n 的值是多少?
vim while.sh
SUM=0
i=1
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum = $SUM"
chmod 744 while.sh
./while.sh 100
基本语法
# 读取控制台输入
read 选项 输入内容
# 选项:
-p # 指定读取值时的提示符;
-t # 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了,继续执行后面的程序
示例
# 案例1:读取控制台输入一个 num 值
vim read.sh
read -p "请输入一个数字:" NUM1
echo "输入的数字是:$NUM1"
chmod 744 read.sh
./read.sh 100
# 案例2:读取控制台输入一个 num 值,在 5 秒内输入。
vim read.sh
read -t 5 -p "敌方还有 30 秒到达战场!" NUM2
echo "对不起!您输入有误:$NUM2,请稍后再试!"
./read.sh
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,这里就介绍这两个。
basename 基本语法
# basename:返回完整路径最后/ 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix] # basename 会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。
# 选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
示例
# 案例1:请返回 /root/shell/helloworld.sh 的 "helloworld.sh" 或 "helloworld" 部分
basename /root/shell/helloworld.sh # 输出文件名+后缀
basename /root/shell/helloworld.sh .sh # 输出文件名
dirname 基本语法
# dirname:返回完整路径最后/ 的前面的部分,常用于返回路径部分
dirname 文件绝对路径 # 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
示例
# 案例1:请返回 /root/shell/helloworld.sh 的文件前面部分
dirname /root/shell/helloworld.sh
dirname /root/shell/aaa/bbb/ccc/ddd/helloworld.sh
基本语法
# 自定义函数格式
[ function ] funname[()] # 没有形参,[]:表示可选
{
Action;
[return int;]
}
# 调用直接写函数名:
funname [值]
示例
# 案例1:计算输入两个参数的和,getSum
vim function.sh
function getSum() { # 无形参
SUM=$[$NUM1+$NUM2]
echo "sum = $SUM"
}
read -p "请输入第一个整数:" NUM1
read -p "情输入第二个整数:" NUM2
getSum $NUM1 $NUM2 # 调用函数
chmod 744 function.sh
./function.sh
需求
1)每天凌晨 2:30 备份数据库 mydatabase 到 /root/mysqlback 自定义指定路径下
2)备份开始和备份结束能够给出相应的提示信息
3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz 的形式,比如:2021-11-19_133237.tar.gz
4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
实现
# 编写一个 shell 脚本
vim mysqlback.sh
# ***************** 编辑内容如下 *****************
#!/bin/bash
#!/bin/bash
# 备份路径:/root/mysqlback
BACKPATH=/root/mysqlback
# 备份文件名称(当前时间作为文件名),如:2021-11-19_133237.tar.gz
BACKNAME=$(date +%Y-%m-%d_%H%M%S)
# 开始备份
echo "=========== 开始备份 ==========="
echo "备份路径:$BACKPATH/$BACKNAME"
# 需备份的信息
# 主机
HOST=localhost
# 用户名
USER=root
# 密码
PASSWORD=root
# 数据库
DATABASE=mysql
# 创建备份路径
# 若备份路径存在就使用,不存在就创建
[ ! -d "$BACKPATH/$BACKNAME" ] && mkdir -p "$BACKPATH/$BACKNAME"
# 备份数据库
# 临时备份文件
mysqldump -u$USER -p$PASSWORD --host=$HOST $DATABASE | gzip > $BACKPATH/$BACKNAME/$BACKNAME.sql.gz
# echo "临时备份数据库:$DATABASE '到' $BACKPATH/$BACKNAME.sql.gz"
# 打包备份文件
# 切到备份路径中
cd $BACKPATH
# 打包为:tar.gz
tar -zcvf $BACKNAME.tar.gz $BACKNAME
# 删除临时备份文件
rm -rf $BACKPATH/$BACKNAME
# 删除 10 天前的备份文件
find $BACKPATH -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=========== 备份文件完成 ==========="
# ***************** 编辑完成,:wq,保存退出 *****************
# 授权
chmod 744 mysqlback.sh
# 执行
# ./mysqlback.sh
# 编辑 crontab 定时任务
crontab -e
# crontab -r # 删除定时任务
# 调用脚本,内容如下:
30 2 * * * /root/mysqlback.sh # 每天凌晨 2:30 分,执行 /root/datetask1.sh 脚本
:wq # 保存退出
Ubuntu(友帮图、优班图、乌班图)是一个以桌面应用为主的开源 GNU/Linux 操作系统,Ubuntu 是基于 GNU/Linux,支持 x86、amd64(即x64)和 ppc 架构,由全球化的专业开发团队(Canonical Ltd)打造的。专业的 Python 开发者一般会选择 Ubuntu 这款 Linux 系统作为生产平台.
Ubuntu 和 CentOS 都是基于 GNU/Linux 内核的,因此基本使用和 CentOS 是几乎一样的,它们的各种指令可以通用,同学们在学习和使用Ubuntu 的过程中,会发现各种操作指令在前面学习 CentOS 都使用过。只是界面和预安装的软件有所差别。
Ubuntu 下载地址:https://cn.ubuntu.com/download
设置 Ubuntu 支持中文
默认安装的ubuntu 中只有英文语言,因此是不能显示汉字的。要正确显示汉字,需要安装中文语言包。
安装中文支持步骤(旧系统才是默认语言为英文,新系统一般安装时,可以选择安装何种语言):
1.单击左侧图标栏打开System Settings(系统设置)菜单,点击打开Language Support(语言支持)选项卡。
2.点击 Install / Remove Languages,在弹出的选项卡中下拉找到Chinese(Simplified),即中文简体,在后面的选项框中打勾。然后点击Apply Changes 提交,系统会自动联网下载中文语言包。(保证ubuntu 是联网的)。
3.这时“汉语(中国)”在最后一位因为当前第一位是”English”,所以默认显示都是英文。我们如果希望默认显示用中文,则应该将“汉语(中国)”设置为第一位。设置方法是拖动,鼠标单击“汉语(中国)”,当底色变化(表示选中了)后,按住鼠标左键不松手,向上拖动放置到第一位。
4.设置后不会即刻生效,需要下一次登录时才会生效。
简介
安装ubuntu成功后,都是普通用户权限,并没有最高root权限,如果需要使用root权限的时候,通常都会在命令前面加上sudo 。有的时候感觉很麻烦。
我们一般使用su命令来直接切换到 root 用户的,但是如果没有给 root 设置初始密码,就会抛出 su : Authentication failure 这样的问题。所以,我们只要给 root 用户设置一个初始密码就好了。
给root用户设置密码并使用
sudo passwd # 修改 root 用户的密码
su - root # 切换为 root 用户
exit # 退出为普通用户
安装好 Ubuntu 后,默认就已经安装好 Python 的开发环境(旧版本:默认已安装,Python 2.7、Python 3.5;新版本:默认已安装,Python 3.8,2版本未安装)。
apt是 Advanced Packaging Tool 的简称,是一款安装包管理工具。在 Ubuntu 下,我们可以使用 apt 命令可用于软件包的安装、删除、清理等,类似于 Windows 中的软件管理工具。
sudo apt-get update # 更新源
sudo apt-get install package # 安装包
sudo apt-get remove package # 删除包
sudo apt-cache search package # 搜索软件包
sudo apt-cache show package # 获取包的相关信息,如说明、大小、版本等
sudo apt-get install package --reinstall # 重新安装包
sudo apt-get -f install # 修复安装
sudo apt-get remove package --purge # 删除包,包括配置文件等
sudo apt-get build-dep package # 安装相关的编译环境
sudo apt-get upgrade # 更新已安装的包
sudo apt-get dist-upgrade # 升级系统
sudo apt-cache depends package # 了解使用该包依赖那些包
sudo apt-cache rdepends package # 查看该包被哪些包依赖
sudo apt-get source package # 下载该包的源代码
# 使用 root 用户修改
su - root
# 备份 Ubuntu 默认的源地址
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 清空下载源
> sources.list 或 echo '' > sources.list
# 替换下载源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# 更新下载源
sudo apt-get update
sudo apt-get upgrade
# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
# 网易源
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
# 清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# 中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
SSH 简介
SSH为Secure Shell的缩写,由IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。
SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,以及用户之间进行资料拷贝。几乎所有UNIX 平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
使用SSH服务,需要安装相应的服务器和客户端。客户端和服务器的关系:如果,A机器想被B机器远程控制,那么,A机器需要安装SSH服务器,B机器需要安装SSH客户端。
和CentOS不一样,Ubuntu默认没有安装SSHD服务,因此,不能进行远程登录。
安装和启用 SSH
sudo apt-get install openssh-server # 安装 SSH 服务端和客户端
service sshd restart # 重启 sshd 服务,默认监听 22 端口
在 Windows 使用 XShell 7/XFTP 7 登录 Ubuntu
略
从 linux 系统客户机远程登录 linux 系统服务机
ssh 用户名@IP # 如:ssh [email protected]
# 若访问出错:查看是否有 ~/.ssh/known_ssh 文件,删除该文件
cat ~/.ssh/known_ssh # 查看是否有该文件
rm -rf ~/.ssh/known_ssh # 删除该文件
logout 或 exit # 登出