Raspberry Pi(树莓派)初始配置记录

我在Raspberry Pi上安装的系统是官方推荐的几个系统之一:Arch Linux ARM(这不是第一推荐的那个Raspbian)。
一开始我也是先尝试使用官方推荐的Raspbian,但是由于在刷好系统之后,进入系统之前进行配置的时候,对键盘布局的配置无论如何都无法保存,一直有一个error,导致无法正常使用键盘,所以我最终只能放弃了它,转而使用Arch Linux ARM,这就意味着自己需要做很多的配置工作了。

下面各项,就是我在折腾的过程中遇到的各种问题以及解决办法。

【1】关于分区
如果你是在Windows下刷的Arch Linux ARM系统,那么,你可能是用官方推荐的Win32DiskImager软件来刷的。Arch Linux ARM的镜像文件(一个.img文件)有约1.8G大,用Win32DiskImager将其刷到SD卡上之后,会发现根目录“/”所在的分区只有1点几G大,并且没有交换空间(swap),这很麻烦,因为我们随便装几个软件就会占满根目录所在分区,例如一个emacs就有几百M大。

所以,我们要让根目录几乎使用全部的SD卡空间。例如,我的SD卡是16G的,我想把1G空间拿来做swap,其余的就给根目录了。
Youtube上有教程说明如何用GParted(一款开源软件)来操作SD卡,从而将更改系统分区的大小,我也曾尝试,不幸的是我在调整好空间大小之后,一点击“Apply”应用我的修改就出错,无法继续下去。所以我最后是采取了一个最简单,也成功了的办法,那就是:使用Ubuntu系统自带的磁盘管理工具来重新分区,听我慢慢道来:
(1)进入Ubuntu系统,将SD卡上1点几G的那个分区(也就是根目录所在的分区)里的文件备份成tar包:

1
tar cf os.tar XXX/*

其中,XXX是指你的SD卡目录。
这个备份出来的tar包在后面我们修改完分区大小之后,恢复系统的时候要用。
(2)用Ubuntu系统自带的图形化磁盘管理工具(具体名字记不得了),删除掉1点几G的那个SD卡分区,同时你会发现,有一个十几G的未分配的空间,这就是我们要利用的宝贵空间。然后划分出一个13G的ext4分区(Pi官方推荐的那个Arch Linux ARM镜像刷出来的系统用的就是ext4文件系统),这将作为新的系统所在分区。
(3)将剩下的空间划分为一个交换空间(swap),如果你觉得此空间太大有点浪费,那么你可以在上一步里把空间设大一点,那么这里剩下的swap空间就会小一点,总之,自己衡量。
(4)待Ubuntu操作完成,把SD卡挂载上去,现在,你就有了一个十几G的系统分区和一个1G的swap分区。但是,由于重新分区,系统已经没了,我们怎么恢复?用刚才备份的tar文件就可以恢复。将其中的文件解压到十几G的系统分区里,你原来的设置、安装的软件都不会丢。但是要注意,可能你解压文件的时候,用的不是root用户,而是其他用户,那么你要保证解压出来之后,要修改所有文件的权限为root:

1
chown -R root:root XXX/

其中,XXX为你的SD卡的挂载目录。这是因为刚刷到Pi上的Arch Linux ARM只有一个root用户,我没有添加其他用户,所有文件owner均为root。
(5)把SD卡umount下来,插入Pi的卡槽中,启动系统,发现一切正常,成功了!
【2】添加开机启动的程序
要让Pi开机启动一个脚本/执行一个命令怎么办?
我们知道,RedHat有 /etc/rc.local 文件,在里面写上要执行的命令就可以开机执行了,这是最简单的办法,而Arch Linux ARM没有这个东西,它是按下面的方法设置的:
假设我要开机执行一句shell命令,把它写在文件 /etc/rc.local 中(在Arch Linux中,此文件一开始是不存在的):

1
2
3
4
#!/bin/bash
# this file defines the commands that will be executed at system startup
echo "abc" > /root/test.txt

为此文件赋予可执行权限:

1
chmod +x /etc/rc.local

然后创建一个文件 /usr/lib/systemd/system/rc-local.service ,内容为:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
 
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target

创建一个软链接:

1
2
cd /etc/systemd/system/multi-user.target.wants
ln -s /usr/lib/systemd/system/rc-local.service rc-local.service

启用服务:

1
systemctl enable rc-local.service

重启系统,然后就可以开机执行你的shell命令了。如果要立即启用,则执行以下命令:

1
systemctl start rc-local.service

这是使用systemd的启动方式,非常麻烦。
如果你只是简单地要设置一个命令的别名,可以把命令写在 /etc/profile 中,ssh登录Pi的时候就自动会执行。

【3】安装软件
在Arch Linux上安装软件使用pacman很方便,它相当于Ubuntu中的apt-get。例如,要安装gcc,可以这样:

1
pacman -S gcc

然后Arch Linux ARM会提示你要下载的软件包的情况,以及向你确认是否要进行安装。
在下载软件包的过程中,我的Pi一直提示下载不到某一个软件包的错误,重试无数遍都一样,于是我就只能尝试升级pacman以及系统了,执行:

1
pacman -Syu

升级时间较长(大约小于10分钟),之后再安装gcc,就成功了。
【4】配置静态IP地址 
相比设置一个静态的IP地址,我更愿意采取另一种简单的办法来让Pi每次都得到一个固定的IP地址,即:在路由器里为Pi所对应的Mac地址保留一个固定的IP地址。
由于我对Pi所接入的网络的路由器有完全的控制权,所以我可以这样做。由于每种路由器的管理界面是不相同的,所以在此我就不把路由器管理界面的图贴上来了,大家自己看看你路由器的说明书就会弄了。

【5】设置系统时区 & 时间

以上海为例,先编辑文件 /etc/rc.conf,添加上如下内容:

1
2
3
4
LOCALE="en_US.UTF-8"
DAEMON_LOCALE="no"
HARDWARECLOCK="localtime"
TIMEZONE="Asia/Shanghai"

然后做软链接:

1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

/etc/localtime 原来是指向 /usr/share/zoneinfo/Europe/London,在做这外软链接之后,就指向了 /usr/share/zoneinfo/Asia/Shanghai。
这样就算设置好了时区了。下面该设置系统时间了。由于树莓派没有实时时钟,因此,最好利用网络来对时,所以使用OpenNTPD是个非常好的选择。
我系统中安装的OpenNTPD(我不记得是系统自带的还是我安装的了):

1
2
[root@alarmpi ~]# pacman -Q | grep ntp
openntpd 3.9p1-19

确保 /etc/rc.conf 中有OpenNTPD的启动项:

1
DAEMONS=(syslog-ng network netfs crond openntpd sshd)

然后重启系统,会发现时间自动同步正确了。
如果你发现时间无法同步,那么请执行一下ntpd命令,该命令会加载ntpd配置文件 /etc/ntpd.conf,如果配置文件内容有错,它会提示出来。就算配置文件是正确的,有其他错误也会打印出来。
例如,我升级了如下版本的系统:

1
2
[root@alarmpi ~]# cat /proc/version
Linux version 3.2.27-14-ARCH+ (nobody@nitrogen) (gcc version 4.7.2 (GCC) ) #1 PREEMPT Tue Nov 20 23:58:09 UTC 2012

然后就遇到了无法同步时间的问题。执行ntpd命令会提示“ntpd: unknown user ntp”。网上Google了一堆文章,找到最后唯一一个可行的解决办法就是:为系统添加一个“ntp”用户:

1
useradd ntp

然后查看 /etc/passwd 文件,会看到已经添加了该用户。
为安全,编辑 /etc/passwd 文件,将此用户设置为无法ssh登录系统:

1
ntp:x:1000:1000::/home/ntp:/sbin/nologin

另外,你也可以用ntpdate(现在已经被官方弃用了)来对时,但首先你必须安装ntp包:

1
pacman -S ntp

然后,找一个可用的时间服务器来同步时间:

1
ntpdate  time.buptnet.edu.cn

【6】配置Emacs编辑C++代码的自动补全功能
如果要在树莓派上用Emacs开发C++程序,那么配置好代码自动补全/自动完成功能大有帮助。
CEDET实现了该功能,用的人也比较多,不过,由于树莓派的性能较低,并且CEDET很慢(很多文章都这么说,我没试),所以就不要考虑在树莓派上用这玩意了。
那么应该选择什么Emacs插件来实现呢?auto-complete-clang是一个很好的选择。
下面,就介绍一下如何配置该插件,让自动完成功能在Emacs中用起来。
为了安装auto-complete-clang,你需要先安装两个东西:auto-complete 和 clang
①安装auto-complete
首先你要下载auto-complete的源码包,解压之后编译,安装(安装的过程中会询问你安装到哪个目录):

1
2
3
make
make install
Install to: /root/.emacs.d/auto-complete

注意,我把它安装到了一个自己创建的目录下,后面要用到这个目录里的文件。
在Emacs配置文件.emacs中添加如下四行:

1
2
3
4
(add-to-list 'load-path "/root/.emacs.d/auto-complete")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "/root/.emacs.d/auto-complete/ac-dict")
(ac-config-default)

上面的路径就是和刚才的安装路径,如果你和我安装的路径不一样,请把它改成你自己的路径。
②安装clang
用pacman安装clang是最方便的:

1
pacman -S clang

如果你不幸遇到了下面的错误:

error: failed retrieving file 'llvm-3.1-4-armv6h.pkg.tar.xz' from mirror.archlinuxarm.org : The requested URL returned error: 404
warning: failed to retrieve some files from extra
error: failed retrieving file 'clang-3.1-4-armv6h.pkg.tar.xz' from mirror.archlinuxarm.org : The requested URL returned error: 404
warning: failed to retrieve some files from extra
error: failed to commit transaction (download library error)
那么你可以选择升级系统:

1
pacman -Syu

然后再用pacman安装clang,应该就没有上面的问题了。
③安装auto-complete-clang
其实这一步所谓的安装,不过是下载+配置,并没有像上面一样的编译过程。
下载配置文件auto-complete-clang.el,我把它放到了 .emacs.d/auto-complete-clang 目录下。
在.emacs中添加下面一句:

1
(add-to-list 'load-path "~/.emacs.d/auto-complete-clang")

该目录就是你放置 auto-complete-clang.el 文件的目录。
然后再继续添加如下内容(从网上抄来的):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(require 'auto-complete-clang)
(setq ac-auto-start t)
(setq ac-quick-help-delay 0.5)
;; (ac-set-trigger-key "TAB")
;; (define-key ac-mode-map  [(control tab)] 'auto-complete)
(define-key ac-mode-map  [(control tab)] 'auto-complete)
(defun my-ac-config ()
  (setq ac-clang-flags
        (mapcar(lambda (item)(concat "-I" item))
               (split-string
                "
 /usr/lib/gcc/armv6l-unknown-linux-gnueabihf/4.7.2/../../../../include/c++/4.7.2
 /usr/lib/gcc/armv6l-unknown-linux-gnueabihf/4.7.2/../../../../include/c++/4.7.2/armv6l-unknown-linux-gnueabihf
 /usr/lib/gcc/armv6l-unknown-linux-gnueabihf/4.7.2/../../../../include/c++/4.7.2/backward
 /usr/lib/gcc/armv6l-unknown-linux-gnueabihf/4.7.2/include
 /usr/local/include
 /usr/lib/gcc/armv6l-unknown-linux-gnueabihf/4.7.2/include-fixed
 /usr/include
")))
  (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
  (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
  ;; (add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
  (add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
  (add-hook 'css-mode-hook 'ac-css-mode-setup)
  (add-hook 'auto-complete-mode-hook 'ac-common-setup)
  (global-auto-complete-mode t))
(defun my-ac-cc-mode-setup ()
  (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))
(add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)
;; ac-source-gtags
(my-ac-config)
其中,那些类似于 /usr/XXX 的路径因环境不同而不同,它是通过如下命令得知的:
1
echo "" | g++ -v -x c++ -E -
从输出的一大堆信息中,找到那些 /usr/XXX 的路径填上就可以了。
配置好之后,再用Emacs打开一个C++代码文件,看看自动完成是不是生效了

【7】设置终端文字颜色 / Setup the terminal text color
Arch Linux ARM默认情况下终端文字是黑白的,对于文件和目录类型不方便区分,为提高工作效率,需要其显示不同颜色。
修改 /etc/profile,在最后添加一行:

1
alias ls="ls --color=auto"

这样,ls命令显示出来的文字就有不同颜色了。

【8】Arch Linux ARM的rontab文件在哪里 / Where the crontab file is
使用 crontab -e 命令可以编辑当前用户的crontab配置文件,但这个文件是位于何处?我更喜欢直接编辑它,因为我可以用我习惯的Emacs来操作。它是在 /var/spool/cron/ 目录下,用户名即为文件名,例如,root用户的 crontab -e 命令编辑的就是 /var/spool/cron/root 文件。

【9】安装dig,nslookup程序
dig和nslookup程序包含在dnsutils包中,所以这样安装:

1
pacman -S dnsutils

如果你用 pacman -S dig 或 pacman -S nslookup 来找,是找死也找不到的。
【10】备份SD卡上的系统
万一SD卡损坏,你辛辛苦苦配置了很久的系统就没了,所以必须要备份。直接拷贝SD卡里的数据到另一张SD卡上是行不通的,可以通过Linux的dd命令来复制SD卡,非常方便。
(A)查看SD卡的设备名

01
02
03
04
05
06
07
08
09
10
11
[codelast@ ~]$ dmesg | tail
[487324.668042] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
[487324.668916] sd 7:0:0:0: [sdb] No Caching mode page present
[487324.668922] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[487324.672481] sd 7:0:0:0: [sdb] No Caching mode page present
[487324.672487] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[487324.674866]  sdb: sdb1 sdb2 sdb3
[487324.679206] sd 7:0:0:0: [sdb] No Caching mode page present
[487324.679213] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[487324.679218] sd 7:0:0:0: [sdb] Attached SCSI removable disk
[487325.617680] pool[9188]: segfault at 0 ip 000000000042e62d sp 00007f88ff2c4520 error 4 in udisksd[400000+45000]

可见我的SD卡设备名是sdb。
(B)备份SD卡上的OS到一个磁盘文件里

1
2
3
4
[codelast@ ~]$ sudo dd if=/dev/sdb of=~/raspberry_pi_os_backup
31537152+0 records in
31537152+0 records out
16147021824 bytes (16 GB) copied, 942.766 s, 17.1 MB/s

在这里,/dev/sdb是我的SD卡,OS被备份到了~/raspberry_pi_os_backup文件中。整个过程花了约15分钟完成(16G的SD卡)。
(C)将格式化新的SD卡为ext4
由于我原来的SD卡是ext4格式,所以我利用Ubuntu的磁盘管理工具将新的SD卡也格式化成了ext4格式。至于这一步是否有必要,我没有试验,但是可以肯定的是:这样做一定能成功。
拔下旧的SD卡,插上新的SD卡,用 dmesg | tail 命令查看一下,新的SD卡的设备名仍然是sdb,因此恢复OS的命令为:

1
2
3
4
[codelast@ ~]$ sudo dd if=~/raspberry_pi_os_backup of=/dev/sdb
31537152+0 records in
31537152+0 records out
16147021824 bytes (16 GB) copied, 5459.12 s, 3.0 MB/s

这个操作时间更长,耐心等待完成即可。
文章来源:http://www.codelast.com/
【11】用pacman -Syu升级系统时提示“error: failed to commit transaction (conflicting files)”的解决办法
我在用pacman -Syu升级系统时,提示如下错误:

1
2
3
4
5
error: failed to commit transaction (conflicting files)
filesystem: /bin exists in filesystem
filesystem: /sbin exists in filesystem
filesystem: /usr/sbin exists in filesystem
Errors occurred, no packages were upgraded.

这个问题可以通过依次执行以下几条命令来解决,经测试可用:

1
2
3
4
pacman -R localepurge
pacman -Syu --ignore filesystem,bash
pacman -S bash
pacman -Su

版权声明:
作者:admin
链接:https://www.bttme.com/archives/141.html
来源:bttme
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>