各阶段开发人员必备!深入理解Linux系统管理(万字长文)

Posted 挽周的Java Library

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各阶段开发人员必备!深入理解Linux系统管理(万字长文)相关的知识,希望对你有一定的参考价值。

阅读前须知!

  • 深入理解Linux第二章系统管理篇

  • 本篇主要内容包括 Shell 基本命令、文件目录管理、软件包管理、磁盘管理、用户与用户组管理、进程管理等。通过本篇内容的学习,小伙伴们可以掌握Linux系统设置基础内容,并能应对日常的Linux系统问题。

  • 文章内容纯手敲,有异或错别字欢迎大家评论区指出!

  • 命令居多希望大家下去多练习!

  • 更多精彩内容还请访问:https://blog.csdn.net/weixin_45692705?spm=1011.2124.3001.5343


重要:为了更好的深入学习,请各位小伙伴务必按照以下序号进行阅读

序号标题
1Linux基础,系统概叙与虚拟机搭建+CentOS系统安装(建议收藏)

深入理解Linux第二章系统管理篇目录


一.Shell基本命令

  • 一直以来Shell 以其稳定、高效和灵活成为系统管理员的首选。本文主要介绍Shell的基本命令,包括切换目录、查找并查看文件、查看用户信息等。本文过后,读者还能够向用户手册寻求帮助。在开始这些内容之前,首先简要介绍一下究竟什么是 Shell。

1.Shell简介

  • 命令行和 Shell这两个概念常常是令人困惑的。在很多并不正式的场合,这两个名词代表着相同的概念,即命令解释器。然而从严格意义上讲,命令行指的是供用户输入命令的界面,其本身只是接受输入,然后把命令传递给命令解释器。后者就是Shell。从本质上讲,Shell 是一个程序,它在用户和操作系统之间提供了一个面向行的可交互接口。用户在命令行中输入命令,运行在后台的Shell 把命令转换成指令代码发送给操作系统。Shell 提供了很多高级特性,使得用户和操作系统间的交互变得简便和高效。

  • 目前,在Linux环境下有几种不同类型的Shell,常用的有Bourne Again Shell(BASH),TCSH Shcll、Z-Shell等。不同的Shell提供不尽相同的语法和特性,用户可以使用任何一种Shell。在 Linux 上,BASH shell 是默认安装和使用的Shell。本文章中所有的命令都在BASH下测试通过。当然,读者如果有兴趣,也可以尝试使用其他类型的Shell.

查看你正在使用的shell解释器

echo $0 

2.约定

  • Linux命令行界面有一个输入行,用于输入命令。在 BASH中,命令行以一个美元符号“$”作为提示符,表示用户可以输入命令了。下面就是一个Shell提示符,表示命令行的开始。
$
  • 如果正在以root身份执行命令,那么Shell提示符将成为“#”,如下所示。
#

本文中的命令将以 提示符+命令+注释 的形式给出。以下面这个命令为例

$ sudo dpkg -i linuxqq_1.0-Preview1_i386.deb        ##安装QQ for Linux
  • 其中,“$”符号为命令行提示符,“sudo dpkg -i linuxqq_1.0-Preview1_i386.deb”是命令,而“##”后面的文字则是注释。注释是为了更清楚地解释命令用途而添加的,在实际使用过程中并不会出现。读者在使用时只需要输入命令部分。需要提醒的是,Linux的命令和文件名都是区分大小写的。也就是说,SUDO和 sudo是不一样的

注意:在BASH的美元提示符前,一般还会有一段信息,包括用户名、主机名和当前目录。一个完整的提示符如下:

[root@localhost ~]$

3.快速上手,浏览你的硬盘

本文将全程采用权限最高的root用户。

  • 本节将带领读者浏览自己计算机上的文件系统。这里的命令都非常简单,以期给读者带来一个整体的印象。稍后将详细讲解各类基本命令。

  • 首先,打开终端进入根目录看看里面都有些什么。

  • 可以看到,Linux安装完毕后自动在根目录下生成了大量目录和文件。在后续章节中,将逐一讨论这些目录的用途。

  • 下面选择home进入。这个目录中存放着系统中所有用户的主目录。主目录的名字就是用户名。在作者的计算机上,只有一个mzc用户。

  • 可以使用不带任何参数的cd命令进入用户主目录。主目录下存放着一些配置文件和用户的私人文件。用户主目录默认对其他用户关闭访问权限。

  • 下面到/etc目录下看一看。这个目录存放着系统以及绝大部分应用软件的配置文件(这里只列出了其中的一部分)。和 Windows不同,Linux 使用纯文本文件来配置软件。修改配置文件可以很方便地对软件进行订制。

  • 查看一下 fstab这个文件,其中定义了各硬盘分区所挂载到的目录路径。

  • 小伙伴们还可以选择其他目录进入并察看相应的文件,看看Linux 都安装了一些什么。接下来。在正式介绍命令之前,首先来看一些BASH的特性,这些特性可以帮助我们提高工作效率。

