一 安装开发必备软件
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自然也好了
pi@raspberrypi-cc:~/source $ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Raspbian 6.3.0-18+rpi1+deb9u1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1+deb9u1)
好像从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.dsudo 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全速工作时或接的外设比较多时可能导致供电不足,所以挂载移动硬盘最好是能提供外部电源给移动硬盘供电。我直接挂载,正常也是不会有问题的。