树莓派学习(三) — 常用软件安装和配置

一 安装开发必备软件

 

 

build-essential

 

最基本的,系统已经装好了,里面主要包括gcc, libc, make

pi@raspberrypi-cc:~ $ sudo apt install build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version (12.3).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

 

gcc/g++

 

build-essential系统已经装好了,那么gcc自然也好了

好像从Android 7.0开始的source编译默认编译器已经使用clang,不过目前也没编译源码的需求,关键这机器得编译一天吧。。。哈哈,先不装了

 

JDK

 

基本上很多软件都需要用到。后面用Springboot开发个接口,必须要用的。

sudo apt install default-jdk

本来以为没问题,结果报错了。

Error: missing `server' JVM at `/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm/server/libjvm.so'.
Please install or use the JRE or JDK that contains these missing components.
dpkg: error processing package ca-certificates-java (--configure):
 subprocess installed post-installation script returned error exit status 4
dpkg: dependency problems prevent configuration of openjdk-8-jre-headless:armhf:
 openjdk-8-jre-headless:armhf depends on ca-certificates-java; however:
  Package ca-certificates-java is not configured yet.

server目录缺少libjvm.so,安装路径下有clien目录,那么就 执行以下下面的命令

cd /usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm
sudo ln -s client server

然后重新install一下,安装好看看java版本。搞定。然后我把Server目录删除了也可以正常了。

pi@raspberrypi-cc:~ $ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)
OpenJDK Client VM (build 25.171-b11, mixed mode)

但是client和server是什么?怎么会报错呢?稍微研究了下。原来JVM有Client和Server两种启动模式,Client启动快运行慢一些,适合桌面程序,Server相反,适合服务器。看上面结果最后一行,OpendJDK Client JVM说明是以Clien方式启动,所以没有Server也不会出错。

看下配置文件在,如果以server启动时实际还是client模式。从网了解到32位系统默认是Client模式,64位系统默认是Server模式。所以出错的原因可能是安装时要检查,发现缺少Server就报错了,而真正运行时不一定需要。但是为什么安装会缺少Server,估计可能是Respbain仓库的问题的吧,或者是ARM的问题?

pi@raspberrypi-cc:/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm $ cat jvm.cfg
-client KNOWN
-server ALIASED_TO -client
-zero KNOWN
-dcevm KNOWN

这个启动是可以配置的,按顺序来的,所以修改下配置看看:

-server KNOWN
-client KNOWN
#-server ALIASED_TO -client
-zero KNOWN
-dcevm KNOWN

果然报错了,和之前一样。

pi@raspberrypi-cc:/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm $ java -version
Error: missing `server' JVM at `/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm/server/libjvm.so'.
Please install or use the JRE or JDK that contains these missing components.

然后复制一份server看看,哈哈,还是Client,毕竟是直接复制的。不同模式对应的libjvm.so肯定是不一样的。

pi@raspberrypi-cc:/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm  sudo cp -r client/ server/  pi@raspberrypi-cc:/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm 
pi@raspberrypi-cc:/usr/lib/jvm/java-8-openjdk-armhf/jre/lib/arm $ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)
OpenJDK Client VM (build 25.171-b11, mixed mode)

好吧,又涨只是了。Android JVM可没这个模式。

 

Python

 

后面通过GPIO连接外设必须的,而且AI,大数据都会用到。 系统已经自带了python2和python3,不需要自己安装了。python-dev也已经装上了。

pi@raspberrypi-cc:~  python  Python 2.7.13 (default, Nov 24 2017, 17:33:09)  [GCC 6.3.0 20170516] on linux2  Type "help", "copyright", "credits" or "license" for more information.    pi@raspberrypi-cc:~  python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.

安装pip,pip是python的包管理工具,可以用来下载python的一些包。比如前面安装shadowsock时,如果用的pythone版的,就需要用pip命令下载。

sudo apt install python-pip 

 

Nodejs

 

用的可能并不是非常多,不过自己开个端口返回点数据什么,用这个非常方便,不用搞一大堆东西。

