树莓派启动那些事(三)

键盘,编码,中文,时间,远程

Views:  times Posted by elmagnifico on November 8, 2015

环境

system:2015-09-24-raspbian-jessie

RaspberryPi:Raspberry Pi 2

树莓派启动的相关问题

树莓派启动的相关问题,会从config.txt一直介绍到linux如何启动,启动流程分析,自启动脚本实现。

这次以如何设置键盘,文字编码,中文,时间,以及VNC服务来介绍

键盘

在配置完成config之后,一定要第一时间设置键盘,不然后面会遇到各种打出来的符合不对劲的问题。

sudo raspi-config
选4 Internationnalisation Options
选3 Change Keyboard Layout (没弹出来下面的选项,多试几次就好了)
选 Generic 104-key PC (美式键盘,正常咱用的)
选 English(US)(一定要是这个不然会打出来奇怪的东西)
默认键盘排列,回车
No compose key
Yes 

完成之后 尝试打出 ~ / \ “ # 如果没什么问题,那就应该设置对了。

不要在树莓派的默认桌面下设置键盘等属性,就算你设置完了,重启之后全没了

编码与中文

想要使用中文以及编码,先安装中文编码包和输入法,默认是没有的

字体三选一个就可以了,输入法推荐ibus,剩下的两个不是黑块就是不好用

sudo apt-get install ttf-wqy-zenhei 
文泉驿的正黑体

sudo apt-get install ttf-wqy-microhei
文泉驿的微米黑体  

sudo apt-get install ttf-arphic-ukai
文鼎的楷体

sudo apt-get install ttf-arphic-uming
文鼎的明体

sudo apt-get install ibus ibus-pinyinibus 
输入法引擎 和 ibus 拼音输入法

sudo apt-get -y install scim-pinyin 
scim输入法

sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin  google拼音会黑块,原因未知

sudo raspi-config
选4 Internationnalisation Options
选1 Change Locale
一直到最下面,选择zh_CN.UTF-8 按空格选择!
会让你再确定一次,还是选zh_CN
选完以后确定,重启
sudo reboot

之后命令提示就是中文了,ctr+space开启输入法,alt+space可以切换输入法

时间

说一下为什么树莓派需要同步时间,因为树莓派没有rtc时钟,导致树莓派断电的时候整个系统就是真正的停止了,那么时间也停了,在某些特定的时候我们需要树莓派提供一个准确时间,那就得要树莓派在开机的时候或者是运行的时候自动进行网络时间同步,ntp就是此种最为常用的同步方式了

ntp

sudo raspi-config
选4 Internationnalisation Options
选2 Change Timezone
选Asia
可以选Chongqing或者是Shanghai都行

选完之后会提示你的时区是CST 你可以看到和UTC相差了8个小时,那就保证了时区选择正确了。

按道理说这样就可以了,因为默认raspbian的系统是开启了ntp的同步,只要你网络正常,那么就会自动同步,并不需要你去干扰。

然而ntp的问题之多,超乎想象。

ntp 时间校准 sudo ntpd -s -d

如果用了以后没效果,先手动设置一下时间(不要和准确时间差太多)

sudo date  --s="2015-11-08 20:42:00"

ntp有一个超时不同步的设定,就是如果当前时间和服务器时间相差超过1000秒,那么ntp就不同步时间,不知道这是什么坑爹设定,所以你要想同步,那你得先设定的离他的时间近一些,而且ntp的同步非常慢,最慢可能会有5分钟的样子。

如果在以上设置之后都无法同步,那再手动指定一下同步服务器

sudo apt-get install ntpdate 

安装ntpdate,才能手动同步

sudo ntpdate cn.pool.ntp.org

使用cn.pool.ntp.org的服务器进行同步(选择服务器前,先手动ping一下,看看通不通!)

如果提示 the NTP socket is in use, exiting 那需要先关闭ntp服务

sudo service ntp stop

查看ntp进程和服务状态

sudo service ntp status
ps -ef | grep ntp

然后再尝试sudo ntpdate cn.pool.ntp.org同步,如果出现

no server suitable for synchronization found
增加 -d 参数 查看详细过程
ntpdate –d cn.pool.ntp.org 
(国内如果这个服务器会出现no data 情况,查看一下你的版本
ntpq -c version
如果是4.2以后的确保/etc/init.d/ntp 和  /etc/ntp.conf的配置中 并没有给restrict定义了notrust
如果是strata too high,那是服务器自身没有同步呢,需要等服务器同步之后自然就会同步了)