4.提高效率,使用命令行补全和通配符

  • 文件名是命令中最为常见的参数,然而每次完整输入文件名是一件很麻烦的事情,特别足当文件名还特别长的时候。幸运的是,BASII 提供了这样一种特性——命令行补全。在输入文件名的时候,只需要输入前面几个字符,然后按下Tab键,Shell 会自动把文件名补全。

例如在/etc目录下输入cat fs +键盘tab键 Shell 会自动将其补全为cat fstab

[root@localhost etc]# cat fstab 

如果以已键入的字符开头的文件不止一个,那么可以连续按下Tab键两次,Shell 会以列表的形式给出所有以键入字符开头的文件,例如在/etc/目录下:

[root@localhost etc]# cat b
bash_completion.d/ bashrc             binfmt.d/          bluetooth/         brltty/            brltty.conf  

事实上,命令行补全也适用于所有Linux命令。例如输入ca并按下 Tab键两次时,如下:

[root@localhost etc]# ca
cacertdir_rehash     cache_metadata_size  cairo-sphinx         calibrate_ppa        canberra-gtk-play    capsh                case                 catman               
cache_check          cache_repair         cal                  caller               cancel               captoinfo            cat                  
cache_dump           cache_restore        ca-legacy            canberra-boot        cancel.cups          caribou-preferences  catchsegv 
  • 注意:系统命令本质上就是一些可执行文件,可以在/usr/bin/目录下找到。从这种意义上讲,命令补全和文件名补全其实是一回事。

  • 另外,Shell有一套被称作通配符的专用符号,它们是*?[ ]。这些通配符可以搜索并匹配文件名的一部分。从而大大简化命令的输入,这使得批量操作成为可能。

*用于匹配文件名中任意长度的字符串。例如需要列出当前目录中所有的.login结尾的文件,命令如下:

[root@localhost etc]# ls
abrt                     cgsnapshot_blacklist.conf   enscript.cfg        gshadow-       libaudit.conf             nfsmount.conf      pulse             security            tcsd.conf
adjtime                  chkconfig.d                 environment         gss            libibverbs.d              nsswitch.conf      purple            selinux             terminfo
aliases                  chrony.conf                 ethertypes          gssproxy       libnl                     nsswitch.conf.bak  python            services            tmpfiles.d
aliases.db               chrony.keys                 exports             host.conf      libreport                 ntp                qemu-ga           sestatus.conf       trusted-key.key
alsa                     cifs-utils                  exports.d           hostname       libuser.conf              ntp.conf           qemu-kvm          setroubleshoot      tuned
alternatives             cron.d                      favicon.png         hosts          libvirt                   numad.conf         radvd.conf        setuptool.d         udev
anacrontab               cron.daily                  fcoe                hosts.allow    locale.conf               oddjob             rc0.d             sgml                udisks2
asound.conf              cron.deny                   festival            hosts.deny     localtime                 oddjobd.conf       rc1.d             shadow              unbound
at.deny                  cron.hourly                 filesystems         hp             login.defs                oddjobd.conf.d     rc2.d             shadow-             updatedb.conf
at-spi2                  cron.monthly                firefox             idmapd.conf    logrotate.conf            openldap           rc3.d             shells              UPower
audisp                   crontab                     firewalld           init.d         logrotate.d               opt                rc4.d             skel                usb_modeswitch.conf
audit                    cron.weekly                 fonts               inittab        lsm                       os-release         rc5.d             smartmontools       vconsole.conf
autofs.conf              crypttab                    fprintd.conf        inputrc        lvm                       PackageKit         rc6.d             sos.conf            vimrc
autofs_ldap_auth.conf    csh.cshrc                   fstab               ipa            machine-id                pam.d              rc.d              speech-dispatcher   virc
auto.master              csh.login                   fuse.conf           iproute2       magic                     passwd             rc.local          ssh                 vmware-tools
auto.master.d            cups                        gconf               ipsec.conf     mail.rc                   passwd-            rdma              ssl                 wgetrc
auto.misc                cupshelpers                 gcrypt              ipsec.d        makedumpfile.conf.sample  pbm2ppa.conf       redhat-release    sssd                wpa_supplicant
auto.net                 dbus-1                      gdbinit             ipsec.secrets  man_db.conf               pinforc            request-key.conf  statetab            wvdial.conf
auto.smb                 dconf                       gdbinit.d           iscsi          maven                     pkcs11             request-key.d     statetab.d          X11
avahi                    default                     gdm                 issue          mke2fs.conf               pki                resolv.conf       subgid              xdg
bash_completion.d        depmod.d                    geoclue             issue.net      modprobe.d                plymouth           rpc               subuid              xinetd.d
bashrc                   dhcp                        GeoIP.conf          java           modules-load.d            pm                 rpm               sudo.conf           xml
binfmt.d                 DIR_COLORS                  GeoIP.conf.default  jvm            motd                      pnm2ppa.conf       rsyncd.conf       sudoers             yum
bluetooth                DIR_COLORS.256color         ghostscript         jvm-commmon    mtab                      polkit-1           rsyslog.conf      sudoers.d           yum.conf
brltty                   DIR_COLORS.lightbgcolor     gnupg               kdump.conf     mtools.conf               popt.d             rsyslog.d         sudo-ldap.conf      yum.repos.d
brltty.conf              dleyna-server-service.conf  GREP_COLORS         kernel         multipath                 postfix            rwtab             sysconfig
centos-release           dnsmasq.conf                groff               krb5.conf      my.cnf                    ppp                rwtab.d           sysctl.conf
centos-release-upstream  dnsmasq.d                   group               krb5.conf.d    my.cnf.d                  prelink.conf.d     samba             sysctl.d
certmonger               dracut.conf                 group-              ksmtuned.conf  nanorc                    printcap           sane.d            systemd
cgconfig.conf            dracut.conf.d               grub2.cfg           ld.so.cache    netconfig                 profile            sasl2             system-release
cgconfig.d               drirc                       grub.d              ld.so.conf     NetworkManager            profile.d          scl               system-release-cpe
cgrules.conf             e2fsck.conf                 gshadow             ld.so.conf.d   networks                  protocols          securetty         target
[root@localhost etc]# ls *.login
csh.login
[root@localhost etc]# 

*相类似的通配符是?。但和*匹配任意长度的字符串不同,?只匹配一个字符。下面的例子中,?用以匹配文件名中以text开头而后跟一个字符的文件。

[root@localhost opt]# ls
rh  testA  test_A  testB  testBS  testD
[root@localhost opt]# ls test?
testA:

testB:

testD:
[root@localhost opt]# 

5.查看目录和文件

  • 本节将介绍目录和文件的操作命令,这些可能是用户最常用到的命令了。其中的一些在“快速上手”环节已经尝试过了,这里将作进一步讲解,详细讨论命令各个常用选项。小伙伴们应该始终牢记的一点是,应该用肌肉,而不是头脑去记忆这些命令和选项。

显示当前目录:pwd

  • pwd命令会显示当前所在的位置,即工作目录。例如,执行如下命令:


小贴士:读者可能会问一个问题,既然在BASH的命令提示符前,会显示当前工作路径名,那么为什么还需要pwd这个命令呢?答案是这个特性并不是所有Shell都采用的.在Freebsd等操作系统中,BASH并不自动显示当前目录。因此即便在某个版本的Linux 中,pwd 显得完全没有必要,这并不意味着在其他版本的UNIX/Linux系统中,pwd也是无用的。

改变目录:cd

  • cd命令是在Linux文件系统的不同部分之间移动的基本工具。当登录系统之后,总是处在用户主目录中。这个目录有一个名字,也就是“路径名”,它是由/home/开头,后面跟着登录的用户名。

  • 输入cd命令,后面跟着一个路径名作为参数,就可以直接进入另外一个子目录中去。举例来说,使用下面的命令进入/usr/bin子目录。

  • 在/usr/bin子目录时,可以用以下命令进入/usr子目录

  • 在/usr/bin子目录中还可以使用下面的命令直接进入根目录,即“/”目录。

  • 最后,总能够用下面的命令回到自己的用户主目录。

  • 或者


提示:在Shell 中,“..”代表当前目录的上一级目录。而“.”则代表当前目录.另外,“~”代表用户主目录,这个符号通常位于Esc键下方。

