1

GNU/ Linux使用基础

这篇博客没有任何意图成为一个大而全的使用教程, 在这里只是记录一下这几天做个小项目所用到/ 回忆到的基础知识, 方便快速入门. 文中的注释为了解内容, 文末为一些好的学习资料链接.

[TOC]

作为普通用户, PC端常见的操作系统有: Windows, Mac OS, 及类Unix系统(GNU/Linux).

1. GNU/ Linux选用

  • 作服务器| Fedora系列: CentOS, RedHat, Fedora
  • 个人开发 | Debian系列: Ubuntu, Debian (树莓派-Raspbian)
  • 喜欢折腾 | Arch Linux
  • 搞嵌入式 | 自行裁剪Linux

嵌入式设备的OS(可能的学习顺序): 裸机开发 -> uCOS-II -> uClinux -> Linux内核 -> Roadmap

其它: RT-Thread, Free RTOS, VxWorks, Windows CE

2. 系统安装

这一节是一般教程直接略去的地方, 我这里简述.

2.1 系统安装方案

个人开发, 我选用的系统为Ubuntu. 现在一般有两种主流的版本, 18.04和16.04. Linux的版本号是有讲究的, 这里不赘述. 我使用的是Ubuntu 18.04作为我开发深度学习的环境, 而Ubuntu16.04作为我安装Synopsys EDA Tools的环境. 系统安装, 一般有三种方案:

  1. 新买一台电脑, 折腾

    不现实.

    但是可以有另外一个方案: 买一个树莓派, 配置Raspbian, 学习基本操作.

  2. 给自己电脑安装双系统

    没问题, 但是最好有一定的电脑折腾经验, 否则操作不好可能会丢失原操作系统文件.

  3. 使用VMware一类的软件创建一个GNU/ Linux虚拟机使用

    推荐.

  4. 其它方案: 云服务器, 新手不推荐.

2.2 系统安装参考

如果选用方案1:

  • 自购PC: (因为是土豪玩家->)直接叫卖电脑的帮你装好/ 朋友圈50块大洋求助
  • 树莓派: 参考视频进行树莓派的选购与系统安装, 或自行谷歌

如果选用方案2:

  • 我的主力机是联想拯救者Y7000, 安装Windows和Ubuntu 18.04双系统的参考链接, 亲测可行

磁盘分配过程中, 如果碰到"Windows系统压缩卷时可压缩空间远小于实际剩余空间"情况参考.

我的电脑配置为: 8G + 8G DDR4, 100G + 375G Disk. 双系统主要是为了训练深度学习模型. 总共划分了100G给Ubuntu系统, 子项为:

/         20G;    //     主分区, 包含系统和软件, 尽量大
Swap     20G;     /*    类似Windows虚拟内存, 
                    物理内存为512Mb-2G时, swap设置为物理内存的2倍; 
                    物理内存为2G-4G时, swap设置为物理内存的1.5倍; 
                    物理内存在4G-8G时, swap设置等同物理内存; 
                    物理内存更大时, 设立为0.75倍; */
boot     512M;     //    启动分区, 包含操作系统内核和启动的程序, 200M - 1G
/Home     59.5G;    //    逻辑分区, 类似于Windows我的文档, 尽量大

如果选用方案3:

  • 可以网上找相关教程自行下载VMware安装
  • 我安装Synopsys EDA Tools的环境是Ubuntu 16.04, 使用的是虚拟机方案, 参考链接

3. 基本使用

GNU/ Linux在输入密码时是不会显示的, 输入时不要以为字没有打上去. 简单输完回车即可.

默认读者在系统安装步骤中已经完成了用户, 密码的设置, 并且成功进入了图形界面(这里指桌面).

GNU/ Linux系统提供两种交互方式:

  • GUI, 图形用户界面

    系统向用户提供图形的界面, 用户可以通过鼠标点击和键盘输入完成操作.

  • CLI, 命令行界面

    系统向用户提供用于操作的Shell, 用户通过输入命令完成操作.

GUI的操作方式与Windows和Mac OS几乎一致, 用于解决一些通用的任务(文档, 聊天, 视频, 游戏...). 而CLI操作才是GNU/ Linux系统的学习重点, 学习的话, 打开终端, 直面CLI即可.

这里又假设读者有一些简单的需求, 然后想使用CLI实现.

3.1 工作环境的概念

观察终端光标闪烁的那一行, 开头为Your_User_Name@Host_Name ~$. 其中, ~代表的是当前的工作环境. 为了理解这个工作环境, 我们可以进行一个简单的小实验.

首先我们知道有两个命令:

  • ls代表list, 即列出当前工作环境下的所有文件
  • cd代表convert to, 即切换当前的工作环境

于是我们首先输入

cd Desktop

然后回车. 可以看到闪烁光标的那一行的~已经变成了~/Desktop, 说明我们已经来到了~下的Desktop里了.

这里这个Desktop等价于我们的桌面. 然后我们输入

ls

然后回车. 可以看到, 什么都没有返回. 这是因为我们的桌面目前还什么东西都没有. 于是我们先最小化我们的终端程序, 然后在桌面鼠标右键, 新建一个文件夹, 取上一个自己的名字. 然后再打开终端程序, 再输入

