搜索
查看: 2297|回复: 31
收起左侧

[其他] Hello , Linux(二):Let's Start !

  [复制链接]
root1605
发表于 2017-12-2 02:03:59 | 显示全部楼层 |阅读模式
本帖最后由 root1605 于 2017-12-2 02:13 编辑
Hello , Linux(二):
Let's Start !




                                              目录

                                              Ⅰ 前言
                                              Ⅱ 一切都是文件
                                              Ⅲ Linux基础命令
                                             

By root1605
来自bbs.kafan.cn



上一篇:Hello , Linux(一):初入Linux的世界
https://bbs.kafan.cn/thread-2107544-1-1.html

评分

参与人数 10原创 +1 人气 +9 收起 理由
翼风Fly + 1 总是大半夜...
ericdj + 1 感谢老大提供分享
明月丶舞白衣 + 1 你不给我我给你
snakebone + 1 一篇很好的科普文章
4毛5的诺顿 + 1 版区有你更精彩: )

查看全部评分

root1605
 楼主| 发表于 2017-12-2 02:04:00 | 显示全部楼层
本帖最后由 root1605 于 2017-12-3 12:01 编辑

Ⅰ前言

抽象的思维方式
    不管是对于专业人员,还是业余爱好者,操作系统的机理都不是那么简单的,很多情况下,如果没有相关知识的积淀,即使你接触到某个系统机制背后的原理,你也无法或很难理解。对于不同程度的学习,就需要有不同的思维方式。从底层向上学习是可以的,如果方法得当,你能建立起坚实的地基,并很容易的在上面进行拓展,但这样对于非专业人员,不一定都合适,或者说代价很大。在你第一次使用Windows前,应该还没有接触过“寄存器”“堆栈”这些概念,然而你已经“会用”Windows操作系统了。当然,抽象思维是有局限性的,有些时候抽象思维不能真正理解一些东西
     换句话说,你可以忽略(暂时或永久)一些细节。这就像听收音机一样,作为普通使用者,你只需要懂得那几个按钮怎么用就行,作为维修人员,你就需要懂得其内部构造了,作为设计工程师,你可能需要相关的很多知识。
     软件开发人员也会使用抽象思维来开发应用程序以及操作系统等,比如Java中的各种包,C++ 标准模板库中的“迭代器”等等。

为什么讲的不“深入”
     讲的深入,学习者需要代价。并不存在所谓“入门到精通”的神话,要想学习Linux“深入”的地方,需要一个立体的知识网络,拿它来架设DNS服务器,你需要网络相关知识,拿它来学习操作系统原理,你需要的知识会更多。本系列文章不会特别涉及特定领域的应用,也不过分提到Linux编程,会有一些相对深入的内容,前几篇会注重广度,而后面的内容会详细的介绍一些需要详细理解的知识。但让楼主拿Linux作为平台,写什么“Intel 保护模式从入门到精通”之类的内容,肯定是不现实的。