列出目录内容:ls

ls命令是list的简化形式,ls 的命令选项非常之多,这里只讨论一些最常用的选项。

  • 不带任何参数的ls命令,用于列出当前目录下的所有文件和子目录。例如:

  • 白色:表示普通文件
  • 蓝色:表示目录
  • 绿色:表示可执行文件
  • 红色:表示压缩文件
  • 浅蓝色:链接文件 主要是使用ln命令建立的文件
  • 红色闪烁:表示链接的文件有问题
  • 黄色:表示设备文件
  • 灰色:表示其他文件
  • 但是这些文件就是主目录下所有的文件了吗?尝试一下-a选项。如下:

  • 这次看到了很多头部带“.”的文件名。在 Linux上,这些文件被称作隐含文件,在默认情况下并不会显示。除非指定了-a选项,用于显示所有文件。

  • 另一个常用选项是-1选项。这个选项可以用来查看文件的各种属性。例如:

  • total:代表总用量
  • -表示是普通文件,第一个字符有几种情况:-表示普通文件,d代表目录,l代表连接文件,b代表设备文件。
  • -rwxrw-rw- 表示文件的权限,linux中有三种文件操作权限:分别为读(r),写(w),执行(x).
  • 第一个root表示这个文件的所属用户是root
  • 第二个root表示这个文件的所属用户组是lan这个组
  • 接下类的数字 101 表示文件的大小,也就是字节数。 101表示101字节
  • 接下来的是,文件最近一次修改的时间
  • 最后就是文件名了
  • 在ls命令后跟上路径名可以查看该子目录中的内容。例如:

列出目录内容:dir和vdir

  • Windows用户可能更熟悉dir这个命令。在Linux 中,dir除了比ls的功能更少,其他都是一样的。

  • vdir 相当于为ls命令加上-1选项,默认情况下列出目录和文件的完整信息。

查看文本文件:cat和more

  • cat命令用于查看文件内容(通常这是一个文本文件),后跟文件名作为参数。例如:

  • cat可以跟多个文件名作为参数。当然也可以使用通配符:

  • 对于程序员而言,为了调试方便,常常需要显示行号。为此,cat命令提供了-n选项,在每一行前显示行号。

  • cat命令会一次将所有内容全部显示在屏幕上,这看起来是一个致命的缺陷。因为对于一个长达几页甚至几十页的文件而言,cat显得毫无用处。为此,Linux 提供more命令来一页一页地显示文件内容。如下:

  • 可以看到,more命令会在最后显示一个百分比,表示已显示内容占整个文件的比例。按下空格键向下翻动一页,按Enter键向下滚动一行。按Q键退出。

阅读文件的开头和结尾:head和tail

  • 另两个常用的查看文件的命令是head和 tail。分别用于显示文件的开头和结尾。可以使用-n参数来指定显示的行数。


注意,head命令的默认输出是包括了文件名的(放在-->和<--之间)。tail的用法和head相同。

更好的文本阅读工具:less

  • less 和 more非常相似,但其功能更为强大。less 改进了more命令的很多细节,并添加了许多的特性。这些特性让 less 看起来更像是一个文本编辑器——只是去掉了文本编辑功能。总体来说,less命令提供了下面这些增强功能。
命令符号描述
/字符串向下搜索“字符串”的功能
?字符串向上搜索“字符串”的功能
n重复前一个搜索(与 / 或 ? 有关)
N反向重复前一个搜索(与 / 或 ? 有关)
b向前翻一页
d向后翻半页
q退出 less 命令
空格键向后翻一页
向上键向上翻动一行
向下键向下翻动一行
  • 下面简单地介绍less 命令的使用方法。以/etc/cgconfig.conf文件为例,输入下面这条命令。

  • 可以看到,less在屏幕底部显示一个冒号:等待用户输入命令符号。具体符号可以参考上方表格。

  • 使用带参数-M的less命令可以显示更多的文件信息,如下:

  • 可以看到,lcss 在输出的底部显示了这个文件的名字、当前页码、总的页码,以及表示当前位置在整个文件中的位置百分比数值。最后按下Q键可以退出less程序并返回Shell提示符。

查找文件内容:grep

  • 在很多时候,并不需要列出文件的全部内容,用户要做的只是找到包含某些信息的一行。这个时候,如果使用more命令一行一行去找的话,无疑是费时费力的。当文件特别大的时候,这样的做法则完全不可行了。为了在文件中寻找某些信息,可以使用grep命令。