sudo apt install nodejs

不需要nodejs-legacy,装的话会提示说冲突。。。

pi@raspberrypi-cc:~ $ nodejs -v
v8.11.1

写个小程序试试,监听8080端口,返回结果。保存为web.js

var http = require("http")

http.createServer(function(req, res){
	res.writeHead(200, {"Context-Type":"text/html"})
	res.write("<p>hello world</p>")
}).listen(8080);

var msg =  "hello world!"
console.info(msg)

执行一下,有结果出来了

pi@raspberrypi-cc:~/source $ node web.js
hello world!

打开浏览器看看,成功了。

 

git

 

这个不用说了,必须装。

pi@raspberrypi-cc:~  sudo apt install git    pi@raspberrypi-cc:~  git --version
git version 2.11.0

顺便提下repo,git大家用的多,repo可能很少用。 这个是google开发的用来管理android 源码的git库,可以拉取多个git库。 windows下无法使用。我有一份repo下来的android源码。后面可以把移动硬盘挂在树莓派上,假一个gitlab,就可以看源码了。

#创建私有的bin目录,raspbain已经把这个目录加入PATH了,不需要自己添加,其他系统可能要自己添加
mkdir ~/bin

#下载repo执行文件,并设置权限
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

下载这个需要挂代理。否则下载不了。

 

 

docker

 

单机上docker用处并不是很大,不过有时候装一些实验性的东西,怕吧系统弄乱,就用docker,方便快速。docker要求内核大于3.10,raspbain是4.14。没有使用apt安装,而是使用了官方的脚本文件安装。

wget -qO- https://get.docker.com/ | sh

安装完成后提示,如果不想以root运行docker,就加入docker组,按提示执行以下就行了,

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker pi

看看版本

pi@raspberrypi-cc:~ $ docker -v
Docker version 18.06.0-ce, build 0ffa825

修改组后重启一下,否则执行docker 其他命令会提示权限问题。docker安装后服务就启动了,占用大概30M内存,如果不想使用,把服务停掉就行了,用的时候在开启吧。

sudo service docker stop

 

tree

 

这个工具可以以树形的方式查看目录结构。比较方便查看目录结构和文件。

pi@raspberrypi-cc:~  sudo apt install tree    pi@raspberrypi-cc:~  tree
.
├── bin
│   ├── repo
│   └── shadowsock.sh
└── source
    └── web.js

 

 

二 管理启动项目

 

Linux系统使用了多种启动管理,总结起来主要有sysvinit —> Upstart —> systemd。 目前新的系统大部分采用了systemd的方式管理启动。

 

sysvinit

 

这个是大家接触最多的,启动的第一个进程是init,读取/etc/inittab 的配置进行初始化。根据运行级别(reunlevel命令查看)决定执行那个rcX.d(X是运行级别)下的初始化文件(初始化脚本都是连接到/etc/init.d 目录下的)。脚本命名的方式:K开头(kill)、S开头(start)。K、S后面跟着的数字代表执行优先级,数字越小优先级越高 。脚本是按顺序执行的。说以要控制那些服务开机启动,就需要自己来修改这些文件,可以改名或者删除。也可以添加自己的启动脚本。目前还是有一些程序在使用这种方式启动,新的启动程序也兼容这种方式。

