linux系统入门与基本指令

技术人员的基础东西:
网络 linux系统 数据结构与算法 编译原理 相关课程已经收藏,看完继续学习。
趣谈网络协议
趣谈linux系统

1 为什么学习linux操作系统
编程世界中,linux是主流,很多技术,例如云计算、虚拟化、容器等都是基于linux技术
linux中很多东西数数据结构和设计模式的落地实践
很多技术都是先适配linux,学习新技术更快

Linux 的学习过程中,要爬的坡有六个,分别是:熟练使用 Linux 命令行、使用 Linux 进行程序设计、了解 Linux 内核机制、阅读 Linux 内核代码、实验定制 Linux 组件,以及最后落到生产实践上

第一个坡:抛弃旧的思维习惯,熟练使用 Linux 命令行
找到合适的命令可能会很痛苦,慢慢你就会发现,大部分命令的行为模式都很像,你几乎不需要搜索就能完成大部分操作了。
可以阅读 鸟哥的linux私房菜

第二个坡:通过系统调用或者 glibc,学会自己进行程序设计
这里面需要掌握很多 Linux 操作系统的原理,否则你会无法理解为什么应该这样调用。
如果要进一步学习 Linux 程序设计,推荐你阅读《UNIX 环境高级编程》 rocedu极友推荐的《Unix/Linux编程实践教程》

第三个坡:了解 Linux 内核机制,反复研习重点突破
进一步了解内核的原理,有助于你更好地使用命令行和进行程序设计,能让你的运维和开发水平上升一个层次。
最好的办法是,先了解一下 Linux 内核机制,知道基本的原理和流程就可以了。
《深入理解 LINUX 内核》内核版本老点 《庖丁解牛Linux内核分析》跟着

第四个坡:阅读 Linux 内核代码,聚焦核心逻辑和场景
理论的描述和提炼虽然能够让你更容易看清全貌,但是容易让你忽略细节。
《LINUX 内核源代码情景分析》。这本书最大的优点是结合场景进行分析,看得见、摸得着,非常直观,唯一的缺点还是内核版本比较老
《linux 驱动开发》

第五个坡:实验定制化 Linux 组件,已经没人能阻挡你成为内核开发工程师了
从只看内核代码,到上手修改内核代码

最后一个坡:面向真实场景的开发,实践没有终点

03 把linux内核当成一家外包公司的老板
电脑组装:cpu 网卡 显卡 硬盘 主板 线 鼠标 键盘 显示器

从双击鼠标打开聊天软件来重新认识操作系统

屏幕,也就是显示器,是计算机的输出设备。
鼠标和键盘是计算机的输入设备。
显示器上面显示的东西是由显卡控制的。
这个时候客户发送的需求就被称为中断事件。
有时候新插上一个鼠标的时候,会弹出一个通知你安装驱动,即输入设备驱动.
文件系统需要一个系统进行统一管理,称为文件管理子系统.
QQ 的二进制文件是静态的,称为程序(Program)
而运行起来的 QQ,是不断进行的,称为进程.
打印机的直接操作是放在操作系统内核里面的,进程不能随便操作。但是操作系统也提供一个办事大厅,也就是系统调用.
同样,任何一个程序要想运行起来,就需要调用系统调用,创建进程。

在操作系统中,进程的执行也需要分配 CPU 进行执行,也就是按照程序里面的二进制代码一行一行地执行。
于是,为了管理进程,我们还需要一个进程管理子系统(Process Management Subsystem)。
如果运行的进程很多,则一个 CPU 会并发运行多个进程,也就需要 CPU 的调度能力了。

在操作系统中,不同的进程有不同的内存空间,但是整个电脑内存就这么点儿,所以需要统一的管理和分配,这就需要内存管理子系统.

回车一下,QQ 会将用户的输入发送到网络上。QQ 进程是不能直接发送网络包的,需要调用系统调用,内核使用网卡驱动程序进行发送。

linux安装软件
可以下载 rpm 或者 deb。这个就是 Linux 下面的安装包。
为什么有两种呢?因为 Linux 现在常用的有两大体系,一个是 CentOS 体系,一个是 Ubuntu 体系,前者使用 rpm,后者使用 deb。

获取当前系统体系的方式:
cat /etc/os-release
如果结果中包含centos,那系统就是centos。


centos
第一种:rpm安装命令
rpm -i  jdk-XXX_linux-x64_bin.rpm
rpm -qa 查看安装的软件列表
rpm -qa | grep jdk
rpm -qa | more 或 rpm -qa less #分页展示安装软件的列表
rpm -e 

二:软件管家yum管理
yum centos中的软件管家,可以搜索、安装、卸载、更新软件
yum search jdk 获取可以安装的jdk版本
yum install java-11-openjdk.x86_64
yum erase java-11-openjdk.x86_64 卸载
/etc/yum.repos.d/CentOS-Base.repo 里面可以配置从哪里下载这些软件的,地点就在配置文件里面。