grep [OPTIONS] PATTERN [FILE...]
  • 例如,为了在文件drirc中查找包含 device的行,可以使用如下命令:

  • 可以看到,grep 有两个类型不同的参数。第一个是被搜索的模式(关键词),第二个是所搜索的文件。grep 会将文件中出现关键词的行输出。可以指定多个文件来搜索,例如:

  • 严格地说,grep通过“基础正则表达式( basic regular expression)”进行搜索。和grep相关的一个工具是cgrep,除了使用“扩展的正则表达式( extended regular expression)”,egrep 和grep 完全一样。“扩展正则表达式”能够提供比“基础正则表达式”更完整地表达规范。正则表达式将在后续文章中详细讨论。

指定目录下查找文件:find

  • 随着文件增多,使用搜索工具成了顺理成章的事情。find 就是这样一个强大的命令,它能够迅速在指定范围内查找到文件。find命令的基本语法如下:
find [OPTION] [path...] [expression]
  • 例如,希望在/usr/bin/目录中查找zip命令:

  • 从这个例子中可以看到,find 命令需要一个路径名作为查找范围,在这里是/usr/bin/ 。find 会深入到这个路径的每一个子目录中去寻找,因此如果指定/,那么就查找整个文件系统。-name选项指定了文件名,在这里是zip。可以使用通配符来指定文件名。如find~/ -name *.c-print将列出用户主目录下所有的c程序文件。-print 表示将结果输出到标准输出(在这里也就是屏幕)。注意find命令会打印出文件的绝对路径。
  • find命令还能够指定文件的类型。在 Linux 中,包括目录和设备都以文件的形式表现,可以使用-type选项来定位特殊文件类型。例如,在/etc/目录中查找名叫init.d的目录:


find命令的-type选项可供使用的参数

参数含义
b块设备文件
c字符设备文件
d目录文件
f普通文件
p命名管道
l符号链接
  • 还可以通过指定时间来指导find命令查找文件。-atime n用来查找最后一次使用在n天前的文件,-mtime n则用来查找最后一次修改在n天前的文件。但是在实际使用过程中,很少能准确确定n的大小。在这种情况下,可以用+n表示大于n,用-n表示小于n。例如,在/usr/bin/中查找最近100天内没有使用过的命令(也就是最后一次使用在100天或100天以前的命令)。

  • 类似地,下面这个命令查找当前目录中,在最近一天内修改过的文件。

快速定位文件:locate

  • 尽管find命令已经展现了其强大的搜索能力,但对于大批量的搜索而言,还是显得慢了一些,特别是当用户完全不记得自己的文件放在哪里的时候。这时,locate命令会是一个不错的选择。如下:

  • 这些搜索结果几乎是一瞬间就出现了。这不禁让人疑惑,locate 究竟是如何做到这一点的?事实上,locate并没有进入子目录搜索,它有一点类似于Google的桌面搜索,通过检索文件名数据库来确定文件的位置。locate命令自动建立整个文件名数据库,不需要用户插手。如果希望立刻生成该数据库文件的最新版本,那么可以使用updatedb命令。运行这个命令需要有root权限,更新整个数据库大概耗时1分钟。

查找特定程序:whereis

  • whereis命令主要用于查找程序文件,并提供这个文件的二进制可执行文件、源代码文件和使用手册页存放的位置。例如,查找find命令:

- 可以使用-b选项让 whereis命令只查找这个程序的二进制可执行文件。

  • 如果whereis无法找到文件,那么将返回一个空字符串。

  • whereis无法找到某个文件的可能原因是,这个文件没有存在于任何whereis命令搜索的子目录中。whereis命令检索的子目录是固定编写在它的程序中的。这看起来多少有点像是个缺陷,但把搜索限制在固定的子目录如/usr/bin、/usr/sbin和/usr/share/man中可以显著加快文件查找的进度。

用户及版本信息查看:who

  • 在一台服务器上,同一时间往往会有很多人同时登录。who命令可以查看当前系统中有哪些人登录,以及他们都工作在哪个控制台上。

  • 有些时候,可能会忘记自己是以什么身份登录到系统,特别当需要以特定身份启动某个服务器程序时。这个时候, whoami这个命令会很有用。正如这个命令的名字那样, whoami会回答“我是谁”这个问题。

  • 另一个常用的命令是uname,用于显示当前系统的版本信息。带-a选项的uname命令会给出当前操作系统的所有有用信息。

  • 在大部分时候,需要的只是其中的内核版本信息。此时可以使用-r选项。