Ⅱ 一切都是文件
     不管你之前有没有被“挂载点”“根目录”“VFS机制”等一大堆混杂在一起的术语所困扰过,反正要使用Linux,这些知识都需要理解的。下面就对这些知识做一些介绍。
     买个人电脑时,现在一般都预装的是Windows操作系统,少部分是Linux的某各发行版(比如Ubuntu),甚至还有没有操作系统的。要安装Windows操作系统时,我们都会碰到一个“分区”的概念,尤其是在一块全新的硬盘上安装操作系统,或者某些人“干掉”预装的正版Windows,切换到旧版本Windows时。我们下面就运用一下上文所提到的“抽象思维”。
      硬盘,通俗的理解,就是永久性存储数据的设备,不同于断电就丢失数据的内存。把它当作一个书柜,是的,它可以装书(这算是废话),但我们的书柜好像都是分层的吧?每一层,放相应的书。一不小心把某一层的书弄乱了,也不至于影响其它层的书。想象一下把这些隔板全都抽掉,一旦某一本书没放好,你的书可能都会掉下来,它们是互相影响的。一块硬盘,也就可以抽象地认为是一个书柜。我们在Windows下熟悉的“分区”概念,就相当于“隔层”。如图是“C盘”。

      先不考虑格式化C盘,分区具体有“哪些”作用,在大多数人眼中,C盘做系统盘,然后……大家都懂。就是数据从“逻辑上”隔离开,安装操作系统时,可以格式化系统盘,不影响其他盘(虽然,装系统不一定需要格式化分区)。这都没错。
      如果我说,Linux下没有什么“C盘”,“D盘”,也许你会认为你的数据会很不安全。Linux下也可以“分区”,像Windows那样,只是,这些“分区”的组织方式不同。
      我们还原一下Windows下全新安装操作系统时“分区”的过程,首先有一块未分配的空间,创建一个个分区,设置大小,选择文件系统(一般为NTFS,再格式化,并将Windows操作系统安装在其中一个分区上(一般是C盘),如图。当然,安装后也可以调整分区的。

      Linux在安装时,也大致是这样的,需要“分区”,实际上这里你可以认为分区之后,你已经有“几块”硬盘了。如图。创建“分区”时需要有文件系统格式,Windows上使用NTFS,一些特殊的分区(比如MSR分区,EFI分区等不是),而Linux使用(支持)的文件系统格式非常之多,有ext4,BtrFS,Reiser4,以及Windows所使用的NTFS(不能把Linux安装在那里)等,如果你的发行版不支持NTFS分区的读写,可以下载相关软件包。一般来说,如果你根本不清楚各个文件系统的适用条件,那么就选择ext4,一些具有特殊用途的分区除外。

      创建“分区”总得能够使用它吧?下面就介绍Linux下的目录树结构。
      Linux下的“磁盘”(也就是刚才分的区,把它们当作一个个磁盘来看待)不是“一等公民”,目录树,它就是一棵树,这个数的最顶端就是“/”目录(根目录),也就是说只有一个单独的顶级目录(目录类似于Windows中的文件夹)。而你的一个个“磁盘”需要“挂载”到某个目录,才能使用。比如你分了三个区,暂计为A,B,C。把B挂载到/home下,好了,这个时候访问/home目录,就相当于访问B盘,那么把A盘挂载到/目录(根目录下),根目录中的内容就存放到A中了,只是你访问文件的时候是直接访问/这个目录,而不是寻找一个A。那么问题来了,根目录是一且目录的根,根目录挂载到一个磁盘了,根目录下的某个目录挂载到另一个磁盘了,而这个目录又是“属于”根目录的,到底怎么回事?就举刚才这个例子,访问根目录目录下,你“感觉”不到你在访问磁盘,实际上你在访问A,根目录下属的/home目录,“打开”根目录还是会看到/home,但注意,这个时候只是在根目录中置放了一个/home目录的符号,一旦访问/home,就相当于跳转到了B,/home中的文件并不会占用A的空间。你不可能把根目录中的每一个目录都,比如/boot目录没有对应一个磁盘,那么它属于根目录,哪个磁盘挂载到了根目录,/boot目录中的内容就在这个磁盘中。所有目录都可以被挂载,你自己创建一个目录也可以。每个目录就是一个可用的“挂载点”。在Linux操作系统中,你可能更需要关心的是往哪个目录中存放文件,而不是哪个磁盘。
      其实,Windows文件系统实际上也只有一个根,用户层面上看到的是C盘、D盘这些东西,不管怎么说,它们并没有所谓优劣之分,盲目黑微软是很幼稚的行为。在内核里,分区的组织结构如下图:

      Linux下一切都是文件,是什么意思呢?我们不讨论它合不合理。“一切都是文件”需要VFS机制的支持。它向用户,应用程序,操作系统提供了一个通用的虚拟的接口,旨在一个操作系统中支持多个不同类型的文件系统。前面所说的的分区,就可以表示为/dev目录下的文件,比如/dev/hda(IDE设备),/dev/fd0(软盘)等等,/dev目录存放了设备文件,即设备驱动程序,假如使用了一张光盘,你需要将光盘内容挂载到一个目录,不是直接去访问/dev中的设备文件。/dev目录下甚至有一些不是设备的设备,比如/dev/null,它不代表什么真实的物理设备,类似于一个只写设备,向它写入的东西都会丢失掉,你也不会从它那里得到什么东西,类似于一个黑洞。
      根目录下的文件夹,可以自行搜索各个的用途,这里不再赘述。在安装操作系统的时候,最好将/home目录挂载到一个分区,/home目录类似于你的个人文件夹,/必须挂载到一个分区,另外还需要一个交换空间(大约等于物理内存大小即可),如果是以UEFI模式启动,另需要一个EFI分区。不需要把分区挂载到/boot目录下面,除非你的计算机非常老,不支持大容量硬盘,如果是这种情况,请分区时让第一个分区挂载到/boot目录下。


Ⅲ 基础Linux命令
       上一篇文章中已经提到一些关于Shell的东西。不要去死记硬背命令和参数,用的多了自然记得住,用的少的命令,只要会查阅资料,很快就能使用,你不可能记住所有的命令。
       这里所说的shell,也就是一个程序,接受从键盘输入的命令, 然后把命令给操作系统的相关模块去执行。所有的 Linux 发行版都提供一个名为Bash的来自GNU项目的shell。bash是最初Unix上由Steve Bourne写的sh的增强版,在Unix上,当时sh是不可或缺的。如果还不理解命令是什么,就看这个Windows下的命令提示符窗口,只是大多数人都认为它比Windows的命令提示符好用一些。Windows上有.bat脚本,就是把很多命令(以及相关的语法结构)组合在一起的批处理程序文件,Linux上的这种程序就叫做shell脚本。


       如果使用图形用户界面时,需要另一个叫做终端仿真器的程序来输入命令。一般不同发行版中叫法不同,但你应该很容易找到它。
       文本命令的shell只是一个工具,使用它,没有什么优越性可言,如果你的工作能够在这种方式下快速完成,那它就是好的方法,使用它不必去贬低图形界面。更不要受到一些影视作品的影响,误认为使用shell就是黑客,看着屏幕上刷刷的命令行以及输出认为自己就是高手了,那只是一种错觉,不行你在Ubuntu下试一下sudo apt-get update这个命令,也会出现一大堆的内容。
       来做做实验:输入“pwd”,会发现屏幕上立即出现了当前的工作目录,比如/home/雨樱,然后你想列出当前目录下有什么东西,可以用“ls”命令,屏幕上会出现你要的东西,要想更改工作目录,像Windows上的命令提示符,用“cd /”即可(切换到根目录)。
       “cd”命令带你去想去的地方,路径名可以由两种方式指定,一种是绝对路径,也就是从根目录开始,明确地写出你要去的目录的完整路径名,比如“/home/雨樱/pic/”,也可以用相对路径,也就是通过当前的目录进行“推导”,假设现在处于“/home/雨樱”目录,那么执行“cd ./pic”就可以了,“.”代表当前目录名。执行“cd ../music”表示,切换到上级目录下的“/music”目录,“..”表示上级目录。
       一个命令可以是以下四种形式:
①一个可执行程序,比如输入“bc”,它实际上是一个计算器程序,显示到终端窗口中了。
②shell函数,之后介绍
③别名,之后介绍
④shell本身就提供的命令,比如“cd”命令。
       输入“type”命令,屏幕上会显示出这是什么类型的命令。
       下面举个例子,使用命令“tar”,语法是
  1. tar(选项)(参数)
  2. 选项

  3. -A或--catenate:新增文件到以存在的备份文件;
  4. -B:设置区块大小;
  5. -c或--create:建立新的备份文件;
  6. -C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
  7. -d:记录文件的差别;
  8. -x或--extract或--get:从备份文件中还原文件;
  9. -t或--list:列出备份文件的内容;
  10. -z或--gzip或--ungzip:通过gzip指令处理备份文件;
  11. -Z或--compress或--uncompress:通过compress指令处理备份文件;
  12. -f<备份文件>或--file=<备份文件>:指定备份文件;
  13. -v或--verbose:显示指令执行过程;
  14. -r:添加文件到已经压缩的文件;
  15. -u:添加改变了和现有的文件到已经存在的压缩文件;
  16. -j:支持bzip2解压文件;
  17. -v:显示操作过程;
  18. -l:文件系统边界设置;
  19. -k:保留原有文件不覆盖;
  20. -m:保留文件不被覆盖;
  21. -w:确认压缩文件的正确性;
  22. -p或--same-permissions:用原来的文件权限还原文件;
  23. -P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
  24. -N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;
  25. --exclude=<范本样式>:排除符合范本样式的文件。
  26. 参数:
  27. 文件或目录:指定要打包的文件或目录列表。
复制代码

      什么是参数和选项?我们可以借助Windows下的GUI程序来理解。

      假设有个命令就是注册用户,那么图中文本框中可以填写的内容,就叫做“参数”,而选项卡里只允许选择“管理员”或者“普通用户”,这个就是“选项”。它们并没有那么复杂。根据以上的信息,猜猜下面这些命令是什么意思?
tar -zxvf /opt/soft/test/log.tar.gz
tar -ztvf log.tar.gz
tar -jcvf log.tar.bz2 log2012.log  
      本篇文章不详细讲解语法相关知识,所以目前看不懂或者写不正确也没关系,专门的针对shell的文章在后面。
      如果想知道一个命令的信息,怎么办?目前暂时提供三种方法:
①上搜索引擎,搜索相关用法,或者访问一些专门的网站,比如http://man.linuxde.net。这对新手来说相对友好。
②man命令,比如“man ls”,输入后,会有大量的关于“ls”这个命令的信息出现,比如参数,选项,示例等等。
③键入命令“whois ls”,即会接收到“ls”这个命令是干什么的的信息,
ls                   (1)  - list directory contents
ls                   (1p)  - list directory contents
④“info”命令例如“info ls”,
info页面比man page编写得要更好、更容易理解,也更友好,但man page使用起来确实要更容易得多。一个man page只有一页,而info页面几乎总是将它们的内容组织成多个区段(称为节点),每个区段也可能包含子区段(称为子节点)。理解这个命令的窍门就是不仅要学习如何在单独的Info页面中浏览导航,还要学习如何在节点和子节点之间切换。
更建议的是,有书作为参考,或者有人指导,刚开始时,你也许会不适应这种帮助文档,但很快,你会发现它很方便。


本篇文章的重点,在于理解Linux的目录结构,以及简单了解VFS机制,可能这些知识对于新手来说不那么友好,但熟悉之后会发现它也是很自然的设计。

评分

参与人数 2人气 +3 收起 理由
神话哈 + 1 不错啊
御宅一族 + 2 版区有你更精彩: )

