第3章
Linux基础
树莓派和Arduino之间的一大区别是操作系统。Arduino上运行的系统(如果你愿意,可以勉强称其为“操作系统”)只不过是一些添加到你的草图中的库文件,以及一个引导装载程序,以便更容易地将它们加载到ATmega的闪存中。树莓派,即使是Zero W型树莓派,运行的也是Raspbian—一个完整的Linux桌面系统。
你可以通过专业书籍对Linux/Raspbian进行深入学习。相反,我将从Linux/Raspbian的基础内容开始介绍,这些也是你现在就需要了解的,因为你已经把Raspbian安装到树莓派上了,从这里开始学习Linux/Raspbian,我称之为Linux快速上手。随着我们越来越深入地使用树莓派开展项目,我将更深入地研究我们所做工作的运行机制,这将有助于我们理解项目底层的运行方式。
3.1 导航
在第2章结尾处,我们已经完成了系统的安装,见到了Raspbian桌面。如果你正在寻找安全关闭树莓派的方法,可参见3.2节。
如果你是Linux用户,尤其是Ubuntu或其他基于Debian的版本的用户,那么对此会相当熟悉。对于其他用户,让我们对此做一个快速了解。
3.1.1 桌面
树莓派桌面非常简洁。左上角是树莓派图标,其下拉菜单内按类型列出了可以启动的应用程序列表。树莓派图标旁边的地球图标表示Web浏览器。它旁边的文件夹图标表示PCManFM,相当于Windows中的桌面资源管理器、Mac上的Finder以及各种Linux发行版中使用的众多文件管理器(Thunar、Nautilus等)之一。旁边是一个终端机,在接下来的章节中,我们将多次使用它,本章将对其简要介绍。小海胆图标表示声音效果工具Sonic Pi。其右侧是与搜索引擎图标相似的Wolfram/Mathematica图标。由于这两个应用程序对于我们正在进行的各种项目作用不大,我们将删除这两个应用程序以释放SD卡的空间。
回收站图标也位于左上角,在菜单(树莓派图标)和屏幕顶部面板中应用程序启动栏的下方,它由PCManFM处理。当我们在3.5节讨论创建和删除文件时,将更深入地探讨PCManFM。如果要清空回收站,右击回收站图标并选择Empty命令,然后按Return键。
MacOS X用户需要注意,回收站并不会自动切换模式变成卸载卷的弹出按钮,弹出按钮位于屏幕最上方面板的右侧。
在屏幕右上方有更多的图标。从右到左依次表示蓝牙、无线和有线网络、CPU使用监视器、数字时钟和之前提到的弹出按钮。
3.1.2 终端应用程序
图3-1显示了一个早期连接在树莓派上的经典数字设备VT220。当我们谈论终端应用程序时,这就是它在软件中模拟的内容。
1984年,苹果发布Macintosh系统,图形用户界面开始被广泛使用。在这之前,使用的是像图3-1这样的终端。我们仍然记得UNIX和扩展的Linux的命令行,作为一个类似UNIX的平台,MacOS X也是如此。Windows系统喜欢假装命令行不见了,但有时单击搜索图标并输入command prompt,你会看到类似的东西。终端现在几乎已经不再使用了,但是每一个主流操作系统仍然需要对终端进行软件仿真。终端命令很强大。
接下来单击屏幕顶部面板中的终端图标,或选择树莓派中Menu→Accessories→ Terminal命令,在终端窗口中输入who,会看到以下内容:
在这里,树莓派登录了两个用户(别担心,它们都表示你),一个用于控制台(在图形桌面下),另一个用于桌面本身。
本书中我们将经常用到终端。通常情况下,它更简单、更快,并且消耗的内存更少,特别是在Zero W型树莓派上,我们没有足够的内存可供使用,所以更加推荐使用终端。
3.1.3 网络浏览器
树莓派上的默认Web浏览器是Chromium,它是Google Chrome的开源版本。Chrome和Chromium最大的区别在于,Chromium使用的是Duck Duck Go搜索引擎而不是Google,这可以在Chromium的设置中进行更改。
3.1.4 桌面的背后
你有没有想过计算机里的“桌面”到底是什么?它来自哪里?什么软件让它运行?对于树莓派,我可以回答这个问题。
树莓派中的桌面和Linux中的一样,是一个软件栈,官方称之为PIXEL(Pi Improved Xwindows Environment Lightweight)。它源自LXDE—一种标准的Linux轻量级桌面,并且大部分LXDE组件仍被使用。顶部的工具条和其中的图标由LXpanel生成,壁纸和桌面文件图标由PCManFM管理。PCManFM也是LXDE,相当于MacOS X中的Finder、Windows中的Desktop Explorer、Linux中的Nautilus/Thunar等浏览器。LXpanel为你启动了PCManFM,而LXpanel由LXsession启动。顾名思义,LXsession是一个会话管理器,这意味着它会跟踪桌面上应该运行的应用程序,并在用户登录时启动它们。其中一个应用程序是X Window,它可以绘制屏幕上的所有窗口。
LXsession由LightDM启动,它是一个显示管理器。如果Linux要求你输入登录用户名和密码,那么你很可能是通过它的一个“问候语”程序与LightDM交谈。这就是它的全部工作。它会让你登录并启动会话管理器。
到目前为止,你可能想知道为什么没有要求我们输入用户名和密码来登录。答案是树莓派被配置为LightDM自动登录树莓派账户,无须询问。在3.3节,我们将介绍如何配置。
总结一下,PCManFM由LXpanel启动,LXpanel由LXsession启动,LXsession由LightDM启动。那什么启动了LightDM?答案是systemd,它是一个很大的系统,集很多功能于一体。大多数情况下,它启动服务,确保它们保持运行,并在出现情况时生成日志文件。Linux和UNIX以及所有类似UNIX的系统一样,都是由服务组成的。这些程序通常(但不是一直)在后台运行,称为守护进程。与所有守护进程一样,systemd也在后台运行,不与任何用户直接通信。如果你有对应权限,可以向它发送命令(我们将在本章中介绍),但是其他守护进程、用户程序等也可以向它发送命令。
systemd还启动了一个服务器,这个服务器首先为我们提供了一个窗口,叫作Xorg。
什么启动了systemd?那就是内核启动时创建的三个进程之一。
内核使Linux能够运行多个程序,它将内存和CPU时间分配给每个正在运行的程序,调节使用硬件的请求,还有许多其他功能。在Arduino中,操作系统是引导加载程序和在框架中默默添加的库,就像在Linux中,内核实际上可以称为操作系统。它可以完成那些隐藏在Arduino中的库所做的所有事情,甚至更多事情,这样多个程序就可以同时运行。
那么什么启动内核?树莓派有一个引导加载程序。在询问之前,引导加载程序是由系统芯片中内置的命令启动的。
总之,所有这些都是为了进入桌面。
你不必在把这些都记住后再去使用树莓派,但我想弄清楚树莓派与Arduino相比区别有多大。
如果引导程序没有运行,那么你的草图就不会运行。所有这些系统层次和守护进程都添加成功,最终就能出现我们所看到的桌面。
3.2 重启和关闭树莓派
与大多数现代桌面操作系统(即自20世纪80年代以来设计的操作系统)一样,Rasbpian/Linux不应该在没有警告的情况下关闭。当这种情况发生时,所设计的文件系统可以用来恢复系统,但是根据我的经验,如果经常这样做,你会把microSD卡搞得一团糟,以至于Raspbian无法恢复。现在我们来谈谈如何启动和关闭树莓派。这将在GUI/桌面以及终端窗口中以两种方式进行。
3.2.1 在GUI/桌面中启动和关闭树莓派
如果单击屏幕左上角的树莓派图标,然后转到菜单的底部并单击Shutdown,将看到如图3-2所示的下拉菜单。
- 单击Shutdown按钮可关闭树莓派。
- 单击Reboot按钮可重启树莓派。
- 单击Logout按钮将关闭会话并退出LightDM。你可以使用密码raspberry重新登录账户pi。我们将尽快更改密码。
3.2.2 在终端中启动和关闭树莓派
在以下情况下,你可以在终端窗口中完成以上全部功能。例如,当你从网络连接到一台树莓派或其他Linux计算机时,如果没有方便的GUI工具,要知道彻底关闭和仅仅关闭电源的终端命令之间的区别,并了解文件系统损坏的风险。
注意:也可以通过Ctrl+Alt+T键来打开终端窗口。
在命令行提示符(我使用的树莓派上命令行提示符是pi@Pi0w~$)之后输入systemctl halt命令完成关机。systemctl命令是特权命令,也是智能命令,以下是执行过程。
pi账户可以完成这项工作,它有sudo特权(稍后我们会介绍sudo)。此时密码仍然是raspberry。
此时,树莓派将关闭。我们需要对halt命令进行一些解释。在过去,当UNIX在小型计算机上运行时,就是这样关闭系统的:halt命令关闭了所有执行程序,但没有像现代计算机那样关闭系统的电源。
我们刚刚做的是软关机(仅关闭软件),但大多数系统也有硬关机(关闭硬件)。在过去,软关机的好处是你可以经常运行诊断软件来查看出了什么问题。随着个人计算机中ATX电源的出现,关机时直接关闭计算机电源成为可能,硬关机随后流行起来。树莓派不能关闭自己的电源,但从其他方面来看,它已经进入了关机状态。
注意:在你继续阅读本书的过程中,你会注意到许多Linux终端命令都可以追溯到20世纪80年代及UNIX出现初期。Linux从GNU项目中获得了很多终端环境。早期的GNU项目主要是为所有标准的UNIX工具提供开放源码的替代品,它们不会因为更改所有命令而让UNIX旧版本用户感到陌生。
要从终端窗口重新启动系统,请输入systemctl reboot。这将立即重新启动系统,无须输入密码,也无须进一步讨论。
注销可能更加复杂。这就是问题所在:还记得我们输入who并且得到两个登录用户吗?其中一个是你的会话,另一个是终端窗口。如果像以前那样,在终端窗口中输入exit,终端将结束其会话并关闭,但它不会让你退出桌面。
没有真正好的解决办法。从终端窗口退出,然后使用GUI注销,或者关闭树莓派,或者重新启动它。对于我们来说,因为我们的树莓派几乎都是只为一个用户(pi账户)设置的,所以不需要注销。
有一个小提示—如果你发现自己发送了一条不想发送的命令,或者命令似乎被卡住了,按Ctrl+C键有时可以停止命令,但是这个方式不太可靠。所以,最好经常使用命令行,提高手动输入命令的正确性,或者在按下Return键之前三思而后行,或者两者兼而有之。
3.2.3 命令摘要
下面是我们在本节中使用的终端命令摘要。
3.3 配置
现在我们可以轻松关闭、重启或注销树莓派了,但我们看到了另一个需要解决的问题:密码。每一个树莓派都以raspberry作为初始密码,这相当于给了你通往树莓派王国的钥匙。选择使用树莓派替代Arduino的原因之一是树莓派有联网功能,所以,我们要将树莓派连接到网络。在将树莓派连接到网络的过程中,还需要解决一些配置问题。可以使用命令行实用程序进行配置,但我们必须且仅需要配置一次(除非重新格式化microSD卡),所以我们将继续使用GUI版本。首先,让我们运行树莓派配置应用程序Raspberry Pi Configuration。
3.3.1 树莓派的配置应用程序
选择树莓派中Menu→Preferences→Raspberry Pi Configuration命令,将显示一个类似图3-3所示的配置对话框。
1. System(系统)选项卡
(1)Password(密码)
我们首先要做的是更改密码。即使你的树莓派不与公共互联网通信,更改密码也能防止其他用户闯入你的系统。
单击Change Password按钮并输入新密码,然后再次输入以确认。因为这是此系统上唯一的账户,如果你忘记了密码,重置密码是很麻烦的,所以请记好你的密码。
(2)Hostname(主机名)
在本书出现的一些屏幕截图中,你可能已经注意到我的终端窗口中的文本提示不一致。有时是pi@Pi3plus:~$,有时是pi@Pi0w:~$。实际上这是对两个不同的树莓派的终端窗口截图。主机名就是你在图3-3中设置的Hostname,所以你知道你在和哪个树莓派通信。这有助于管理网络名称,我们将在本章后面介绍网络名称。你希望此名称在你的网络中是唯一的。
(3)Auto Login(自动登录)
我们在3.1.4节曾经讨论过关于自动登录配置选项的内容。默认情况下,账户pi配置为自动记住用户,而不需要用户名或密码登录。当然,你可以决定是否自动登录。
不必每次都登录,使得你使用树莓派很方便,但如果你没有在物理层面采取安全性措施,就没有安全性。你总是可以把树莓派的microSD卡拔出来放在你的(Linux)台式机上,然后访问你想要的任何文件。
另一方面,有些人只需要使用一个键盘命令rm -R*就可以清除你在树莓派上所做的一切工作。这就是为什么由你决定是否自动登录。如果你把这个树莓派放在安全的地方,就可以让它保持自动登录,否则,请禁用自动登录,并且每次都使用用户名和密码登录。
注意,自动登录只适用于本地终端—键盘、鼠标和屏幕直接连接到树莓派的情况。
(4)Resolution(分辨率)和Overscan(过扫描)
分辨率和过扫描是视频设置选项。如果你的树莓派桌面看不到左右边缘,也看不到屏幕的顶部和底部,这时可能需要启用过扫描。同样,如果你感觉显示器的效果无法达到预期,请检查分辨率设置。有时树莓派自动设置的参数可能不合适。
2. Interfaces(接口)选项卡
树莓派配置窗口顶部的下一个选项卡是Interfaces选项卡。现在,你唯一想要的就是SSH(Secure Shell,安全外壳协议)。在本书中我们不会使用SSH。当你将键盘、显示器和鼠标切换回桌面,然后意识到忘记关闭树莓派时,使用SSH会非常方便。你可以通过SSH进入树莓派(ssh pi@pi.local),然后关闭终端,方法如前所述。假设你打开了SSH,并且假设你的树莓派连接到网络上。我们很快就会讲到这些。
3. Performance(性能)选项卡
就本书而言,我们不需要更改性能设置。如果你在树莓派上做了很多图形化的工作,你会发现它的视频性能很差,这时你可以调大系统的显存容量。同样,如果你的树莓派不使用图形控制台运行(在完成开发之后,你将对其添加SSH),那么你可以将其减少到最低—16MB。如果你的树莓派提供了超频功能,请记住,过去超频树莓派会破坏它们的SD/microSD卡上的文件系统。
4. Localization(本地化)选项卡
本地化设置(见图3-4)非常重要,会向树莓派提供键盘型号、所处的地区及时区(这样树莓派的自动网络时间系统就可以正常工作),以及你所在国家的WiFi频段。
你需要填写这些参数,尤其是键盘信息。如果你不知道有什么样的键盘,系统通常会在底部的信息板上弹出键盘类型,如果没有弹出,那么可以在网上搜索键盘型号。键盘布局很重要,因为命令行Linux依赖于某些标点符号,例如,正斜杠()、波形号(~)、感叹号()、at符号(@)、美元符号($)和星号(*),这些符号通常位于不同键盘上的不同位置。
你可能会想:“我们不是在NOOBS屏幕上设置了本地化信息吗?”是的,不过这里的关键是,我们将它设置为NOOBS系统,而不是安装的Raspbian系统。
设置完Localization选项卡后,继续并关闭树莓派配置应用程序。系统将要求你重新启动树莓派,此时,请务必重启系统。
3.3.2 WiFi和网络配置
在屏幕右侧的顶部面板上,应该有一组图标,如图3-5所示。
WiFi图标允许你打开和关闭WiFi,并允许你确定要使用的WiFi网络。单击图标,选择你的WiFi网络,然后像往常一样输入网络密码。
你的树莓派已经配置好,可以准备运行了。
3.4 安装和更新软件
你可能对安装和更新软件有所了解。当你下载一个操作系统的安装程序,或者更糟的是,得到软件的安装盘时,它们已经过时了,你需要更新软件。装有NOOBS的Raspbian版本很显然是过时的,所以我们需要更新系统。此外,还有一些在本书中并不需要使用的大软件包,所以我也将介绍如何卸载它们。
3.4.1 GUI软件安装程序
与大多数Linux GUI软件安装/升级系统一样,添加/删除软件程序功能(选择Rasp-berry中Menu→Preferences→Add/Remove Software命令)很适合用于查找你可能需要的应用程序。添加/删除软件程序功能对维护系统本身的用处并不大。为此,我们要用到终端窗口。选择树莓派中Menu→Accessories→Terminal命令,以防桌面顶部面板上的图标丢失。
3.4.2 apt-get包管理器
在像Raspbian这样的Debian派生系统上,最简单的包管理器是命令行apt-get系统。输入以下命令:
树莓派的响应如下:
稍后会列出大量的包:
这些是安装在你的树莓派上的所有包。事实上,Raspbian中的所有软件都被组织成包,并且所有软件都可以用apt-get安装、更新或删除。
想知道sudo是什么?简而言之,它将告诉系统使用root权限而不是普通用户权限来做你想要做的事情。它允许你更改系统文件。在3.6节中将深入讨论sudo。
1.删除包
下面是删除包的示例。我们不需要Wolfram Mathematica和知识管理系统,它们在microSD卡上使用了大量的空间。我们将删除它们,输入以下命令:
树莓派将响应:
我们确实想继续,所以输入Y或y。这里不区分大小写,但有时会提示要输入大写的Y来确保你已经注意到要删除包,防止误操作。
让我们继续删除sonic-pi,它不是很大,但对我们正在做的项目没有用。
接着是其他的包:
完成安装后,软件包就没有用了,可以删除了。
apt-get将会处理这些(它们被称为依赖项)。我们可以使用它删除未被安装的应用程序包使用的库。
也就是说,如果你使用的库与软件包一起安装,但你使用的软件不是用apt-get安装的,那么apt-get将无条件地删除你的库。这一点需要引起注意,但你可以随时手动重新安装库。
我们不涉及这样的问题,所以继续使用apt-get的autoremove命令将它们全部删除。
还有很多其他的包:
许多其他的包被删除并且触发器将被处理……
2.安装包
apt-get不仅仅是移除包的工具,它也可以帮助安装包,还可以检查是否已经安装过某个包,以免安装两次。在开始之前,我们应该确保包数据库是最新的。输入sudo-apt-get-update即可检测。要有耐心,更新可能需要几分钟。
既然我们的包数据库是最新的,我们将尝试安装Geany。Geany是我们将使用的编程环境,它是默认安装的,apt-get将给出相关信息,如下所示:
如预期的那样,Geany已经安装了。顺便说一下,包名称一般是小写的。
让我们安装一些小工具,这样你就可以在不弄乱microSD卡的情况下了解安装过程了。让我们安装最经典的UNIX工具:fortune命令。fortune命令是非常简练的命令。
由此可见,apt-get可以知道我们真正想要的包是fortune-mod。它将告诉我们下一步要安装哪些软件包。
它还推荐建立一个fortunes的附加库。这个附加库对于fortune包不是特别有用,但是如果你要安装一些软件来开发代码,可能需要库或其他数据,apt-get可能会给出建议。
显然,fortune-mod还依赖于许多其他的软件包。apt-get也为我们安装了这些软件包。apt-get释放包并设置所有包,触发器将它们添加到菜单、手册页和类似的内容中。
apt-get的交互性很好,而且知道接下来该做什么。
现在我们来试一下新安装的包。
3.系统更新
apt-get也是进行系统更新的工具。要更新整个系统,可以输入sudo apt-get dist-upgrade进行版本升级。升级Linux-speak的版本,意味着要安装Raspbian(在本例中)版本的所有更新包,即使它们包含内核。对于桌面Linux的安装来说,这有时可能是一个问题,因为复杂的驱动程序可能意味着内核升级会完全破坏图形界面(这是获得终端窗口技能的另一个好机会),但Raspbian具有非常小、相对固定的硬件集的优势。在大多数情况下,内核升级是安全的。与所有apt-get活动一样,在更新系统之前更新apt-get的数据库是一个非常好的建议。
前面已经介绍过了更新过程,这里我们将跳过它的输出。
apt-get建议更新libssl。libssl是用于加密Internet通信的安全套接字层。libssl很有用,我们要不断更新。
apt-get已经下载了所有更新。
有些软件包安装后,将运行自带的脚本,以完成新软件的配置—在Raspberry菜单中添加图标,或者更新传统的UNIX/Linux帮助系统的手册页。这些由软件包中的触发器处理。
有时系统将要求重新启动,但更多情况下,系统将不会要求重新启动。通常我都会重新启动系统。
4.命令摘要
下面是我们在本节中使用的命令。包含在<< >>标记中的内容表示必须填写的包名称。
3.5 文件系统导航
Arduinos实际上没有文件系统。它们只有闪存空间用于存储,如果你上传文件到Arduinos,通常你什么都看不到。当然,Linux拥有文件系统导航,要充分利用。
导航文件系统可以回答一些基本问题:
- 所处何处?
- 此处有哪些文件?
它还提供了以下功能:
- 创建文件。
- 创建目录。
- 删除文件和目录。
我们将把导航GUI/桌面方式和终端窗口方式的两种方法分解为这些问题和功能。
顺便说一下,如果你习惯使用Mac,那么对目录的概念可能有点陌生。别担心。目录和文件夹是同一事物的两个名称,通常在GUI中称作文件夹,在终端窗口/命令行中称作目录,但在Linux中,文件夹和目录可以一起使用。当你查看文件系统的内部组织结构时,它们是完全相同的。因为我一直使用终端/命令行环境,所以我总是将它们称为目录。
3.5.1 GUI/桌面
GUI/桌面文件系统导航由PCManFM处理。它的图标位于桌面顶部面板,靠近树莓派菜单图标。PCManFM也在树莓派菜单中。通过选择树莓派中Menu→Accessories→File Manager命令可以打开PCManFM。你将会看到类似图3-6所示界面。
1.所处何处
如图3-6所示,在PCManFM的顶部栏上,可以看到单词pi,这是你所在的目录。它也显示在标有Directory Tree(目录树)的栏中,这是pi账户的主目录。当你以pi的身份登录时,如果不进行干预,系统会自动执行这个操作。
2.此处有哪些文件
目录树还告诉我们哪些目录在pi目录中。比如图3-6中显示的Desktop、Documents、Downloads、Music等。如果你想转到其中一个目录,可以在目录树栏中单击它。
目录树不会告诉你给定目录中的文件信息,但PCManFM窗口的右侧栏中将显示文件信息。它重复目录列表(表示为文件夹),但也显示常规文件。例如,如果我想移动pi目录中名为910-rat.conf的文件到Downloads目录,那么我可以单击该文件并将其拖动到其附近的标有Downloads的文件夹图标上。你也可以将文件移至目录树上的任何位置。
3.创建文件
PCManFM允许你创建空文件。只需选择File→Create→Empty File命令就可以创建一个空文件。空文件有什么用?有时即使文件不包含任何内容,Linux仍需要知道它是否存在,空文件有时被用作文件锁(超出本书范畴,暂不讨论),或者用于必须有配置文件的程序等。在我们的例子中,创建文件对演示很有用。
- 特殊目录
单击目录树栏中的Downloads。如果其中还没有文件,现在就创建一个吧。此时目录树栏将变得很有用。嵌套目录,即目录内的目录,是类UNIX操作系统(如Linux)的一种文件组织形式。图标显示告诉你当前目录的内容,但你可以将文件从当前目录拖到目录树中的任何目录中。现在将空文件拖到桌面。
桌面是一个特殊的目录。刚刚发生了两件事。首先,当你拖动文件时,它并没有像我们最初将其移动到Downloads目录时那样从Downloads目录中移出。相反,我们创建了一个指向文件的快捷方式,并将该快捷方式固定在Desktop目录中。桌面也很特别,Desktop目录中的任何内容都显示在桌面上。回收站的图标是不是看起来像一个折了角的文本?这就是快捷方式。你可以通过快捷方式访问该文件。
- 链接
桌面上的快捷方式图标并不是一个实际文件,它只是实际文件的一个链接。如果你修改它,那么修改的将是Downloads目录中的副本。如果将其删除别名,也不会影响Downloads目录中的原始文件。
这需要对Linux文件在文件系统中的存储方式有相当深入的了解,要点是每个文件都有一个索引节点(inode,Linux中储存文件元信息的区域)指向它。这个文件的文件名是单独存储的,文件名指向inode,inode指向这个文件。快捷方式是另一个文件名,也指向这个文件名。如果删除该文件,该文件将消失,其inode将消失,其文件名也将消失。快捷方式不会消失,但它已被断开,无法工作。这在Windows和MacOS X中被大量使用。
- 硬(常规)链接
还有另一种类型的链接方式不再被广泛使用,称为硬(常规)链接。这种链接不指向文件名,而指向文件数据所在的inode。在类UNIX操作系统中,只要inode存在,文件就存在。只要至少有一个文件名指向该inode(或有程序使用了该inode),inode和文件数据就不会被删除。因此,这意味着如果有其他文件名硬链接到文件数据(而不是快捷方式,简称symlink),然后删除原始文件,那么你的链接仍然有效。如果链接与文件不在同一个目录中,那么文件现在会被神奇地复制到链接的目录中。
4.创建目录
我们已经学习了如何创建文件并移动它们,并且知道如何辨别打开的是哪个文件夹以及这个文件夹里都有哪些文件。接下来创建一些目录。选中Downloads,选择File→Create New→Folder命令(或者右击Downloads并选择Create New→Folder命令),应该打开一个类似于图3-7所示的窗口。
New是一个不错的文件夹名称(稍后我们将删除它),可以根据需要给文件夹重命名。毫不奇怪,你可以在Downloads目录中看到新的文件夹。如果单击Downloads旁边的“+”按钮,将看到名为New的文件夹现在是目录树的一部分,如图3-8所示。
这就是按钮“+”的功能,它能打开目录树的下一级目录。如果我们的新目录下还有子目录,它的“+”按钮将不会变灰,单击“+”按钮将会展开子目录。
5.删除文件和目录
删除文件的方法有很多。可以通过将需要删除的文件或目录拖动到回收站中进行删除,也可以右击文件或目录,然后选择Move to Trash命令。当PCManFM询问是否要将其移到回收站时,选择Yes。
与大多数GUI一样,你可以框选3个排在一起的文件,然后将它们一起拖到回收站中,一定要把回收站清空,否则,文件仍会占用空间。
3.5.2 终端
现在启动终端,选择Raspberry的Menu→Accessories→Terminal命令,或者选择位于屏幕左上面板的图标列表中的图标。
1.导航终端模式
你看到的是bash(bourne-again-shell)的文本输出,即pi@pi3plus:~$。对于Linux用户和MacOSX用户,这里的bash和你所习惯使用的bash完全一样。
就像CP/M有CCP、MS-DOS有COMMAND.COM、VMS有DCL一样,UNIX和UNIX风格的操作系统(包括Linux)一直拥有大量的shell。所有的shell都完成同样的工作—通过从键盘发送到屏幕的文本消息与用户进行交互,并允许用户通过名称调用其他程序。我们要调用的程序都是关于操作文件的。但我们需要多介绍一下你的终端窗口上有什么,提示实际上很重要。
2.提示
提示是在.profile脚本中设置的,在登录时调用该脚本。如果你想更改该文件,可以对其进行编辑。我觉得这个文件非常重要,因为该文件上设置了很多有用的信息。
在这个提示中有很多移动部件。最左边的部分是pi,代表正在使用的账户。我们用的是pi账户,全是小写。
@Pi3告诉我们在哪台机器上。在我们正在使用的这种网络环境中,了解你所使用的机器非常重要,尤其是在多台机器运行同一操作系统的情况下。我有6个不同类型的树莓派,它们都可以在任何给定时间连接到网络。因为我比较懒惰,所以给每个树莓派都只设置了一个账户pi。发现问题了吗?如果你想知道为什么给每个树莓派设置不同的名字很重要,就像我们在3.3节中所做的那样,这就是答案。
下一个提示是“~”,用于显示位于哪个目录下。
3.5.3 所在何处
正如我在第2章中提到的,UNIX风格的目录系统是一个涵盖文件系统的大树。它从root或/.开始,其下的任何目录都有一个名称,所以/bin、/boot、/dev、/home等都是/.中的目录(同样,作为参考,目录和文件夹是同一事物的两个名称。大多数图形操作系统上的图形文件夹都显示其目录的内容)。例如,在/home中,将能够为系统上的每个用户找到一个目录。目前的情况下只有一个:pi。如果我们现在写一个文件,而不告诉Raspbian放在其他地方,它就会出现在shell现在所在的位置。
要查看shell的位置,可使用一个shell命令pwd,该命令表示打印工作目录,接下来应该会显示/home/pi,这称为路径名。使用路径名,可以指定整个目录树中任何目录中的任何文件,/home位于主目录中,该目录位于根目录(/)中,pi目录则位于/home中。所以/home/pi表示从根目录转到home再转到pi。
“~”是主目录的快捷方式,无论它是什么。大多数Linux版本都使用/home/,但在不同的UNIX风格的操作系统中,这不是通用的。例如,MacOS X将用户主目录放在/User/中。相比之下,快捷方式“~”总是指向主目录,不管你使用的是哪种UNIX风格的操作系统。
注意:快捷方式“~”通常不在bash脚本中使用,必须指定完整的路径名。
可以通过输入tree来查看目录树视图,类似于PCManFM中的目录树视图。试试看,你会看到你的主目录里有多少内容。如果你使用过Chromium浏览器,会发现主目录里内容不少。
更改目录
正如你现在可能期望的那样,有一个专门的命令用于更改目录—cd。如果输入cd~/Downloads,将进入下载目录。记住,“~”是/home/pi的简写,所以我们现在进入了
/home/pi/Downloads目录中。还要记住,目录和文件名是区分大小写的。
这些文件看起来熟悉吗?是不是很像我在使用GUI导航之后忘记整理了?它们就是这样。你注意到提示改为pi@Pi3plus:~/Downloads$了吗?它表示我们正在Downloads目录下,这是pi账户下的一个目录(远离主目录)(这就是“~”的作用。我们很快就会再次用到)。
910-rat.conf文件与我之前提到的文件相同。我把它移到了Downloads目录中,New是一个目录,Test是我们创建的测试文件。以上是我的Downloads目录中的内容,但你的Downloads目录中可能没有任何内容。接下来,我们将使用pwd命令来查看我们的位置,使用cd命令可回到上一级目录,也就是目录树的根目录。另一个pwd命令将显示我们现在的位置,你也可以在提示中看到它。
注意“..”的用法。“..”可用于回到目录结构中的上一级目录,如返回到/home/pi。在这种情况下,我们也可以很容易地输入cd/home/pi或使用波形号的快捷方式“cd~”,它们可以实现同样的功能。在终端窗口中有很多方法可以达到同样的目的。
3.5.4 目录中有什么
ls是另一个非常有用的shell命令。和pwd一样,ls代表某种含义,在本例中代表list或list目录内容,它显示了bash当前目录中的所有文件和目录。下面列出了我的文档目录下的内容,你的看起来可能与之很像。
这些目录应该引起注意,它们与你从PCManFM中看到的完全一样。如果我们有别的文件,它们也会显示在这个列表中。想看看哪些是目录,哪些是文件?输入ls -l命令将看到详细信息。
现在,你的主目录中没有太多的内容,只是自动包含pi账户的各种目录。因为我们将bash设置为彩色代码输出,所以它们在任何彩色终端中都显示为蓝色。如果你的屏幕是黑白的,这将没有多大帮助,而且几乎不可能通过ls命令区分出哪个是文件,哪个是目录。幸运的是,ls有一个flags选项,可以通过该选项获取更多信息。3个最有用的标志是-l(小写的L)、-a和-l。
-l标志提供了一个长长的格式列表(这就是它所代表的),显示了关于每个文件的更多信息。
这些都是目录。现在我们可以看到,名称在最右边的列中,名称列的左边是修改日期和时间。
注意:创建或修改日期有时会被标记为1969年12月31日。事实上,它们不是在那时创建的。UNIX风格的操作系统从1969年12月31日开始以秒为单位保留时间。当ls -l没有获得有效的时间戳时,它显示了1969年12月31日这个最早的时间(类似零)。它们也可能与创建日期不同,如同你将在3.5.5节中看到的。
在时间列的左边是文件的大小,以字节为单位。注意,这是目录文件本身的大小,而不是其内容的大小。即便是根目录“/”,其中包含系统中的所有内容(大约为两三个千兆字节的文件),目录本身也只有4096字节。这有助于记住这一点:尽管目录可以包含其他目录和文件,但是对于UNIX风格的操作系统而言,它只是一个特殊的文件,其内容为文件名列表以及指向列表中索引节点的指针。名字和inode列表占用空间不大,因此是4096字节。
文件大小列的左边是组名,组名的左边是所有者名。这里有很多复杂的信息,在3.6.2节将进行讨论。
使用ls -l命令产生的详细信息的最左边的列是最复杂的部分,这是10个字母的序列。第一位(最左边)是类型字段。表示目录时,它始终是字母d。如果是“-”,则代表这是一个普通的文件。
剩下的9个字母分为3组,从左到右依次为所有者权限、组权限和全局权限,我们将在3.6节介绍这些内容。
相比之下,-a标志要简单得多。ls -a可以显示隐藏文件。有时使用隐藏文件很有用,可以阻止人们篡改文件,并使文件免受干扰。你可以使用文件名来隐藏文件,将“.”(点)作为第一个字符。Linux和MacOS X喜欢使用隐藏文件,主要用于配置桌面,有时还用于配置应用程序。
但使用命令ls -a后,将可显示隐藏的文件。
上面列出的这些文件可能与你得到的不一样,但重要的是,现在主目录中的所有文件都是可见的,包括.profile,它设置了bash的显示方式。“.”和“..”是另外两个快捷方式:“.”总是指你所在的目录,还有“..”总是指离根目录(向上)更近的一个目录。
我们也可以组合使用标志。因此,ls -al是以详细列表形式列出所有文件,包括隐藏的文件。你可以在你的树莓派上试一试。
ls命令除了接受标志外还接受参数。这意味着你可以给它赋一些值,告诉它你想去哪里。默认情况下,如果我们什么都不告诉它,它将假定我们需要当前目录。但实际情况不一定是那样的。
试着输入ls/usr/bin,屏幕上将出现很多文件。其中深蓝色显示的是目录,浅蓝色显示的是可执行程序。如果你看到了ls程序本身,那么输入ls-l/bin/ls。我得到的显示如下。
它不是一个目录,目前还没有开放所有的权限,目前的权限为root用户所有,位于root用户所在的组中,大约有108 804字节长,最后一次修改时间是2017年2月22日(对于新版本的Raspbian,这可能会有所不同。)
ls命令比较古老,列出的内容都是以字节为单位,这显然已经满足不了目前人们的需求。幸运的是,有一个更新的标志-h,它将文件长度转换为“适合人类阅读”的单位。K代表千字节,M代表兆字节,G代表千兆字节。我们可以将-h标志与其他标志(尤其是-l)一起使用,例如,输入ls -lh/bin/ls。
这里使用了千字节(kibibyte)为单位,大约是107KiB(在Linux工具的大多数情况下,都使用千字节为单位。)。这样可以提高可读性。
如果在ls命令后面加上目录名,你将看到这个目录下的内容,例如:
还有一个用于ls的标志-d。这对于编写脚本最有用,因为在脚本中,你不需要得到该目录中任何文件的列表,只需要知道该目录是否存在。例如,输入ls -d Downloads。它应该返回Downloads。同样,ls -d/bin/ls会告诉你文件/usr/bin/ls存在。
想看看你的microSD卡有多大的空间吗?输入du(用于磁盘)或者-h(提高可读性)。同样,如果你用过Chromium浏览器,答案将是很多。我的是172MiB,这也是一个很长的打印输出,我不建议你花费时间深入了解。
3.5.5 创建文件
在终端中创建空测试文件非常容易。就像大多数事情一样,有一个命令可以做到这一点,就是touch。
touch可以完成两件事:如果文件存在,它将更改ls中的最后修改日期,而不修改文件的内容。当你希望文件修改时间较新时,通常用这个命令编写脚本,这样做的目的是为了测试。
如果文件不存在,touch将创建该文件。
链接
在GUI部分的“链接”部分,我已经解释了符号链接(即索引节点inode)是什么。要在终端窗口中创建它们,请使用ln命令。它的语法可能有点混乱,所以我先把它写出来。
在这里,我将cd移至Videos(主要是因为它是空的)并创建一个链接到Downloads目录。
是的,这里有一个链接,让我们把cd放进去。
要知道处于哪级目录,加上pwd标志。p标志告诉pwd可以忽略符号链接。
可见我们已经在/home/pi/Downloads目录中了。
尽管cd会根据符号链接返回到Videos目录中,请注意,my_link_to_downloads本身并不是一个目录,所以我们可以只对其使用rm命令。现在,rm的使用似乎防止了rm -r使用符号链接不断运行,但是要注意,适用于他人的数据保护措施不一定适合保护你的数据。
3.5.6 删除文件
要删除终端窗口中的文件,只需要输入rm。例如:
首先,我们创建文件:
然后,使用ls命令查看文件是否存在:
将它和rm一起删除,并使用ls查看它是否消失。
与ls和touch一样,可以通过rm a pathname传递root目录的完整路径或任何快捷方式来访问不在当前目录中的文件。我们将创建一个文件在我的Downloads目录中,使用ls命令查看它是否在那里,然后使用rm命令。
3.5.7 创建目录
像创建文件一样,在Raspbian中创建目录非常简单,所使用的命令是mkdir。像ls、touch和rm(实际上大多数命令都将文件名作为参数)命令,可以在当前目录之外创建目录。
在这里,我们在所在的目录中创建了名为my_test的目录,这恰好是pi账户的主目录。我们不必一定在所在目录中创建新目录,而是可以通过提供路径在任何地方创建目录。这里,我们将使用目录树的root目录的完整路径“/”来告诉mkdir新目录的确切位置:in/home/pi/Documents,然后我们将使用/home/pi的“~”快捷方式来检查新建的目录是否存在。
此处是ls -d命令能派上用场的时机之一,你可以看到我在何处输入了ls ~/Documents/test_in_documents,也看到了没有任何反馈,这是因为该目录中没有任何内容,所以ls返回为空。当我用ls -d ~/Documents/test_in_documents再试一次时,显示的是目录自身。
3.5.8 删除目录和文件
尽管rmdir命令可以删除目录,但是几乎没有人使用这个命令。如果目录中有内容,rmdir命令的执行就会失败。如果想使用rmdir命令,必须进入要删除的目录,删除其中的所有内容,然后进入其中所有子目录,删除其中的所有内容,然后才能使用rmdir命令删除该目录。大多数人使用文件删除命令rm,文件将被删除,并给rm命令添加一个递归标志r,这将使目录中所有子目录都被递归删除。
假设我们有一个3层的目录树,看起来像这样:
我们只需要输入rm/home/pi/Downloads/directory_two_levels _below_documents/(其中“”是通配符,意思是“所有文件”),但首先我们还是要进入directory_under_documents目录。我们也可以先进入directory_under_documents目录,清空其中的内容,用cd命令返回,之后再利用rmdir删除这个目录。
我们可以用rmdir命令完成任务,但为什么不用呢?因为我们可以只用一条带有递归标志的命令,就能完成用rmdir命令进行的一系列烦琐的操作。递归标志r告诉rm进入它找到的任何目录并删除其中的选定文件。如果该目录中有子目录,进入这些子目录,重复删除工作。递归标志还允许rm删除空目录,否则rm不会删除空目录。
让我们从所在的目录中尝试一下。切换至Downloads目录,然后看看如果在这里使用递归rm将会删除什么。
一个普通的ls命令显示了我们想要删除的目录:directory_under_documents。让我们看看如果在文档下使用rm -r directory_under_documents会发生什么。
ls -R命令展示了目录directory_under_documents中有一个名为directory_two_levels_below_documents的子目录。然后使用ls -R命令发现directory_two_levels_below_documents是另一个目录,递归到其中,继续执行ls- R命令,发现这个子目录是空的。
我们将把它们删除。
再次使用ls命令进行查看,目录已经被删除了。
处理文件名中的空格
你可能已经注意到,我使用的或从终端访问的所有目录名都没有空格。这是惯例。在类UNIX操作系统中,空格对bash和大多数其他shell具有特殊意义。如果输入mkdir directory with spaces,将得到3个目录:directory、with、spaces。具体做法如下:
至少对于bash来说,通过下面的方法可以实现。
反斜杠字符()是转义字符。它告诉bash“不要将后面的内容视为特殊字符”。在这种情况下,bash不会将空格解释为参数之间的分隔符,而是忽略它,并将其放在目录名中。它在第二行文件的开头。这些词不再按字母顺序排列。使用ls -l命令可以看得更清楚,我利用带有通配符的cd命令进入了这个目录(cd directory with*)。明白为什么会有问题吗?每次处理包含空格的目录名或文件名时,都必须小心空格,如果忽略一个空格,文件名或目录名就会出错,再加上rm -r命令,很容易造成混乱。
在我看来,虽然在类UNIX的操作系统中允许出现空格,但建议不要在文件名或目录名中使用空格。
3.5.9 小结
简要总结一下本节内容:
- pwd命令显示位于哪个目录;pwd -p命令显示使用symlinks来到了哪个目录。
- ls命令显示有哪些文件。
- ls -l命令显示更多关于文件的信息。
- ls -lh命令以可读性更好的数字形式显示文件大小。
- ls -R命令从你的目录开始,递归地向下打开目录树,以显示所有目录。
- du -h命令展示了所用空间。默认情况下,它是递归的。
- touch命令更改文件的修改日期,如果文件不存在,则创建文件。
- ln -s命令创建指向文件或目录名称的符号链接。
- rm命令用于删除文件。
- rm -r命令用于递归地删除文件和目录,但如果不注意,可能造成严重的混乱。
- 在Raspbian文件名中使用空格会使从终端处理它们变得很困难。如果必须处理转义符,请在空格前使用转义符()。
- “*”是通配符。它告诉任何命令“匹配任何在我之前相同的文件”,所以cd directory和“*”将匹配任何以这种方式开始的文件。这在大多数现代操作系统中都是相当一致的,所以没有详细介绍。
如果需要更多帮助,输入man以获取Linux/UNIX帮助页。
3.6 权限和特权
如果需要删除/bin/ls怎么办?打开终端窗口试一试。
可见不能删除/bin/ls。让我们看看为什么。
在权限字段和所有者字段我们看到了什么?文件归root账户所有(我们将在权限字段和所有者字段完成后立即访问账户)。标志意味着,如果你可以读取它们,那么拥有它们的用户可以读取、写入、删除和处理它们;组成员可以读取和处理文件;其他人都可以处理文件(我们将在访问账户时访问组)。
简而言之,这就是我们不能删除/bin/ls的原因。
下面我们继续阅读。
3.6.1 用户和组
与大多数类UNIX操作系统一样,Raspbian支持多个用户。它的处理能力比Zero W型树莓派还要弱,内存也更少(但磁盘速度更快)。这种情况一直存在,因为将一些守护进程(如Web和电子邮件服务器)隔离在自己的账户中是一种方便的保持安全的方法,没有root文件(root本身是另一个用户。)
pi账户是一个用户,安全系统只关心这一点。root用户不同,它还有其他用户。打开终端窗口并输入cat/etc/passwd命令可以查看root用户下有哪些用户。
cat显示文本文件的内容。别担心,真正的密码没有存储在/etc/passwd中。
许多账户被阻止了。
这是pi账户。更多的用户都被阻止了。
查看关于pi账户的信息:
pi是用户名,x表示某处有一个密码。这两个参数很关键。pi账户是组1000中的用户1000(每个用户都有自己的组,但也可以有其他组)。这两个值附加添加到我们所创建的文件中,该文件存储我们所属的用户和组值。我们的主目录是/home/pi,而且我们使用/bin/bash作为shell。
当创建文件时,它被设置为由创建它的用户所拥有(在我们的例子中是1000),并与创建它的用户组相关联(还是1000)。这两个值是完全分开的,即使两个值都使用了相同的数字。
当试图访问该文件时,会向内核发送一个请求。内核检查你是否拥有该文件,如果你的用户号和文件号匹配,那就是你的文件。然后内核会检查你是否对其进行了权限限制,如果设置了权限,将按设置的权限约束你对文件的操作。如果你正在读取,最好设置用户组(拥有者)中的r标志。如果你正在写入(或删除),最好设置w标志。如果要将文件作为程序执行,则需要设置x标志。
如果该文件不属于你,内核将检查你是否与该文件属于同一组。pi账户默认所在组的值是1000。如果是,内核会检查拥有该文件的用户是否使用第2组3个标志限制了文件的组访问。标志本身是相同的:r代表读取,w代表写入/删除,x代表执行。
如果你不拥有该文件,并且不在组中,那么你是“other”,内核将检查第3组(从左边)名为other标志的设置。同样,标志也是同样的含义:r代表读,w代表写/删除,x代表执行。
有一些工具可以更改权限和组,但由于我们不打算使用这些功能,所以在这里不做介绍,如有需要,建议查找chmod、chgrp和chown。
让我们再来看看/bin/ls,了解一下我们正在阅读的内容。
现在我们可以看到如何执行/bin/ls,而不是执行rm。从左到右的标志告诉我们/bin/ls不是一个目录,拥有它的用户(root用户)可以读取、写入/删除和执行它。root的组(也称为root)可以读取但不能写入/删除,并且可以执行它。只有riff-raff(其他)用户(如pi)可以读取并执行该文件。如果愿意,我们可以在自己的目录中创建副本。可以调用(执行)它,但不能写/删除它。
文件权限对于Linux安全模型至关重要,因为在Linux中,一切都是文件。设备是文件、驱动器是文件、网络连接也是文件。如果你想享受与Raspbian的合作,那么必须了解文件权限、用户和组。当看到项目要求“这必须作为root目录运行”时,表示不会扰乱正确的排序权限。
有3个命令可用于更改给定文件的情况:
1. chown命令
chown命令用于更改文件的拥有用户。如果没有root权限,就不能用chown命令完成太多工作,所以我们将用sudo来进行尝试,稍后将加以解释。
可以看到我们更改了文件的拥有用户,但没有更改组。chown命令有两个参数,例如chown<要拥有该文件的用户>。
2. chgrp命令
我们把用户(拥有的)改回去,这样可以在完成对pi账户的处理后将该文件从pi账户中删除,然后用chgrp(change group)命令更改它的组。
chgrp命令与chown命令具有相同的限制,因此我们必须使用sudo,它的工作方式相同:chgrp<希望文件所在的组>。
3. chmod命令
UNIX/Linux的一个更令人讨厌的特性是,程序的名称经常被转换为一个更容易输入的名字。在这种情况下,更改文件权限的程序的名称是chperm,但事实并非如此。它是chmod,用于更改文件模式。
与其他两个命令不同,因为我们以前将文件的用户(拥有的)切换回了pi,所以可以在不使用sudo的情况下执行chmod命令,文件是否仍然在root组中并不重要。
你可能已经注意到,我已经尽力地将文件的所有者称为owner用户。这是因为chmod不将文件的所有者称为所有者,而是称其为用户。这是UNIX/Linux的另一件令人讨厌的事情,也是一件至今困扰着我的事情。
无论如何,chmod的工作原理都是这样的:
注意,在我们创建的文件上,实际上没有执行权限。为这个文件赋予执行权限,尽管它不是一个可运行的程序。
我对chmod u执行了user+x命令,添加执行标志。我们也授予组对此文件的执行权限。
其中,g代表小组。因为pi是文件的owner用户,所以理论上我们甚至可以更改root组都可以使用的权限。
你可以看到另一方面,既不是owner用户也不是组的用户,只能读取此文件。我们来解决这个问题。我们可以将写/删除和执行权限组合成一个命令。
现在,让我们从组和其他用户中去除所有权限。
去除权限的命令是这样的:chmod go(组或其他用户)-(去除权限)rwx(读取、写入/
删除、执行)。
注意:如果只输入chmod+rwx,则与输入chmod ugo+rwx的操作相同。它一次更改所有的3组权限。使用这个命令时要多注意,尤其是在root/sudo的情况下。
如果你熟悉二进制数,可以把实际的模式值添加到chmod。关于这一点此处不过多谈论,只想说x表示1位二进制数,w表示2位二进制数,r表示4位二进制数,所以chmod 777 相当于将文件所有者、组以及其他用户的权限设置为read(4,00000100)、write/erase(2,00000010)和execute(1,00000001)。有时你还会看到chmod那样做。我就是这样学会的。
3.6.2 root和sudo
最后,介绍root和sudo。与文件权限的概念一样,root的概念也是Raspbian的基础,甚至是所有类似于UNIX的操作系统的基础。
1. root用户
想看看我们经常讨论的这个内核吗?输入:
有趣吗?root用户拥有内核,所以root用户很特殊。当内核检查文件的权限时,如果请求用户是root用户,那么读和写/删除权限将被忽略。执行标志不是这样的。如果未设置执行权限,则不会运行任何程序,即使对于root用户也是如此。
root用户基于chown、chmod和chgrp的目的,还忽略文件的所有者。我们可以这样理解root权限:root用户可以将系统中的任何文件视为自己的文件。
注意:一些UNIX类的操作系统,出于“安全”方面的考虑,一直在不断地削弱root用户的权限,这使得系统很难管理。幸运的是,Linux并没有这样做。
2. sudo
从前,root用户也是一个用户,可以登录root用户以进行系统维护。这意味着整个系统的安全性依赖于一个密码的安全性,但是这个密码是多人知道并且可以使用的。
今天,除非运行Fedora或Red Hat Linux,否则几乎不会以root用户身份登录。大多数系统都禁用了root账户,因此你不能以root账户登录。有多种方法可以在不使用root账户的情况下完成系统维护,但是由Raspbian和所有Debian派生的Linux发行版都是用sudo进行系统维护的。
sudo背后的设计思想是系统所有者(机器的拥有者,或者至少拥有对机器的物理访问权的人)可以设置一个命令列表,负责维护系统的用户可以使用root权限执行这些命令。通常情况下,你需要输入密码,以防你离开后,其他用户监视你的账户。理想情况下,sudo命令只能登录后使用,未登录时不允许使用任何sudo命令。
在Raspbian系统中,sudo的设计相当自由。如果你启动sudo,则可以完成root用户可以做的任何事情,而根本不需要提供密码。在便携式的Linux机器上,对安全性的要求是不同的。所以sudo让你能够使用root权限,但是使用过程中需要采取额外的步骤。这可以防止灾难的发生,例如,当你意外地使用了rm -r命令,从而删除了系统中的大量数据。它会提醒我们注意,因为当前使用的是root特权,而不是一般权限。
3.账号、用户和密码
大多数人使用Linux和其他类UNIX的操作系统,但经常会分不清账户和用户之间的差别。账户和用户不一样,例如,我们已经看到root账户被禁用,而用户不会被禁用,这就是区别。
账户与用户
我们再来看看/etc/passwd文件中的pi账户。我将从3.6.1节的讨论中把这部分内容粘贴到这里。
这是一个用标记“:”分隔的列表,位于组和主目录之间,全部由逗号构成的块的内容包括人名、这些人所在的办公室,以前还会记录谁为上机时间买单。
关键是用户是1000,也称为jim。它在/etc/passwd中的账户中指定,但jim不是账户。这就是区别。通常使用账户创建用户ID。正如我之前所提到的,即使root账户被禁用,但你仍然可以以root用户的身份执行命令,理解这一点也很重要。
- 添加账号(和用户)
在pi上添加一个账户和一个用户,虽然不是很常用,但是如果想这样做,可使用命令add user。我不打算太多地介绍这个命令,但下面会给出它的代码。
- 密码
讨论账户问题,就必须介绍一下密码。我们已经从配置菜单中重置了pi的密码,但是完成这个功能的也是一个普通的Linux应用程序。我将介绍一条命令行,因为它最容易使用。它被称为passwd。
对于普通用户,可用passwd命令更改密码:
如果你在别人的账户上使用命令passwd,则必须使用sudo的root权限。为了进行演示,我创建了一个名为demo的账户,但在你的树莓派上可能没有这个账户。
如果你最终决定不更改密码,只需要按Return键,直到退出passwd,并显示一条错误消息,你可以忽略这条消息。
你可能会注意到这里提到了UNIX密码。这体现了Linux对UNIX的传承,在内核中,添加了由OSF(开源基金会)构建的许多应用程序,进而取代了标准UNIX实用工具。
3.7 内存和驱动程序
稍后,我们将深入讨论驱动程序。在这里,要先介绍一下这个概念,所以你可以有一段时间来慢慢理解什么是驱动程序。当我们再次讨论驱动程序时,就不会觉得陌生了。要理解驱动程序,必须理解内核空间和内存中用户空间的概念。
3.7.1 内存
从广义上讲,内存是用来存放字节的,这些是不放在CPU中的字节。显然,如果我们要让文件彼此分开,最好把内存也分开,处理方法完全一样,因为Linux中的所有资源都是文件。
尽管内存中划分了很多段,但Linux和所有类似于UNIX的操作系统一样,将内存划分为内核空间和用户空间。
1.内核空间
内核空间是内核处理业务的地方。在内核空间中有一个存储表,记录以下这类事情:“接下来,谁会得到哪个CPU核心”和“给这个用户分配多少内存”,它还存储了所有驱动程序。当你准备与图形系统或microSD卡,或者系统中的任何硬件通信,将会从程序发送消息到内核,内核根据你的权限和文件权限决定是否进行处理。
2.用户空间
所有不在内核中运行的程序都在用户空间内运行,即使它们属于root并由root运行。强大的systemd也在用户空间中运行。用户空间中的程序只能通过向内核发送消息,来要求内核完成一些工作。如果上述机制出现错误,就造成了安全漏洞。
3.7.2 驱动程序
驱动程序是在内核空间中运行的程序。从前,驱动程序必须编译到内核中,你可能没有接入任何设备就加载了驱动程序,也可能接入设备、向内核添加代码、重新构建整个内核,然后再重启以查看系统是否能够启动,以及驱动程序是否按照你所希望的那样运行。
现代Linux内核允许你在不重新启动的情况下从内核空间加载和卸载驱动程序。你现在只需要知道这些,我们将在后面的章节中深入探讨这个概念。
3.8 术语
在你使用UNIX风格的操作系统的过程中,针对我们所使用的Raspbian Linux,你将看到许多奇怪的术语。你可能想知道这些术语是怎么产生的。在这里,我们不谈UNIX风格操作系统的整个发展历史,只是简单介绍一下。UNIX风格操作系统是在20世纪60年代后期由贝尔实验室开发的,但现代大部分UNIX都是20世纪70年代初在加州大学伯克利分校这样的地方发展起来的。语言的选择有时会变得丰富多彩,如果不丰富,就会走向另一个方向—更容易输入。
这就是为什么大多数其他操作系统的进程会调用一个服务,也就是说,该服务程序位于后台,等待来自其他进程的消息,消息将唤醒这个服务程序并让它完成工作,这个服务程序称为守护进程。如果输入ps -eaf,则可以看到不属于你的一些进程(和线程,稍后我们将讨论),你可以看到几个守护进程:avahi-daemon、udevd、sshd等。
GNU或OSF的引用指的是GNU和OSF项目。这意味着它们从一开始就被编写成开放源码,可自由修改、自由使用和自由检查。几十年前,OSF开始用免费的开放源代码替换UNIX(这是一种专有软件),从最小的实用程序(gawk和现在的mawk,替代了awk)到编译器(GCC和CC)。OSF也打算用GNU Hurd内核来替换内核,但是Linus Torvalds写了Linux内核,比OSF至少抢先了25年(可以说,Hurd还没有完成)。
Linux的发行版是一个Linux内核,带有所有相关的(通常是开源的)软件,以构成一个完整的操作系统。Raspbian是Linux的发行版。
Debian也是Linux的发行版,Stretch就是基于Debian的,而Raspbian(本书中所使用的)和Ubuntu都是基于Stretch的,Stretch是世界上最流行的Linux发行版之一。
依赖关系是指一个程序依赖于另一个程序,至少从这个角度来看,依赖关系应该是操作系统的一部分。
deb文件是一个Debian风格的文档,包含一个软件和一个软件依赖项列表。debs由dpkg、aptitude读取,或者(在我们的例子中)apt-get将查看是否满足所有依赖项,也就是说,给定软件需要的所有依赖软件是否在特定目录中。如果没有,dpkg/aptitude/apt-get将通过互联网连接到与该Linux发行版相关的服务器,查看是否可以找到这些附加的软件,检查它们的依赖关系,直到满足所有依赖项,并且可以安装新的软件并按照预期正常工作为止。
本章是关于树莓派中Linux的生命力的,与相关书籍相比,本章并不长,你可能想知道为什么我在这里介绍了一点UNIX/Linux的历史,原因是你离不开历史,历史已经被编织到操作系统的结构中。我相信了解这些历史会使你更容易理解Linux以及在其基础上扩展的Raspbian。
3.9 本章小结
如果想使安装的Raspbian持续可靠地工作,你需要能够浏览文件系统、设置密码,最重要的是能够正确地关闭系统。你需要了解文件权限以及如何更改它们(使用chown、chgrp和chmod),所以你可以从命令行调用文件,并且需要知道如何使用Debian工具(apt-get)安装和删除包。这构成了Linux的快速入门知识,但只是Raspbian Linux操作系统功能的一小部分。在第4章中,你将了解C++,对于Arduino高手来说,它确实是一个老朋友。