pi@raspberrypi-cc:/etc/init.d  ls -l  total 168  -rwxr-xr-x 1 root root 5336 Feb  1  2016 alsa-utils  -rwxr-xr-x 1 root root 2401 Jan 23  2017 avahi-daemon  -rwxr-xr-x 1 root root 2948 Oct 25  2016 bluetooth  -rwxr-xr-x 1 root root 1232 Apr  7  2017 console-setup.sh  -rwxr-xr-x 1 root root 8297 Oct  3  2017 dnsmasq  -rwxr-xr-x 1 root root 3843 Jul 19 03:01 docker      pi@raspberrypi-cc:/etc/rc5.d  ls -l
total 4
-rw-r--r-- 1 root root 677 Feb 13  2017 README
lrwxrwxrwx 1 root root  26 Jun 27 08:25 S01console-setup.sh -> ../init.d/console-setup.sh
lrwxrwxrwx 1 root root  16 Aug  5 18:29 S02dhcpcd -> ../init.d/dhcpcd
lrwxrwxrwx 1 root root  16 Aug  5 18:29 S02polipo -> ../init.d/polipo
lrwxrwxrwx 1 root root  17 Aug  5 18:29 S02rsyslog -> ../init.d/rsyslog
lrwxrwxrwx 1 root root  27 Aug  5 18:29 S02shadowsocks-libev -> ../init.d/shadowsocks-libev
lrwxrwxrwx 1 root root  17 Aug  5 18:29 S03dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root  16 Aug  5 18:29 S03docker -> ../init.d/docker

除了手动方式,还可以使用命令

#添加启动项
/etc/rc5.d sudo update-rc.d mysql defaults     #删除启动项  /etc/rc2.d sudo update-rc.d -f mysql remove 

当然还可以用其他工具,在Ubuntu/Debian上主要使用sysv-rc-conf,其他系统是chkconfig

# sudo apt install sysv-rc-conf
# sudo sysv-rc-conf

执行后是一个简单图形化的管理工具。数字代表运行级别. 我在树莓派Lite版执行runlevel显示的运行级别是5 (Debian下2-5是一样的)。

也可以手动启动和停止服务,可以使用下面的命令:

sudo service SERVICE_NAME  start | stop | restart    

sudo /etc/init.d/  SERVICE_NAME  start | stop | restart 

 

upstart

 

Ubuntu(10.04-14.04)和Debian使用upstart这个init系统比较多。 这个特点就是采用事件驱动。已经找不到/etc/inittab文件。upstar它的启动配置文件都在/etc/init目录下,这些脚本都是由事件驱动的,他们定义了那些事件发生时执行什么,这一点和sysvinit最大的区别。

pi@raspberrypi-cc:/etc/init $ ls -l
total 148
-rw-r--r-- 1 root root  328 May 21  2014 bootmisc.sh.conf
-rw-r--r-- 1 root root  232 May 21  2014 checkfs.sh.conf
-rw-r--r-- 1 root root  253 May 21  2014 checkroot-bootclean.sh.conf
-rw-r--r-- 1 root root  307 May 21  2014 checkroot.sh.conf
-rw-r--r-- 1 root root 1875 Jul 19 03:01 docker.conf

upstart启动的第一个进程也是init,但是和systemV中的不同的。upstart的脚本由事件触发,而不是顺序执行。所以upstart本身是没有运行级别概念的,只是为了兼容老的sysvinit,在启动最后会触发rc-sysinit 调用 telinit。Telinit 任务会发出 runlevel 事件,触发执行/etc/init/rc.conf,然后设置一个RUNLEVEL执行老的sysvinit的初始化。

 

同样upstart也提供里管理这些服务的命令:initctl

initctl JOB_NAME  start | stop | restart    

start JOB_NAME

对于upstart来说是一个一个的job,所以这里用的是job name代替。要控制开机启动有三种方式

  • 修改任务或服务的自动启动脚本的名称*.conf为名称结尾为非.conf结尾的;
  • 编辑*.conf文件中的内容,在start on这行的行头添加’#’,使start on 行成为注释行;
  • 使用conf同名的override文件,这样就不会自动启动,只能手动启动。 当然也可以直接写到JOB_NAME.conf文件中,但这样可能就无法恢复了
echo "manual" >> /etc/init/JOB_NAME.override

 

 

 

systemd

 

这个是目前Linux系统中最新使用的init系统。 ubuntu 16.04开始使用的就是这个,目前Raspbian也是使用这个 (没有/etc/inittab, 也没有/etc/ini/rc.conf)。systemd同样兼容sysvinit的启动方式。 和upstart算是对手,都是事件驱动。不过目前基本都被systemd取代了。 其他特性优势就不copy了,主要还是了解和使用吧。