寻求帮助:man

  • 在Linux中获取帮助是一件非常容易的事情。Linux为几乎每一个命令和系统调用编写了帮助手册。使用man命令可以方便地获取某个命令的帮助信息。

- man命令在显示手册页时实际调用的是less程序。可以通过方向键或J键(表示向下)、K(表示向上)键上下翻动。空格键用于向下翻动一页。按下Q键则退出手册页面。man手册一般被分成9节,各部分内容如表5.2所示。

man手册的组织

目录内容
/usr/share/man/man1普通命令和应用程序
/usr/share/man/man2系统调用
/usr/share/man/man3库调用,主要是libc()函数的使用文档
/usr/share/man/man4设备驱动和网络协议
/usr/share/man/man5文件的详细格式信息
/usr/share/man/man6游戏
/usr/share/man/man7文档使用说明
/usr/share/man/man8系统管理命令
/usr/share/man/man9内核源代码或模块的技术指标

获取命令简介:whatis和apropos

  • man手册中的长篇大论有时候显得太啰嗦了——很多情况下,人们只是想要知道一个命令大概可以做些什么。于是,whatis满足了大家的好奇心。

- whatis从某个程序的使用手册页中抽出一行简单的介绍性文字,帮助用户了解这个程序的大致用途。whatis的原理同locate命令基本一致。

  • 与之相反的一个命令是 apropos,这个命令可以通过使用手册中反查到某个命令。举例来说,如果用户想要搜索一个文件,而又想不起来应该使用哪个命令的时候,可以这样求助于apropos。

  • 可以看到,apropos将命令简介(其实就是whatis的输出)中包含“search”的条目一并列出,用户总能够从中找到自己想要的。

二.文件目录管理

  • 使用文件和目录是工作中不可回避的环节。通过前面的章节,读者已经积累了一些文件和目录的操作经验。本章将进一步介绍如何使用Shell管理文件和目录。在正式讲解相关命令之前,有必要介绍一下Linux目录结构的组织形式。小伙伴们应该已经在之前的文章大概了解了整个文件系统,但仍对此心存疑惑。

1.Linux 文件系统的架构

  • 正如大家看到的一样,Linux目录结构的组织形式和 Windows有很大的不同。首先Linux没有盘符的概念,也就是说Linux 系统不存在所谓的C盘、D盘等。已建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来实现磁盘读写。正如读者在安装Linux时所注意到的那样。其次,Linux似乎不存在像Windowsl这样的系统目录。在安装完成后,就有一堆目录出现在根目录下,并且看起来每一个目录中都存放着系统文件。最后一个小小的区别是,Linux使用正斜杠/而不是反斜杠\\来标识目录。

  • 既然Linux将文件系统挂载到目录下,那么究竟是先有文件系统还是先有目录?和“先有鸡还是先有蛋”一样,这个问题初看起来有点让人犯晕。正确的说法是,Linux需要首先建立一个根/文件系统,并在这个文件系统中建立一系列空目录,然后将其他硬盘分区(如果有的话)中的文件系统挂载到这些目录中。

  • 理论上说,可以为根目录下的每一个目录都单独划分一个硬盘分区,这样根分区的容量就可以设置得很小(因为几乎所有的东西都存放在其他分区中,根分区中的目录只是起到了映射的作用),不过这对于普通用户而言没有太大必要。

  • 如果某些目录没有特定的硬盘分区与其挂钩的话,该目录中的所有内容将存放在根分区中。

提示:说了那么多,有一个概念始终没有作解释,究竟什么是文件系统?这个问题将在后续的文章中详细讨论。这里,读者只要简单地把它理解为磁盘或者分区的同义词就可以了。

Linux系统主要目录以及其内容

目录内容
/bin构建最小系统所需要的命令(最常用的命令)
/boot内核与启动文件
/dev各种设备文件
/etc系统软件的启动和配置文件
/home用户的主目录
/libC编译器的库
/media可移动介质的安装点
/opt可选的应用软件包(很少使用)
/proc进程的映像
/root超级用户root的主目录
/sbin和系统操作有关的命令
/tmp临时文件存放点
/usr非系统的程序和命令
/var系统专用的数据和配置文件