还有一种可能是你防火墙屏蔽了ntp的端口123/udp,关闭之后,重新尝试

sudo service iptables stop (事实上新树莓派根本没有防火墙)

通过这个命令,来看同步的状态(选择哪个服务器会有*号标识,同步时间什么的)

ntpq -p

如果全都是INIT,那么说明被屏蔽了,根本连不上服务器

当然还有可能是你的DNS设置有问题,以前是这么修改dns的

sudo nano /etc/resolv.conf
文件内容:
# Generated by resolvconf
nameserver 192.168.0.1
增加一条8.8.8.8
nameserver 8.8.8.8

而然新的系统里,这样设置了没用,重启的时候系统会自动重写这个文件

只有在resolvconf.conf中加上8.8.8.8 那么重启以后,resolv.conf中会自动增加上的

sudo nano /etc/resolvconf.conf
文件内容:新增8.8.8.8 
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details

resolv_conf=/etc/resolv.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
#name_servers=127.0.0.1
nameservers=8.8.8.8
# Mirror the Debian package defaults for the below resolvers
# so that resolvconf integrates seemlessly.
dnsmasq_resolv=/var/run/dnsmasq/resolv.conf
pdnsd_conf=/etc/pdnsd.conf
unbound_conf=/var/cache/unbound/resolvconf_resolvers.conf

如果以上方法不行的话,还可以尝试修改配置中的服务器

sudo nano /etc/ntp.conf

可以看到,以server开头的服务器地址,那你就可以用国内的替换他们。

server 1.cn.pool.ntp.org iburst
server 2.cn.pool.ntp.org iburst
server 3.cn.pool.ntp.org iburst
server 0.cn.pool.ntp.org iburst

替换完了以后再重启ntp服务,再次尝试同步

sudo /etc/init.d/ntp restart

如果这样都不行,那么放弃ntp吧,必然是你的网络环境中的ntp被封掉了 (我试过把树莓派作为DMZ主机,然而耐不住,上面还有若干层路由挡住了)

通过查看系统日志中关于ntp的部分,看看是什么问题

tail -100 /var/log/syslog |grep ntp
grep ntp /var/log/syslog

大部分初始化过不去是因为板子启动太快了,ntp在网络还没启动的情况下就启动了,导致无法获得DNS解析, 等网络启动了之后,ntp就正常了,你就能看到dns被解析出来了

ntpd_intres[595]: DNS 0.cn.pool.ntp.org -> 202.112.
ntpd_intres[595]: DNS 1.cn.pool.ntp.org -> 202.120.
ntpd_intres[595]: DNS 2.cn.pool.ntp.org -> 202.118.

可即使是这样我依然处于初始化状态,无法使用ntp。

ntp同步总结

总体来说ntp服务的问题太多了,在局域网内使用起来还好,配置只有一个配置文件,稍微查查就能懂怎么配置一套ntp服务器和客户端,但如果用到更大的环境中就很容易出问题,很容易被路由防火墙屏蔽。

以上的经验教训来自于树莓派官方论坛一百多个关于时间设定和ntp服务的帖子,如果不能解决ntp的问题,那么还是换个时间同步吧,我看到好多帖子里官方的回复都是,换一个同步方式比如rdate/htpdate,连官方都无奈了,树莓派的系统还是有颇多问题的。

rdate

rdate的使用比较简单,先安装上rdate

sudo apt-get install rdate

-s 是同步到本地,没有-s只是查看时间

rdate -s time.nist.gov  

这个网址我ping不通,也同步不了,只有清华的这个我能ping通,但是同步不了,被拒绝了

rdate s2a.time.edu.cn 清华大学

rdate使用端口37,而我的37端口是被屏蔽的,所以这个方法我用不了

如果你可以用,那可以配合一个脚本,实时同步,或者是在开机启动脚本里加一个,来同步(保证网络先启动)

htpdate

这里是htpdate的github目录

https://github.com/iridium77/htpdate

首先下载下来htpdate

sudo wget  https://codeload.github.com/iridium77/htpdate/zip/master

然后解压

unzip master

编译,安装

cd ./htpdate-master/
make
sudo make install
sudo htpdate -t -s ntp.neu.edu.cn 
date

你就能看到你的时间更新了,如果想定期同步,那么运行下面这个就可以了。

作者非常友好的写好了 htpdate的开机启动脚本,脚本就在解压目录下的scripts中名为htpdate.init