pi@raspberrypi-cc:/lib/systemd/system $ ls -l
total 904
-rw-r--r-- 1 root root  502 Jan 23  2017 alsa-restore.service
-rw-r--r-- 1 root root  475 Jan 23  2017 alsa-state.service
lrwxrwxrwx 1 root root    9 Jan 23  2017 alsa-utils.service -> /dev/null
-rw-r--r-- 1 root root  332 Jul 17  2017 apply_noobs_os_config.service
-rw-r--r-- 1 root root  225 Sep 14  2017 apt-daily.service

systemd的启动文件都在/lib/systemd/system/ 目录下,都是以*.service结尾的。(第一篇安装shadowsocks时有修改过),利用systemctl命令可以控制这些服务

sudo systemctl start | stop | restart *.service

要控制开机启动

sudo systemctl enable | disable  *.service

 

停止不需要开机启动的服务

#docker
 sudo systemctl stop docker.socket   sudo systemctl stop docker.service
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable docker
insserv: warning: current start runlevel(s) (empty) of script `docker' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `docker' overrides LSB defaults (0 1 6).

#shadowsock
pi@raspberrypi-cc:/lib/systemd/system  sudo systemctl disable shadowsocks-libev.service  Synchronizing state of shadowsocks-libev.service with SysV service script with /lib/systemd/systemd-sysv-install.  Executing: /lib/systemd/systemd-sysv-install disable shadowsocks-libev  insserv: warning: current start runlevel(s) (empty) of script `shadowsocks-libev' overrides LSB defaults (2 3 4 5).  insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `shadowsocks-libev' overrides LSB defaults (0 1 6).sudo systemctl stop shadowsocks-libev.service      #polipo  pi@raspberrypi-cc:/lib/systemd/system  sudo systemctl disable polipo.service
polipo.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable polipo
insserv: warning: current start runlevel(s) (empty) of script `polipo' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `polipo' overrides LSB defaults (0 1 6).

其中polipo并没有支持systemd的启动方式吗,但是systemd会兼容,去停止相关的sysvinit的。 而其他两个也会同步禁止sysv的启动脚本。用sysv-rc-conf工具看一下发现docker和polipo已经被禁止启动了。

看看rc.d目录,docker和polipo已经变成K开头了。这样启动就不会执行了。

pi@raspberrypi-cc:/etc/rc5.d $ ls -l
total 4
lrwxrwxrwx 1 root root  16 Aug  5 19:33 K01docker -> ../init.d/docker
lrwxrwxrwx 1 root root  16 Aug  5 19:39 K01polipo -> ../init.d/polipo

 

在看看使用upstart方法启动的 (docker支持3种启动。。。), docker被加上了override文件。

pi@raspberrypi-cc:/etc/init $ ls -l | grep docker
-rw-r--r-- 1 root root 1875 Jul 19 03:01 docker.conf
-rw-r--r-- 1 root root    7 Aug  5 19:33 docker.override

所以在树莓派上(systemd的init系统),要控制服务启动关闭、开机启用禁用请都使用systemctl

 

 

启动时执行自己的代码

 

如果想在系统启动的时候执行自己的一些脚本或程序,可以编辑/etc/rc.local 文件。 在exit 0之前写入自己的代码。 不过要注意的是,不能阻塞exit的执行。 比如用nodejs启动一个监听,需要加上&,让程序在后台执行。

pi@raspberrypi-cc:/boot  cat /etc/rc.local  #!/bin/sh -e  #  # rc.local  #  # This script is executed at the end of each multiuser runlevel.  # Make sure that the script will "exit 0" on success or any other  # value on error.  #  # In order to enable or disable this script just change the execution  # bits.  #  # By default this script does nothing.    # Print the IP address  _IP=(hostname -I) || true
if [ "_IP" ]; then    printf "My IP address is %s\n" "_IP"
fi

exit 0

 

 

三 挂载外部存储

 