2.共享文件

  • 共享文件对一个团队而言非常重要。团队的成员常常需要在一台服务器上共同完成一项任务(如开发一套应用软件)。下面介绍如何实现用户间文件的共享。假设这个团队的成员在服务器上的用户名分别是zll、fjn,它们都属于workgroup这个用户组,可以用以下的命令模拟这个场景。

  • 首先在/home目录下建立一个名为work 的目录,作为这个小组的工作目录,注意需要root权限。


  • 现在,任何人都可以访问这个新建的目录,而只有root用户才拥有该目录的写权限。现在希望让 workgroup组的成员拥有这个目录的读写权限,并禁止其他无关的用户查看这个目录。

  • 接下来需要将这个目录交给一个组长zll(现在 work目录的所有者还是root 用户)。

  • 现在,所有属于这个组的成员都可以访问并修改这个目录中的内容了,而其他未经授权的用户(除了root)则无法看到其中的内容。举例来说,zll在/home/work目录下新建了一个名为test的空文件,那么同属一个组的用户fjn 如果认为这个文件没有必要,可以有权限删除它。

3.建立文件和目录

  • 本节将介绍如何在Linux中建立文件和目录,这是文件和目录管理的第一步。

建立目录:mkdir

  • mkdir命令可以一次建立一个或几个目录。下面的命令在用户主目录下建立document、picture两个目录。

  • 用户也可以使用绝对路径来新建目录。


  • 相信大家创建的时候会报这个错误,这是因为当前在用户主目录下并没有test这个目录,自然也无法在 test下创建job目录了。为此mkdir提供了-p选项,用于完整地创建一个子目录结构。

  • 在这个例子中,mkdir会首先创建test目录,然后创建job。在需要创建一个完整目录结构的时候,这个选项是非常有用的。

建立一个空文件:touch

  • touch命令的使用非常简单,只需要在后面跟上一个文件名作为参数。下面这个命令在当前目录下新建一个名为hello的文件。

  • 用touch命令建立的文件是空文件(也就是不包含任何内容的文件)。空文件对建立某些特定的实验环境是有用。另外,当某些应用程序因为缺少文件而无法启动,而这个文件实际上并不那么重要时,可以建立一个空文件暂时“骗过”这个程序。

  • 用touch命令建立的文件是空文件(也就是不包含任何内容的文件)。空文件对建立某些特定的实验环境是有用。另外,当某些应用程序因为缺少文件而无法启动,而这个文件实际上并不那么重要时,可以建立一个空文件暂时“骗过”这个程序。

  • touch命令的另一个用途是更新一个文件的建立日期和时间。例如,对于hello这个文件,使用ls-1命令显示这个文件的建立时间为11点43分。

  • 使用touch命令更新后,建立时间变成了当前时间。

  • touch命令的这个功能在自动备份和整理文件时非常有用,这使得程序可以决定哪些文件已经被备份或整理过了。关于文件备份,可持续关注后续文章。

4.移动 复制和删除

  • 通过上述的学习小伙伴们已经能够创建文件和目录。本节将继续讨论如何移动、复制和删除文件及目录,这是在文件和目录管理中另一个基本操作。下面首先从移动文件开始讨论。

移动和重命名:mv

  • mv取了move 的缩写形式。这个命令可以用来移动文件。下面这条命令将hello文件移动到bin目录下。

  • 当然也可以移动目录。下面这条命令把 Photos目录移动到/home目录下。

  • Linux没有“重命名”这个命令,原因很简单,即没有这个必要。重命名无非就是将一个文件在同一个目录里移动,这是mv最擅长的工作。

  • 因此对mv 比较准确的描述是,mv可以在移动文件和目录的同时对其重命名。

复制文件和目录:cp

  • cp命令用来复制文件和目录。下面这条命令将文件test复制到/home目录下。

  • cp命令在执行复制任务的时候会自动跳过目录。为此,可以使用-r选项。这个选项将子目录连同其中的文件一起复制到另一个子目录下。

删除目录和文件:rmdir和rm

  • rmdir命令用于删除目录。这个命令的使用非常简单,只需要在后面跟上要删除的目录名作为参数即可。

  • 但是rmdir命令只能删除空目录,删除有内容的目录会提示错误。

  • 因此,在使用rmdir 删除一个目录之前,首先要将这个目录下的文件和子目录删除。删除文件需要用到rm命令。稍后将会看到,rm同样可以用来删除目录,而且比 rmdir更为“高效”。由于这个原因,在实际使用中rmdir很少被用到。

  • rm命令可以一次删除一个或几个文件。下面这条命令可以搭配通配符使用删除Ptest目录下所有的所有文件。值得注意的是删除较多的文件避免一一确认可以使用下面选项,进行操作。