查看全部评分

yang25
发表于 2017-12-2 08:05:47 | 显示全部楼层
楼主这么勤快的写这些,赶紧支持一下!
tank200706
发表于 2017-12-2 09:00:55 | 显示全部楼层
前排支持
ll1791
发表于 2017-12-2 09:32:47 | 显示全部楼层
不错


--来自ARCH用户
翼风Fly
发表于 2017-12-2 10:22:24 | 显示全部楼层
前来跑题
我前些年发的有关Windows分区的帖子:
https://bbs.kafan.cn/thread-1858220-1-1.html

为了减少不必要的相互影响(更重要的是为了方便维护),系统与应用往往会有许多抽象实现。当理解了这些,你会为这些逻辑称赞的

该收拾收拾上班了…
御宅一族
发表于 2017-12-2 10:25:47 | 显示全部楼层
神话哈
发表于 2017-12-2 11:39:26 来自手机 | 显示全部楼层
本帖最后由 神话哈 于 2017-12-2 11:41 编辑

这个windos区难道是指的图形界面操作系统区吗
root1605
 楼主| 发表于 2017-12-2 11:46:36 | 显示全部楼层
神话哈 发表于 2017-12-2 11:39
这个windos区难道是指的图形界面操作系统区吗

借宝地一用……

其他区不太合适
依班娜
发表于 2017-12-2 11:53:20 | 显示全部楼层
要不要直接开坑c++
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛|优惠券| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 苏ICP备07004770号 ) GMT+8, 2017-12-12 08:48 , Processed in 0.050975 second(s), 5 queries , MemCached On.

快速回复 返回顶部 返回列表