其实无论是先下载再安装,还是通过软件管家进行安装,都是下载一些文件,然后将这些文件放在某个路径下,然后在相应的配置文件中配置一下。
 Linux 里面会放的更散一点。例如,主执行文件会放在 /usr/bin 或者 /usr/sbin 下面,其他的库文件会放在 /var 下面,配置文件会放在 etc 下面。所以还有第三中方式。

第三种方式 文件解压缩与手动配置
文件下载 wget,后面加上链接,就能从网上下载了。
如果是zip格式:
yum install zip.x86_64 unzip.x86_64
apt-get install zip unzip
如果是tar.g格式:
tar xvzf jdk-XXX_linux-x64_bin.tar.gz 就可以解压缩了。
可以通过 export 命令来配置JAVA_HOME 和 PATH,如
export JAVA_HOME=/root/jdk-XXX_linux-x64
export PATH=$JAVA_HOME/bin:$PATH
export 命令仅在当前命令行的会话中管用,一旦退出重新登录进来,就不管用了.永久方案如下:
在当前用户的默认工作目录,例如 /root 或者 /home/cliu8 下面,有一个.bashrc 文件,以点开头的,文件默认看不到,需要 ls -la 才能看到,a 就是 all。每次登录的时候,这个文件都会运行,因而把它放在这里。这样登录进来就会自动执行。当然也可以通过 source .bashrc 手动执行。

环境变量path查看:echo $PATH ;注意:环境变量名称大小写敏感
获取所有环境变量 env

ubuntu
dpkg -i jdk-XXX_linux-x64_bin.deb
dpkg -l 查看安装的软件列表
dpkg -r 

apt-get ubuntu中的软件管家,可以搜索、安装、卸载、更新软件
apt-cache search jdk
apt-get install openjdk-9-jdk
apt-get purge openjdk-9-jdk 卸载
Ubuntu 来讲,从哪里下载软件的配置文件是/etc/apt/sources.list。

ubuntu 中现在都用apt了,apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

运行程序
Linux 不是根据后缀名来执行的。它的执行条件是这样的:只要文件有 x 执行权限,都能到文件所在的目录下,通过./filename运行这个程序。当然,如果放在 PATH 里设置的路径下面,就不用./ 了,直接输入文件名就可以运行了,Linux 会帮你找。

Linux 执行程序最常用的一种方式,通过shell在交互命令行里面运行。
缺点:一旦当前的交互命令行退出,程序就停止运行了。

后台方式运行程序
即交互命令行退出的时候,程序还在。
程序不能霸占交互命令行,而是应该在后台运行。最后加一个 &,就表示后台运行。
另外一个要处理的就是输出,原来什么都打印在交互命令行里,现在在后台运行了,输出到文件
最终命令的形式为:
nohup command >out.file 2>&1 &
说明:“1”表示文件描述符 1,表示标准输出;“2”表示文件描述符 2,意思是标准错误输出;
“2>&1”表示标准输出和错误输出合并了。合并到哪里去呢?到 out.file 里。

停止后台运行的程序
假设启动的程序包含某个关键字,那就可以使用下面的命令:
ps -ef |grep 关键字  |awk '{print $2}'|xargs kill -9
awk '{print $2}'是指第二列的内容,是运行的程序 ID。我们可以通过 xargs 传递给 kill -9

以服务的方式运行程序
如 apt-get install mysql-server 安装Mysql
然后通过命令systemctl start mysql启动 MySQL,通过systemctl enable mysql设置开机启动。
之所以成为服务并且能够开机启动,是因为在 /lib/systemd/system 目录下会创建一个 XXX.service 的配置文件,里面定义了如何启动、如何关闭。

shutdown -h now是现在就关机,
reboot就是重启。

问题:
linux 为什么会有两种系统体系呢?
Ubuntu CentOS 都是GNU Linux的发行版,Linux只是操作系统的内核。
Ubuntu 和CentOS的区别主要是软件包的管理方式不同:前者的包管理工具用apt(apt-get),后者用yum。
另外,二者理念差别很大:
Ubuntu 对于软件包的选择比较激进,好处是可以用上最新版本的软件,坏处是,较新的版本的软件彼此协调可能不畅,导致系统可能不太稳定(所以推荐选择LTS版本)。
CentOS 则相反,这款脱胎自大名鼎鼎的redhat的发行版,号称服务器最佳选择(没用过,不知道)。只用过桌面版的,桌面漂亮,运行流畅。

.bash_profile和.bashrc
.bash_profile是系统配置信息存储文件,写在里面的系统变量是所有用户共用的,而.bashrc是个人的配置信息存储文件,只是单用户有效。


vi 和 vim 有什么区别?
vim是vi的升级,支持多级撤销 语法加亮 可视化操作等。

/etc/bashrc 和 ~/.bashrc区别
/etc/bashrc针对所有用户; ~/.bashrc仅仅针对当前用户

~/.bash_profile 和 /etc/profile
/etc/profile针对所有用户; ~/.bash_profile仅仅针对当前用户