系统基本搭建好之后,一般可能会需要扩展存储。因为TF卡容量毕竟有限,另外TF卡稳定性相比硬盘来说比较差(和U盘差不多),数据是最重要的,所以重要的数据都建议放在外部存储。树莓派3B+使用的还是USB2.0接口,所以外设使用HHD或SSD速度上没有什么区别。如果考虑到发热和长时间通电的话SSD肯定要好,但是容量就小。对于树莓派桌面版,系统会自动挂载一些常用格式的设备,但是Lite版不会自动挂载。

 

查看设备信息

 

先把要挂载的外部存储插入到USB口,然后执行lsblk命令,查看下当前连接的块设备

pi@raspberrypi-cc:/media $ sudo lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1  3.7G  0 disk
└─sda1        8:1    1  3.3G  0 part
mmcblk0     179:0    0 59.6G  0 disk
├─mmcblk0p1 179:1    0 43.2M  0 part /boot
└─mmcblk0p2 179:2    0 59.6G  0 part /

可以看到我们的TF卡,sda就是刚插上的外部设备(一个U盘),容量是4G。目前没有挂载点,所以我们不能使用。然后用fdisk命令查看一下这个设备的详细信息。

pi@raspberrypi-cc:~ $ sudo fdisk -l

Disk /dev/sda: 3.7 GiB, 3992977408 bytes, 7798784 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x593574b6

Device     Boot  Start     End Sectors  Size Id Type
/dev/sda1  *    958464 7798783 6840320  3.3G  7 HPFS/NTFS/exFAT

 

挂载分区

 

从上面信息知道,要挂载的分区是/dev/sda1,格式是HPFS/NTFS/exFAT(实际是NTFS格式)。执行挂载之后,可以看到U盘已经成功挂载好了。

#创建挂载目录
pi@raspberrypi-cc:~  sudo mkdir upan    #挂载U盘  pi@raspberrypi-cc:~  sudo mount /dev/sda1 /media/upan

#查看一下
pi@raspberrypi-cc:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G  3.0G   54G   6% /
devtmpfs        460M     0  460M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   12M  452M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   43M   22M   21M  52% /boot
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1       3.3G   18M  3.3G   1% /media/upan

 

权限问题

 

默认挂载需要root权限才能挂载,按上面的挂载之后,只有root用户才能读写。所以在挂载时可以设置一下权限。指定uid和gid,可以设置目录的owner(从/etc/passwd可以查看),默认是root,umask指定读写权限(777-umask),rw是读写方式,ro是只读。 如果挂载的是ext文件格式的,我发现加上uid,gid,umask都会报错。 直接挂载默认用户就是当前用户,并且拥有权限。

sudo mount -o uid=1000,gid=1000,umask=001,rw  /dev/sda1 upan/ 

pi@raspberrypi-cc:~ $ ls -l
total 12
drwxr-xr-x 2 pi pi 4096 Aug  5 02:33 bin
drwxr-xr-x 2 pi pi 4096 Aug  5 02:00 source
drwxrwxrw- 1 pi pi 4096 Aug 11  2017 upan

这个时候upan目录已经是属于pi这个用户了,并且读写权限是776。进入upan读取可以,但是写提示没有权限。因为是NTFS格式的U盘,linux默认是不支持ntfs分区写操作的。

pi@raspberrypi-cc:~/upan  cat autorun.inf  [autorun]  ICON=icon.ico,0  pi@raspberrypi-cc:~/upan  touch cc
touch: cannot touch 'cc': Permission denied

我们指定一下分区格式看看,指定ntfs,系统直接不给写权限了。

#卸载
sudo umount /dev/sda1

#重新以ntfs格式挂载
sudo mount -t ntfs -o uid=1000,gid=1000,umask=001,rw /dev/sda1 upan/

pi@raspberrypi-cc:~ $ ls -l
total 12
drwxr-xr-x 2 pi pi 4096 Aug  5 02:33 bin
drwxr-xr-x 2 pi pi 4096 Aug  5 02:00 source
dr-xr-xr-- 1 pi pi 4096 Aug 11  2017 upan

所以需要使用ntfs-3g这个开员工具,它给Linux提供了写NTFS分区的驱动。先安装一下