ls

然后回车. 此时我们就可以看到它返回了我们桌面新建的文件的名字.

于是, 我们可以知道, 工作环境这个概念, 其中就是指, 我们当前处于那个文件夹内.

3.2 基本命令结构

终端里的输入的指令主要由三部分构成, 比如文件复制命令cp:

cp -r Desktop/test Desktop/test2

这个命令中, cp代表copy, 指的是一个应用程序,

-r是对程序进行指定的参数, 这里用于指定文件夹内的文件,

后面的Desktop/testDesktop/test2可以看作是应用程序的操作对象.

这个语句代表的意思是, 将桌面的test内的所有文件夹复制到桌面test2文件夹里.

这个可以自己先在桌面创建两个文件夹自己测试一下.

Anyway, 基本的命令结构为:

应用程序 -程序参数 一个或者多个操作对象

于是, 接下来的学习, 就可以是, 学习更多的命令, 认识它们的参数, 成为Linux达人, 但是这样终究是无聊的, 因为没有任务驱动.

所以, 我们下一步应该做的, 其实是给自己找个什么东西折腾一下,

  • 比如尝试一下用Linux下的C/C++工具链(GCC, G++, GDB);
  • 又比如配置个深度学习环境玩玩(Anaconda+Python+OpenCV+Pytorch+TensorFlow-GPU);
  • 比如搭建一个简单的基于LAMP(Linux, Apache, MySQL, PHP)的个人小网站, ...

折腾的时候, 基本上做的就是, 找个看起来靠谱的教程, 然后一行一行地跟着敲键盘.

可能很多命令都不知道怎么回事, 但是这个敲的过程, 首先就能纠正很多习惯性的Typo...

4. 稍微系统一点学习GNU/ Linux的使用

之前的折腾都是跟着别人的教程一直敲, 多上手练习手感, 也强迫自己去查一些基本的指令. 反正整多几次后, 常见的比如说ls, mv, cd, rm, mkdir, nano, su...这些应该都差不多有的印象了, 即收到某个简单的任务, 能够自己独立查找相关的帖子解决了.

而继续学习它的使用, 动机可能在于, 任务变得复杂了; 或者自己的需求比较特别, 网上没有现成的; 再或者, 开始踏入某个具体的领域, 那个领域里的人的分享, 都是默认你会使用GNU/ Linux的.

这个时候, 推荐的书籍为: 鸟哥的Linux私房菜. (建议买当下最新版本)

推荐的网络学习资料为: Linux 不入门到入门

这个阶段学习的时候, 如果出现看不懂的情况, 那是十分正常的, 原因在于, 这时候才是真正地开始学习一个操作系统. (之前使用Windows和Mac OS时都是使用的别人建立在操作系统上的应用系统 !)

如果真的对这块产生兴趣了, 可以自行翻阅 深入理解计算机系统 书籍, 进行计算机基础的扫盲.

再专业一点, 可以走这条路: 计算机组成原理 -> 操作系统原理 -> 计算机网络 -> (并行)计算机体系结构

GNU/ Linux的命令查询网址可以为: 查询

这个阶段学习重点可以是: 文件系统, 文本编辑器, 权限管理, Git+GitHub, 还可以再去了解几个远程访问工具.

5. 脚本语言

可以说, 学习完4中的基础后, 读者已经可以熟练地使用GNU/ Linux进行日常的工作了, 但是这并没有体现出使用CLI的优势. 此时应该再学习一种叫做脚本语言的东西, 它的主要作用在于, 能够快速地帮助用户快速地完成一系列繁琐的操作. 说到脚本语言, 最流行的, 一定非Python莫属. 主要的脚本语言有:

  • Python
  • Csh
  • Bash
  • Makefile
  • Perl
  • TCL

对于普通用户, 学完Python和Csh足够. 而做运维或者嵌入式前端可能得多学个Bash和Makefile. 然后做数字IC设计的话, 可能得学完.

6. 深入

到这一小节, 就不属于这篇博客题目"GNU/ Linux使用基础"所能够涵盖的范围了.

说到底, GNU/ Linux也只是一个操作系统而已, 所以我们可以从这些方面考虑:

  • 向下看: GNU/ Linux的移植与驱动开发

    对于嵌入式软件工程师, 一部分工作是, 基于操作系统进行应用的开发; 而另一部分的工作是, 对GNU/ Linux这个系统的内核进行裁剪和移植, 或者是为某种设备开发驱动. 前者需要对开发平台的软硬件都具备相当高的理解, 后者更是需要, 深刻地理解Linux内核的源码, 以及对操作系统所基于的硬件系统的熟悉.

  • 向上看: 网络应用, 服务器与运行维护

    如果我们不是嵌入式场景, 而换成大规模服务器集群的场景, 即成为了互联网公司的运维工程师, 则此时我们需要考虑的事情是, 怎么搭建一个更好的网络通信与开发平台, 供我们的后端/ 前端同学大展身手. 这种场景一方面需要对服务器架构十分熟练, 也需要很扎实的网络基础.

当然, Linux内核的源码也是美极, 可以学习别人的写代码的方式.

_Chance_Zhang
1 声望1 粉丝