/etc/bashrc 和 /etc/profile
/etc/profile:  profile为所有的用户设置系统范围的环境变量和启动顺序,当用户登录时读取该文件,这个文件对每个shell都有效。
/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。也就是说,当用户shell执行了bash时,运行这个文件。
总结如下:
/etc/profile 作用域大于/etc/bashrc。
/etc/profile 是所有用户登录时加载配置环境,/etc/bashrc 是所有用户在执行bash shell 时,加载配置环境。


你知道/etc/profile和.bashrc的区别吗 ?
/etc/profile 中设定的变量(全局)的可以作用于任何用户
~/.bashrc 中设定的变量(局部)只能继承/etc/profile中的变量
他们是“父子”关系。

~/.bash_profile 是交互式、login 方式进入 bash 运行的
~/.bashrc 是交互式 non-login 方式进入 bash 运行的
通常二者设置大致相同,所以通常前者会调用后者。

设置生效:
可以重启生效,也可以使用命令:source /etc/profile或.bash_profile或。。。

05 学会几个系统调用
进程的产生
1)操作系统启动的时候会想创建一个所有用户进程的“祖宗进程”;
2)之后要创建一个新的进程,需要一个老的进程调用fork来实现,老的叫做父进程,新的是子进程

fork的本质:子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份,甚至连程序代码也是拷贝过来的。

那父和子进程执行的时候如何区分呢?
fork完成后,父子进程都不知道自己是父还在子了,但是内核能区分,所以fork系统调用的返回值,如果当前进程是子进程,就返回0;如果当前进程是父进程,就返回子进程的进程号。然后通过 if-else 语句判断,如果是父进程,还接着做原来应该做的事情;如果是子进程,需要请求另一个系统调用execve来执行另一个程序.

父进程要关心子进程的运行情况,有个系统调用waitpid,父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就知道子进程运行完了没有,成功与否。

内存管理
每个进程都有自己的内存,互相之间不干扰,有独立的进程内存空间。主要存储:
1)代码段:因为程序代码要不断的看,所以会将程序存放到内存
2)数据段:进程运行中产生的数据,包括:
栈:局部变量的部分,在当前函数执行的时候起作用,当进入另一个函数时,这个变量就释放了;
堆:也有动态分配的,会较长时间保存,指明才销毁的,这部分称为堆

进程内存空间的分配:
需要的时候再分配,即只有真的写入数据的时候,发现没有对应物理内存,才会触发一个中断,现分配物理内存。
两个在堆里面分配内存的系统调用,brk和mmap:
分配的内存数量比较小的时候,使用 brk,会和原来的堆的数据连在一起.
当分配的内存数量比较大的时候,使用mmap,会重新划分一块区域,也就是说,当办公空间需要太多的时候,索性来个一整块。


文件管理:
文件的操作的六个系统调用:
对于已经有的文件,可以使用open打开这个文件,close关闭这个文件;
对于没有的文件,可以使用creat创建文件;
打开文件以后,可以使用lseek跳到文件的某个位置;
可以对文件的内容进行读写,读的系统调用是read,写是write。

一切皆文件的理解:
1)程序文件,这是一个二进制文件
2)启动的时候,要加载一些配置文件;启动之后会打印一些日志,如果写到硬盘上,也是文本文件。
3)日志打印到交互控制台上,是标准输出 stdout 文件。
4)进程的输出可以作为另一个进程的输入,这种方式称为管道,管道也是一个文件。
5)通信,建立的 Socket,也是一个文件。
6)进程需要访问外部设备,设备也是一个文件。
每个文件,Linux 都会分配一个文件描述符(File Descriptor),这是一个整数。有了这个文件描述符,我们就可以使用系统调用,查看或者干预进程运行的方方面面。
文件操作是贯穿始终的,这也是“一切皆文件”的优势,就是统一了操作的入口,提供了极大的便利。


异常信号处理
如:
在键盘输入“CTRL+C”,这就是中断的信号,正在执行的命令就会中止退出;
用户进程通过kill函数,将一个用户信号发送给另一个进程

每种信号都定义了默认的动作,例如硬件故障,默认终止;也可以提供信号处理函数,可以通过sigaction系统调用,注册一个信号处理函数。

进程间通信
1)发个消息,不需要一段很长的数据,这种方式称为消息队列;
这个消息队列是在内核里的,我们可以通过msgget创建一个新的队列,msgsnd将消息发送到消息队列,而消息接收方可以使用msgrcv从队列中取消息。
2)共享内存:需要交互的信息比较大的时候,可以使用共享内存的方式,也即两个项目组共享一个会议室(这样数据就不需要拷贝来拷贝去;可以通过shmget创建一个共享内存块,通过shmat将共享内存映射到自己的内存空间,然后就可以读写了。

网络通信
不同机器的通过网络相互通信,要遵循相同的网络协议,也即 TCP/IP 网络协议栈。Linux 内核里有对于网络协议栈的实现。
网络服务是通过套接字 Socket 来提供服务的:socket可以理解成一根网线,一头插在客户端,一头插在服务端,然后进行通信。因此,在通信之前,双方都要建立一个 Socket。


Glibc
Glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库。Glibc 为程序员提供丰富的 API,除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。

总结
如图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值