sudo apt install ntfs-3g

重新挂载一下,分区格式指定为mtfs-3g,然后创建文件,成功了。

#ntfs-3g
pi@raspberrypi-cc:~  sudo mount -t ntfs-3g -o uid=1000,gid=1000,umask=001,rw /dev/sda1 upan/      pi@raspberrypi-cc:~/upan  touch cc
pi@raspberrypi-cc:~/upan $ ls -l
total 453
-rwxrwxrw- 1 pi pi     28 Aug 11  2017 autorun.inf
-rwxrwxrw- 1 pi pi      0 Aug  5 22:30 cc
drwxrwxrw- 1 pi pi      0 Aug 11  2017 GHO
-rwxrwxrw- 1 pi pi 458870 Sep  7  2016 icon.ico
drwxrwxrw- 1 pi pi      0 Aug 11  2017 ISO
drwxrwxrw- 1 pi pi      0 Aug 11  2017 System Volume Information
drwxrwxrw- 1 pi pi      0 Aug 11  2017 Tool

 

 

乱码问题

 

先把U盘重新格式化成FAT32格式, 放入带有中文的文件,然后直接挂载(不用指定-t),默认就有写权限。

pi@raspberrypi-cc:~/upan  ls -l  total 12  drwxrwxrw- 2 pi pi 4096 Aug  6  2018 ?????  -rwxrwxrw- 1 pi pi    9 Aug  6  2018 cc.txt  drwxrwxrw- 2 pi pi 4096 Aug  6  2018 System Volume Information  pi@raspberrypi-cc:~/upan  cat cc.txt
11121���

发现中文目录和文件中的中文都是乱码,创建中文名的文件也失败,但是新创的cc文件中写中文可以正常显示。所以挂载时指定字符集。可以是cp936,gb231, utf8等

sudo mount -o uid=1000,gid=1000,umask=001,rw,iocharset=utf8 /dev/sda1 upan/

pi@raspberrypi-cc:~/upan $ ls -l
total 16
-rwxrwxrw- 1 pi pi    8 Aug  5 22:44 cc
-rwxrwxrw- 1 pi pi    9 Aug  6  2018 cc.txt
drwxrwxrw- 2 pi pi 4096 Aug  6  2018 System Volume Information
drwxrwxrw- 2 pi pi 4096 Aug  6  2018 新建文件夹

文件夹正常了,但是cc.txt文件中显示还是乱码, 使用enca工具查看下2个文件区别。windows下创建的cc.txt是GB2312编码,而树莓派创建的是utf8。

#安装enca工具
pi@raspberrypi-cc:~/upan  sudo apt install enca    pi@raspberrypi-cc:~/upan  enca -L zh_CN cc
Universal transformation format 8 bits; UTF-8
pi@raspberrypi-cc:~/upan $ enca -L zh_CN cc.txt
Simplified Chinese National Standard; GB2312

看来没有支持GB2312中文字符集显示,用vim看文件,里面中文也是乱码。修改一些vim的配置,让支持中文编码的显示 。编辑/etc/vim/vimrc,增加下面的配置,在用vim打开文件,显示就正常了

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

用系统自带的vim.tiny打开也正常了,但是用nano还是乱码。 cat、more、less、 tail这些工具也都是乱码。

 

 

修改系统默认语言

 

看下系统locale信息,都是英文,原来是安装后没有在raspi-config中配置local。

pi@raspberrypi-cc:~ $ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=

