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: 404warning: failed to retrieve some files from extraerror: failed retrieving file 'clang-3.1-4-armv6h.pkg.tar.xz' from mirror.archlinuxarm.org : The requested URL returned error: 404warning: failed to retrieve some files from extraerror: 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) |
1
|
echo "" | g++ - v -x c++ -E - |
【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 |
共有 0 条评论