Linux学习
Linux基本概念及操作
Linux介绍
操作系统在整个计算机系统中的角色:
Linux 主要是系统调用和内核那两层。当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比如文本编辑器、浏览器、电子邮件等。相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件。而 Linux 上的这套软件以前是 XFree86,现在则是 xorg(X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为 X11 或 X)实现的!
Linux终端
通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序(Terminal)。不过要注意的是这里所说的终端(Terminal)和控制台(Console)是有区别的:
终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登录就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录。
Shell
Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe 。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。
在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME)。
bash 是一个为GNU项目编写的Unix shell,也就是linux用的shell。
Shell俗称壳(用来区别于内核),是指“提供使用者使用界面”的软件,就是一个命令行解释器。
BASH是SHELL的一种,是大多数LINUX发行版默认的SHELL,除BASH SHELL外还有C SHELL等其它类型的SHELL。
快捷键
使用Tab键来进行命令补全;(当然不止补全命令,补全目录、补全命令参数都是没问题的)
使用Ctrl+c键来强行终止当前程序;
使用键盘上的方向上键↑,恢复你之前输入过的命令;
使用通配符进行模糊匹配;(通配符是一种特殊语句,主要有星号(*)(匹配 0 或多个字符)和问号(?)(匹配任意一个字符),用来对字符串进行模糊匹配(比如文件名、参数名))
使用man、help、info在命令行中获取帮助;(如果你知道某个命令的作用,只是想快速查看一些它的某个具体参数的作用,那么你可以使用–help参数)
用户及文件权限管理
Linux用户管理
-
查看用户
终端输入whoami命令 -
创建用户
su 可以切换到用户 user,执行时需要输入目标用户的密码,sudo 可以以特权级别运行 cmd 命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码。su - 命令也是切换用户,同时环境变量也会跟着改变成目标用户的环境变量。
sudo adduser XXX新建一个叫XXX的用户;(这个命令不但可以添加用户到系统,同时也会默认为新用户创建 home 目录)->su -l XXX(现在你已经创建好一个用户,并且你可以使用你创建的用户登录了,使用命令切换登录用户) -
用户组
Linux 里面查找自己属于哪些用户组:方法一:groups XXX(其中冒号之前表示用户,后面表示该用户所属的用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组)默认情况下在 sudo 用户组里的可以使用 sudo 命令获得 root 权限。
方法二:查看 /etc/group 文件:cat /etc/group | sort(显示格式为group_name:password:GID:user_list)
将其他用户加入sudo用户组:sudo usermod -G sudo XXX(使用 usermod 命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令。) -
删除用户
sudo deluser XXX --remove-home
Linux文件权限
文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。
Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev 目录下有各种设备文件,大都跟具体的硬件设备相关)这一说。软链接文件:链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,而软链接等同于 Windows 上的快捷方式)
一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件
-
查看文件权限
ls -l列出并显示当前目录下的文件,使用较长格式列出文件;
ls -h更直观的查看文件的大小;
ls -dl <目录名> 查看某一个目录的完整属性,而不是显示目录里面的文件属性;
ls -a查看隐藏文件。
注:参数可以合在一块使用! -
变更文件所有者
sudo chown <需要变更到的用户名> <文件名> -
修改文件权限
方式一:chmod 777 <文件名>(chmod后面跟三个1-7内的数字)
方式二:**chmod go-rw <文件名>**加减赋值操作,g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。
Linux目录结构及文件基本操作
Linux目录结构
Linux 是以树形目录结构的形式来构建整个系统的,可以理解为树形目录是一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。举例来说,可以利用网络文件系统(Network File System,NFS)服务器载入某特定目录等。
- FHS标准
FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
FHS 定义了两层规范,第一层, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin 与 /sbin 则应该放置可执行文件等等。
第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统日志文件,/usr/share 放置共享数据等等。
或者执行命令:**tree /**查看文件系统层次结构。
FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态:
- 目录路径
绝对路径
关于绝对路径,简单地说就是以根" / "目录为起点的完整路径,以你所要到的目录为终点,表现形式如: /usr/local/bin,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。
相对路径
相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如: usr/local/bin
Linux文件的基本操作
新建空白文件:touch <文件名>
新建目录:mkdir <目录名>(使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录,后面的目录路径,以绝对路径的方式表示也是可以的)
复制文件:cp <文件名> <目录名>
复制目录:cp -r <目录名1> <目录名2>(复制目录需要加上 -r 或者 -R 参数,表示递归复制)
删除文件/目录:rm <文件名>(想忽略提示,直接删除文件,可以使用 -f 参数强制删除;要删除一个目录,也需要加上 -r 或 -R 参数)
移动文件与文件重命名:mv <源目录文件> <目的目录> ; mv <旧的文件名> <新的文件名>
查看文件:使用 cat,tac 和 nl 命令查看文件;(前两个命令都是用来打印文件内容到标准输出(终端),其中 cat 为正序显示,tac 为倒序显示,可以加上 -n 参数显示行号;nl 命令,添加行号并打印,这是个比 cat -n 更专业的行号打印命令)
使用 more 和 less 命令分页查看文件;使用 head 和 tail 命令查看文件(关于 tail 命令,不得不提的还有它一个很牛的参数 -f,这个参数可以实现不停地读取某个文件的内容并显示)
查看文件类型:例如file /bin/ls
编辑文件:一般用vim或者vi(比较老了)
环境变量与文件查找
环境变量
-
要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的值并赋值给其它变量,也可以直接指定数值赋值给任意变量。
-
在 Shell 中如何创建一个变量,如何给变量赋值和如何读取变量的值呢?
使用 declare 命令创建一个变量名为 tmp 的变量->使用 = 号赋值运算符,将变量 tmp 赋值为 shiyanlou->读取变量的值,使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值) -
有三个与上述三种环境变量相关的命令:set,env,export。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。
-
按变量的生存周期来划分,Linux 变量可分为两类:
永久的:需要修改配置文件,变量永久生效;
临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。
这里介绍两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量;还有要注意区别的是每个用户目录下的一个隐藏文件 .profile 只对当前用户永久生效,而写在 /etc/profile 里面的是对所有用户永久生效;
Linux查看、添加、修改环境变量
一. 添加环境变量
(Bash shell中用export,C shell中用setenv)
1.直接在终端修改:
export PATH=
P
A
T
H
:
s
o
f
t
w
a
r
e
i
n
s
t
a
l
l
a
t
i
o
n
p
a
t
h
/
b
i
n
∗
∗
改
修
改
只
对
本
次
进
程
有
效
2.
修
改
用
户
级
在
h
o
m
e
/
用
户
/
.
p
r
o
f
i
l
e
中
添
加
:
∗
∗
e
x
p
o
r
t
P
A
T
H
=
PATH:software_installation_path/bin** 改修改只对本次进程有效 2.修改用户级 在home/用户/.profile中添加: **export PATH=
PATH:softwareinstallationpath/bin∗∗改修改只对本次进程有效2.修改用户级在home/用户/.profile中添加:∗∗exportPATH=PATH:software_installation_path/bin
保存文件,重启即可(有的系统执行./.profile即可,不需重启;有的系统必须重启)
3.修改系统级
cd /etc/profile
vi profile
export PATH=$PATH:software_installation_path/bin
保存文件,重启即可(有的系统执行./profile即可,不需重启;有的系统必须重启)重启后可查看PATH环境变量看是否更改:echo $PATH(查看 PATH 环境变量的内容)
二. 环境变量改名
echo ${path/old_name/new_name} #变更一个目录名old_name
echo ${path//old_name/new_name} #变更所有目录名old_name
三.环境变量删除
echo ${path#/deletion_name:}
也可以使用 unset 命令删除一个环境变量。
前面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用 source 命令来让其立即生效。
搜索文件
与搜索相关的命令常用的有 whereis,which,find 和 locate
- which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令
- 注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]
- 例如:sudo find /etc/ -name interfaces(在文件夹下找到名字为inerfaces的文件)
创建shell脚本
例1:
第一步:创建hello_shell脚本
touch hello_shell.sh
#!/bin/bash
for ((i=0; i<10; i++));do
echo “hello shell”
done
exit 0
第二步:为文件添加可执行权限:chmod 755 hello_shell.sh
第三步:执行脚本./hello_shell.sh
例2:创建一个 C 语言“ hello world ”程序
vim hello_world.c
#include <stdio.h>
int main(void)
{
printf(“hello world!\n”);
return 0;
}
保存后使用 gcc 生成可执行文件:gcc -o hello_world hello_world.c
执行**./hello_world**
文件打包与解压缩
在讲 Linux 上的压缩工具之前,有必要先了解一下常见常用的压缩包文件格式。在 Windows 上最常见的不外乎这两种 .zip,.7z 后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外,还有 .rar,.gz,.xz,.bz2,.tar,.tar.gz,.tar.xz,*.tar.bz2。
zip压缩打包程序
压缩,例:zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
解压缩,例:将 shiyanlou.zip 解压到当前目录:unzip shiyanlou.zip
使用安静模式,将文件解压到指定目录:
unzip -q shiyanlou.zip -d ziptest
使用 unzip 解压文件时我们同样应该注意兼容问题,不过这里我们关心的不再是上面的问题,而是中文编码的问题,通常 Windows 系统上面创建的压缩文件,如果有有包含中文的文档或以中文作为文件名的文件时默认会采用 GBK 或其它编码,而 Linux 上面默认使用的是 UTF-8 编码,如果不加任何处理,直接解压的话可能会出现中文乱码的问题(有时候它会自动帮你处理),为了解决这个问题,我们可以在解压时指定编码类型。
使用 -O(英文字母,大写 o)参数指定编码类型:unzip -O GBK 中文压缩文件.zip
tar打包工具
压缩:tar -zcvf /root/hello.tar /root/a 将root目录下a文件夹打包为hello.tar放在root目录
解压缩:tar -zxvf /root/hello.tar 将其解压缩,tar.gz文件用z;tar文件可以不带z
文件系统操作与磁盘管理
查看磁盘和目录容量
- 使用 df 命令查看磁盘的容量(df -h更易看懂)
- 使用 du 命令查看目录的容量(du -h更易看懂)
Linux下的帮助命令
内建命令和外部命令
- 内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。
- 外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
帮助命令
help命令 help 命令是用于显示 shell 内建命令的简要帮助信息;其实外部命令基本上都有一个参数–help,这样就可以得到相应的帮助。
man命令
man 没有内建与外部命令的区分,因为 man 工具是显示系统手册页中的内容;
info命令
要是你觉得man显示的信息都还不够,满足不了你的需求,那试试 info 命令。
命令执行顺序控制与管道
顺序执行多条命令
例:sudo apt-get update;sudo apt-get install some-tool;some-tool
有选择的执行命令
例:which cowsay>/dev/null || echo “cowsay has not been install, please run ‘sudo apt-get install cowsay’ to install” (||在这里就是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令)
管道命令
管道是什么?管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
例:ls -al /etc | less执行完查询后再执行less查看
grep 命令,在文本中或 stdin 中查找匹配字符串;sort 排序命令;uniq命令可以用于过滤或者输出重复行。
Linux下软件安装
apt包管理工具介绍
我们需要定期从服务器上下载一个软件包列表,使用 sudo apt-get update 命令来保持本地的软件包列表是最新的(有时你也需要手动执行这个操作,比如更换了软件源),而这个表里会有软件依赖信息的记录,对于软件依赖,我举个例子:我们安装 w3m 软件的时候,而这个软件需要 libgc1c2 这个软件包才能正常工作,这个时候 apt-get 在安装软件的时候会一并替我们安装了,以保证 w3m 能正常的工作。
apt-get
apt-get 是用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等,下面列出一些apt-get包含的常用的一些工具:
- 安装软件包:apt-get install <软件包名>
- 重新安装:例:sudo apt-get --reinstall install w3m
- 卸载软件:例:sudo apt-get remove w3m
dpkg
使用 dpkg 从本地磁盘安装 deb 软件包。
使用dpkg -L查看deb包目录信息:sudo dpkg -L emac24
从二进制包安装
二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可。
Linux进程概念和管理
程序、进程
- 程序(procedure):不太精确地说,程序就是执行一系列有逻辑、有顺序结构的指令,帮我们达成某个结果。就如我们去餐馆,给服务员说我要牛肉盖浇饭,她执行了做牛肉盖浇饭这么一个程序,最后我们得到了这么一盘牛肉盖浇饭。它需要去执行,不然它就像一本武功秘籍,放在那里等人翻看。
- 进程(process):进程是程序在一个数据集合上的一次执行过程,在早期的UNIX、Linux 2.4及更早的版本中,它是系统进行资源分配和调度的独立基本单位。同上一个例子,就如我们去了餐馆,给服务员说我要牛肉盖浇饭,她执行了做牛肉盖浇饭这么一个程序,而里面做饭的是一个进程,做牛肉汤汁的是一个进程,把牛肉汤汁与饭混合在一起的是一个进程,把饭端上桌的是一个进程。它就像是我们在看武功秘籍这么一个过程,然后一个篇章一个篇章地去练。
- 简单来说,程序是为了完成某种任务而设计的软件,比如 vim 是程序。什么是进程呢?进程就是运行中的程序。
程序只是一些列指令的集合,是一个静止的实体,而进程不同,进程有以下的特性:
动态性:进程的实质是一次程序执行的过程,有创建、撤销等状态的变化。而程序是一个静态的实体。
并发性:进程可以做到在一个时间段内,有多个程序在运行中。程序只是静态的实体,所以不存在并发性。
独立性:进程可以独立分配资源,独立接受调度,独立地运行。
异步性:进程以不可预知的速度向前推进。
结构性:进程拥有代码段、数据段、PCB(进程控制块,进程存在的唯一标志)。也正是因为有结构性,进程才可以做到独立地运行。
并发、并行
- 并发:在一个时间段内,宏观来看有多个程序都在活动,有条不紊的执行(每一瞬间只有一个在执行,只是在一段时间有多个程序都执行过)
- 并行:在每一个瞬间,都有多个程序都在同时执行,这个必须有多个 CPU 才行
线程
而随着程序的发展越做越大,又会继续细分,从而引入了线程的概念,当代多数操作系统、Linux 2.6及更新的版本中,进程本身不是基本运行单位,而是线程的容器。就像上述所说的,每个部门又会细分为各个工作小组(线程),而工作小组需要的资源需要向上级(进程)申请。
- 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。因为线程中几乎不包含系统资源,所以执行更快、更有效率。
- 简而言之,一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 我们可以通过 & 这个符号,让我们的命令在后台中运行
Linux日志系统
- Linux中常见的日志一般存放在 /var/log 中。
本文总结实验楼学习资源得出;学习资源链接: 实验楼.