可以通过命令配置,但是太麻烦(参考: https://www.cnblogs.com/yun007/p/3775679.html),直接使用raspi-config工具, 增加zh_CN相关的locale


     │    [ ] yue_HK UTF-8                                                                                         ▒   │
     │    [*] zh_CN GB2312                                                                                         ▒   │
     │    [*] zh_CN.GB18030 GB18030                                                                                ▒   │
     │    [*] zh_CN.GBK GBK                                                                                        ▒   │
     │    [*] zh_CN.UTF-8 UTF-8                                                                                    ▒   │
     │    [ ] zh_HK BIG5-HKSCS                                                                                     ▒   │
     │    [ ] zh_HK.UTF-8 UTF-8                                                                                    ▒   │
     │    [ ] zh_SG GB2312                                                                                         ▒   │
     │    [ ] zh_SG.GBK GBK                                                                                        ▒   │
     │    [ ] zh_SG.UTF-8 UTF-8                                                                                    ▒   │
     │    [ ] zh_TW BIG5                                                                                           ▮   │
     │    [ ] zh_TW.EUC-TW EUC-TW                                                                                  ▒   │
     │    [ ] zh_TW.UTF-8 UTF-8

然后系统会让选择一个默认的。我们可以选择zh_CN.UTF-8 (比较习惯英文,还是换回了en),系统生产对应的locales,需要重启一下系统

Generating locales (this might take a while)...
  en_GB.UTF-8... done
  zh_CN.GB2312... done
  zh_CN.GB18030... done
  zh_CN.GBK... done
  zh_CN.UTF-8... done
Generation complete.

重启后系统已经是中文显示了。但是文件还是显示乱码。看来应该是缺少中文字库吧(desktop版中文有乱码就是缺少字库),安装一下中文字库

sudo apt install ttf-wqy-zenhei

结果cat还是乱码。。。。想一下,无论系统设置为中英文,有没有安装字体,UTF8的汉字都能正常显示。 vim修改文件支持的编码后也可以正常显示。应该和系统语言设置还有字体没关系。 在网上搜索了下,有人说可能和终端有关。 我是在Mac上用的iTerm,看了下终端中字符集默认是UTF-8

修改成GB2312看看。

pi@raspberrypi-cc:~/upan  cat cc.txt  11121你好  pi@raspberrypi-cc:~/upan  ls -l
total 16
-rwxrwxrw- 1 pi pi    8 Aug  5 22:44 cc
-rwxrwxrw- 1 pi pi    9 Aug  6  2018 cc.txt
drwxrwxrw- 2 pi pi 4096 Aug  6  2018 System Volume Information
drwxrwxrw- 2 pi pi 4096 Aug  6  2018 婵?????????????

pi@raspberrypi-cc:~/upan $ cat cc
浣????

好吧,UTF8的反倒显示不正常了,GB2312的正常了。 想一下,VIM内容是显示在自己的程序中,而cat、less、more是标准输出到终端。。。所以才会有这个问题。(以前用ubuntu和VPS基本都是英文内容,VIM也基本正常,所以还真没自己研究过终端输出乱码的问题)。然后我又在windows下用putty试了下,默认UTF8以后问题,修改为use font encoding也正常,cmder好像没找到设置的地方,所以显示还是乱码。看来就是终端编码的问题了。 不得不说,windows10真是,默认文本保存还不是UTF8格式。。。。

 

 

自动挂载

 

每次重启后都需要手动挂载,想要自动挂载,就要修改一下/etc/fstab, 根据自己前面挂载参数来填写,注意不要写错,否则可能无法进入系统。

proc            /proc           proc    defaults          0       0
PARTUUID=5f2dcb49-01  /boot     vfat    defaults          0       2
PARTUUID=5f2dcb49-02  /         ext4    defaults,noatime  0       1
/dev/sda1       /home/pi/upan   vfat defaults,uid=1000,gid=1000,umask=001,rw,iocharset=utf8 0 0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

然后重启系统。如果fstab有问题是进不了系统的。这个时候可以用root账号登陆。然后修改fstab文件,也可以把tf卡挂到其他linux机器上修改fstab文件。 如果启动后拔掉了设备,再次连接的时候需要在手动mount一下。

 

移动硬盘的挂载

 

移动硬盘挂载和前面没有区别,唯一要注意的是供电。移动硬盘需要电量相对比U盘大,当PI全速工作时或接的外设比较多时可能导致供电不足,所以挂载移动硬盘最好是能提供外部电源给移动硬盘供电。我直接挂载,正常也是不会有问题的。

 

 

0

如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注