符号作用
-i删除前逐一询问确认。
-f即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r将目录及以下之档案亦逐一删除。

注意:使用rm命令的时候应该格外小心,特别是以 root身份执行该命令时。

5.文件和目录的权限

  • 很难想像没有权限的世界会变成什么样子。随便哪个用户都可以大摇大摆地“溜”进别人的目录,然后对里面的文件乱改一气。当然,他自己的文件也可能正经历着同样的命运。Linux是一个多用户的操作系统,正确地设置文件权限非常重要。

权限设置针对的用户

  • Linux 为3种人准备了权限——文件所有者(属主)、文件属组用户和其他人。因为有了“其他人”,这样的分类将世界上所有的人都包含进来了。但读者应该已经敏感地意识到,root用户其实是不应该被算在“其他人”里面的。root 用户可以查看、修改、删除所有人的文件——不要忘了root拥有控制一台计算机的完整权限。

  • 文件所有者通常是文件的创建者,但这也不是一定的。可以中途改变一个文件的属主用户,这必须直接由root用户来实施。这句话换一种说法或许更贴切:文件的创建者自动成为文件所有者(属主),文件的所有权可以转让,转让“手续”必须由root 用户办理。

  • 可以(也必须)把文件交给一个组,这个组就是文件的属组。组是一群用户组成的一个集合,类似于学校里的一个班、公司里的一个部门……文件属组中的用户按照设置对该文件享有特定的权限。通常来说,当某个用户(如zll)建立一个文件时,这个文件的属主就是zll,文件的属组是只包含一个用户zll的zll 组。当然,也可以设置文件的属组是一个不包括文件所有者的组,在文件所有者执行文件操作时,系统只关心属主权限,而组权限对属主是没有影响的。

提示:关于用户和用户组的概念,在后面文章会进行详细讲解

  • 最后,“其他人”就是不包括前两类人和root 用户在内的“其他”用户。通常来说,“其他人”总是享有最低的权限(或者干脆没有权限)。

需要设置那些权限

  • 可以赋予某类用户对文件和目录享有3种权限:读取(r)写入(w执行(x)。对于文件而言,拥有读取权限意味着可以打开并查看文件的内容,写入位控制着对文件的修改权限。而是否能够删除和重命名一个文件则是由其父目录的权限设置所控制的。

  • 要让一个文件可执行,必须设置其执行权限。可执行文件有两类,一类是可以直接由CPU执行的二进制代码;另一类是Shell脚本程序。

  • 对目录而言,所谓的执行权限实际控制了用户能否进入该目录;而读取权限则负责确定能否列出该目录中的内容;写入权限控制着在目录中创建、删除和重命名文件。因此目录的执行权限是其最基本的权限。

查看文件和目录的属性

  • 使用带选项-1的ls命令可以查看一个文件的属性,包括权限。首先来看一个例子:

  • 这条命令列出了/bin/login文件的主要属性信息。下面逐段分析这一行字符串所代表的含义。
  • 第1个字段的第1个字符表示文件类型,在上例中是-,表示这是一个普通文件。
  • 接下来的rwxr-xr-X就是3组权限位。这9个字符应该被这样断句:rwX、r-X、T-X,分别表示属主、属组和其他人所拥有的权限。r表示可读取,w表示可写,x表示可执行。如果某个权限被禁用,那么就用一个短划线-代替。在这个例子中,属主拥有读、写和执行权限,属组和其他人拥有读和执行权限。
  • 第3个和第4个字段分别表示文件的属主和属组。在这个例子中,login 文件的属主是root 用户,而属组是root组。
  • 紧跟着3组权限位的数字表示该文件的链接数目。这里是1,表示该文件只有一个
  • 最后的4个字段分别表示文件大小(37208字节)、最后修改的日期,以及这个文件的完整路径(/bin/login)。
  • 最后,不带文件名作为参数的ls-1命令列出当前目录下所有文件(不包括隐藏文件)的属性。

以上是关于各阶段开发人员必备!深入理解Linux系统管理(万字长文)的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 Linux 内存子系统

深入理解 Linux 内存子系统

必备技能之数据仓库的理解

软件测试各阶段测试人员的职责

测试人员沟通任务

大数据开发-深入理解大数据Lambda架构