cd ./scripts
sudo cp htpdate.init /etc/init.d/
sudo chmod 777 htpdate.init
cd /etc/init.d/
sudo insserv htpdate.init
sudo systemctl daemon-reload
sudo service htpdate.init start

到这里基本就设置好了开机启动,并且会自动同步时间(我稍微修改了一下同步的服务器,实际上影响不大)

也可以在/etc/rc.local中加上同步命令,开机时自动同步(注意等待网络启动)

htpdate -D -a -l -s -i /var/run/htpdate.pid ntp.neu.edu.cn www.google.com www.freebsd.org

总体来说htpdate同步得到的时间,并不够精准,可能会差0.5s,如果网络延迟高的话差1s也不稀奇,对于要求精确时间的还得上ntp等服务器

nmap

可以通过安装nmap,端口扫描器,来看对方是否开放了对应端口

有-sU的是看udp端口 没有默认是tcp端口

sudo apt-get install nmap
 	sudo nmap -sU cn.pool.ntp.org -p 123

我通过nmap确认我的上层路由的端口是否开放,下面ip是我们总的ip地址

sudo nmap -sU 210.30.107.19 -p 37 -Pn

得到的结果是

Starting Nmap 6.00 ( http://nmap.org ) at 2015-11-08 20:54 CST
Nmap scan report for 210.30.107.19
Host is up.
PORT   STATE         SERVICE
37/udp open|filtered time

看到filtered基本就知道这个端口是被屏蔽的,无法确定什么样

修改下载源

这是我在装nptdate的时候发现,nptdate无法下载,debian的服务器上有一个包怎么也下不下来,没办法我好找其他下载源下载了。

cd /etc/apt/
sudo mv sources.list sources.list.bak (备份现有的源文件)
sudo wget http://mirrors.cqu.edu.cn/distri/Raspbian/sources.list (下载重庆大学镜像源配置文件)
sudo apt-get upgrade
sudo apt-get update (这两条得执行一下,不然系统的下载数据库不更新,没办法下到最新的)

当然也能直接修改,这个是中科大的下载源,后面的jessie是版本号,是什么版本修改成什么版本就可以了

sudo nano ./sources.list 
deb http://mirrors.ustc.edu.cn/raspbian/raspbian jessie main contrib non-free rpi
deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ jessie main contrib non-free rpi

Putty

Putty作为远程登陆树莓派非常好用,下面是链接

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

只要输入树莓派的IP地址,选好端口22 ,就可以直接登陆了

当然每次输入账号密码非常蛋疼,有一个办法在Putty的快捷方式中

修改目标 向下面这样

D:\Putty\putty.exe -pw 密码 用户名@IP地址
e.g:
D:\Putty\putty.exe -pw raspberry pi@192.168.0.102

就可以每次打开都不用输入账号密码了

除此以外putty的设置保存非常蛋疼,经常保存不上

输入好ip地址和端口之后
点击 连接
空包发送间隔 改为 10
勾上允许TCP保持活动连接
然后回到会话页面
把ip填到下面保存的会话
点击 保存 

这样才能把配置保存住

如果要修改默认配置也是一样的,需要先载入默认配置 然后修改,改完以后,点击默认配置 保存

WinSCP

WinSCP是个非常好用的在系统之间传送文件的工具,开始的操作界面也非常像Putty,填好之后登陆,就能看到树莓派的文件目录了,支持直接拖拽非常方便,同时也能把putty嵌入到WinSCP中(主要是WinSCP的命令行太难用),这样远程操作树莓派就很方便了。

http://winscp.net/eng/docs/lang:chs

ROOT

树莓派使用的linux是debian系统的移植版本,所以树莓派启用root和debian是相同的。

debian里root账户默认没有密码,但账户锁定。

当需要root权限时,由默认账户经由sudo执行,Raspberry pi 系统中的Raspbian

默认用户是pi 密码为raspberry

重新开启root账号,可由pi用户登录后,在命令行下执行

sudo passwd root

执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后在执行

sudo passwd --unlock root

这样就可以解锁root账户了。

然而我没有开启root,感觉不开启的情况下 也不用输入密码就能sudo 还是蛮方便的,先这么用着吧

The end

最后的时间是最坑爹的用了两天确定了ntp的问题,最后只好用htpdate来代替,不过可喜的是自启动服务竟然有效,不然又要坑到这里了。下次开始系统内核启动的介绍。

Quote

http://ntp.neu.edu.cn/archives/163

https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=53506&p=409303&hilit=the+ntp+socket+is+in+use+exiting#p409303

https://github.com/iridium77/htpdate