撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>
本文永久地址:https://my.oschina.net/bysu/blog/1557801
1 下载:
下载(不得不吐槽,官网上的指引好像下载不了,还是我没找对,反正找了好久)
到http://sg.mirror.archlinuxarm.org/os/中下载
或直接到下面链接下载
http://sg.mirror.archlinuxarm.org/os/ArchLinuxARM-rpi-3-latest.tar.gz
顺便贴上fedora的下载地址:
https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/26/Spins/armhfp/images/Fedora-LXQt-armhfp-26-1.5-sda.raw.xz
centos7的下载地址
http://mirror.centos.org/altarch/7/isos/armhfp/CentOS-Userland-7-armv7hl-Minimal-1708-RaspberryPi3.img.xz
2 安装Archlinux
安装Archlinux这部分在Linux系统中测试通过。sdX
是SD卡盘符。
譬如我通过fdisk -l查到是/dev/sdb1,那么这里就是sdb.说明:我下面的所有操作都是基于window10下面的vmware虚拟机中的centos6.5操作系统。
2.1 SD卡分区
2.1.1 使用fdisk
工具 # fdisk /dev/sdX
2.1.2 在fdisk
提示命令下删除旧分区并新建:
a. 按o
删除全部分区
b. 按p
列出分区,此时应该没有任何分区。
c. 按n
新建分区, 然后p
选择为主分区, 输入1
作为SD卡的第1个主分区; 按回车选择默认开始扇区,再输
入+100M
设置结束扇区.
d. 按t
,然后按c
设置刚才的主分区类型为W95 FAT32(LBA)
.
e. 按n
新建分区,然后p
选择为主分区,输入2
作为SD卡的第2个主分区;按两次回车默认把SD卡剩下的
空间都给第2主分区.
f. 按w
写入保存分区, 退出fdisk.
[bysu@localhost ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 18G 3.5G 14G 21% /
tmpfs 931M 232K 931M 1% /dev/shm
/dev/sda1 291M 39M 238M 14% /boot
/dev/sdb1 30G 96K 30G 1% /media/FEDORA
[bysu@localhost ~]$ sudo fdisk /dev/sdb
[sudo] password for bysu:
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p #1.按p列出分区,可以查看到分区/dev/sdb1
Disk /dev/sdb: 31.9 GB, 31914983424 bytes
255 heads, 63 sectors/track, 3880 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 1 3880 31162004 c W95 FAT32 (LBA)
Command (m for help): o #2.按o删除全部分区
Building a new DOS disklabel with disk identifier 0x8a4c7423.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p #3.按p列出分区,此时应该没有任何分区
Disk /dev/sdb: 31.9 GB, 31914983424 bytes
255 heads, 63 sectors/track, 3880 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8a4c7423
Device Boot Start End Blocks Id System
Command (m for help): n #4.输入n,然后回车.新建分区
Command action
e extended
p primary partition (1-4)
p #5.输入p,然后回车.选择为主分区
Partition number (1-4): 1 #6.输入1作为SD卡的第1个主分区;
First cylinder (1-3880, default 1): #7.此处直接点击回车键,选择开始值,默认为1
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3880, default 3880): +100M #8.输入"+100M"(不包括双引号),然后回车
Command (m for help): t #9.输入t,然后回车键
Selected partition 1
Hex code (type L to list codes): c #10.按c设置刚才的主分区类型为W95 FAT32(LBA)
Changed system type of partition 1 to c (W95 FAT32 (LBA))
Command (m for help): n #11.输入n,然后回车,新建分区
Command action
e extended
p primary partition (1-4)
p #12.输入p,然后回车,选择为主分区
Partition number (1-4): 2 #13.输入2,然后回车.设置第2个主分区
First cylinder (15-3880, default 15): #14.按两次回车键,默认把SD卡剩下的空间都给第2主分区.
Using default value 15
Last cylinder, +cylinders or +size{K,M,G} (15-3880, default 3880):
Using default value 3880
Command (m for help): w #15.输入w,然后回车.把配置写入磁盘,并保存分区, 退出fdisk.
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
2.2 格式化和挂载分区
2.2.1 把第1主分区格式化为FAT分区,并挂载到boot:
# mkfs.vfat /dev/sdb1
# mkdir boot
# mount /dev/sdb1 boot
2.2.2 把第2分区格式化为ext4分区,并挂载到root:
# mkfs.ext4 /dev/sdb2
# mkdir root
# mount /dev/sdb2 root
2.2.3 把第1步中下载好的树莓派Archlinux ARM版本的文件, 安装到SD卡
# tar -zxpf ArchLinuxARM-rpi-latest.tar.gz -C root
# sync
# mv root/boot/* boot
2.2.4 安装完成,卸载分区
# umount boot root
2.3 系统安装完成
Archlinux镜像已经安装成功,连上网线,插上电源,可以直接SSH到树莓派了。
默认用户名和密码分别为:alarm 和alarm
管理员用户名和密码分别为:root和root
2.3.1 一直听说arch是相当极简,所以进入之后,第一时间查看内存的使用
[root@alarm bysu]# free -h
total used free shared buff/cache available
Mem: 909M 57M 755M 276K 96M 837M
Swap: 0B 0B 0B
[root@alarm bysu]# top
top - 11:35:40 up 5:52, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 94 total, 1 running, 93 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0/0.0 0[ ]
%Cpu1 : 0.0/1.3 1[| ]
%Cpu2 : 0.0/0.0 0[ ]
%Cpu3 : 0.0/0.0 0[ ]
GiB Mem : 7.9/0.888 [ ]
GiB Swap: 0.0/0.000 [ ]
2.3.2 整个磁盘的使用情况
[root@alarm bysu]# df -h
Filesystem Size Used Avail Use% Mounted on
dev 420M 0 420M 0% /dev
run 455M 276K 455M 1% /run
/dev/mmcblk0p2 30G 903M 27G 4% /
tmpfs 455M 0 455M 0% /dev/shm
tmpfs 455M 0 455M 0% /sys/fs/cgroup
tmpfs 455M 0 455M 0% /tmp
/dev/mmcblk0p1 110M 58M 52M 53% /boot
tmpfs 91M 0 91M 0% /run/user/1001
[root@alarm bysu]# fdisk -l
Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 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: 0x8a4c7423
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 63 224909 224847 109.8M c W95 FAT32 (LBA)
/dev/mmcblk0p2 224910 62332199 62107290 29.6G 83 Linux
[root@alarm bysu]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 29.7G 0 disk
|-mmcblk0p1 179:1 0 109.8M 0 part /boot
`-mmcblk0p2 179:2 0 29.6G 0 part /
2.3.3 据说管理员账户无法远程登录,但是我用普通账户也无法通过ssh远程登录(经回家排查,普通用户无法远程登录,是因为路由器重置了,没有设置端口转发导致)。于是百度大法,有以下方法。下班回去试一下,在此且记录之。
建立一个用于远程登录的用户
useradd 用户名
设置密码
passwd 用户名
修改以下配置文件/etc/ssh/sshd_config,找到PasswordAuthentication yes,去掉前面的注释符即可;如果还不行,可 参考下面的步骤。
=======================================================
根据需求加入用户组(可以在/etc/group当中查看都有些什么组)
usermod -G 要,加,入,的,用,户,组 用户名
开启sshd服务
systemctl start sshd
远方计算机使用
ssh 用户名@IP
登录
HOWTO
1,密码错误和权限不足的提示信息是一样的,所以不要被迷惑了
2,如果新建用户没有设置根目录的话,默认登录时为根目录/?
3,如果提示信息为远方计算机拒绝链接,或者类似的情况,请修改以下配置文件/etc/ssh/sshd_config,找到PasswordAuthentication yes,去掉前面的注释符;如果还是有问题的话,继续修改配置文件/etc/hosts.allow加上sshd:ALL
4,长时间链接无响应,注意检查服务端是否是内网电脑(有路由一类的),注意做好端口映射
5,服务端可以自己登录自己尝试一下是否配置成功
目前暂时就遇到这几个问题。。ARCH默认状态下的SSH还是蛮不错的
3.配置Archlinux
3.1 新增用户及其相应的家目录
#新增用户
useradd -d /home/bysu -m bysu #使用root用户
#设置密码
passwd bysu #使用root用户
如果出现使用新增用户登录提示该用户的家目录拒绝访问,可以使用一下命令试一下。
chown -R bysu:root /home/bysu/
3.2 添加国内源
- 编辑
/etc/pacman.d/mirrorlist
- 在文件头部添加:
- 清华软件源:
Server = http://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
- 中科大软件源:
Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
- 清华软件源:
- 更新软件源:
# pacman -Syyu
3.3 安装sudo
-
安装sudo:
# pacman -S sudo
-
输入
vi /etc/sudoers
去掉#%wheel ALL=(ALL) ALL
此行注释,使wheel
用户组可以临时使用sudo
提高权限。# visudo
3.4 设置支持中文显示
3.4.1 显示中文
要显示中文,需要生成中文语言包和安装中文字体
1、生成中文语言包
archlinux使用locale-gen脚本生产相应的语言包,locale-gen路径 /usr/bin/locale-gen,使用less打开该脚本。
less /usr/bin/locale-gen
找到下面代码
LOCALEGEN=/etc/locale.gen
LOCALES=/usr/share/i18n/locales
上面第一行是语言包的配置路径;第二行是一些本地化(区域)习惯的配置文件路径,例如货币符号,时间格式,日期格式等等。
按照上面代码,找到 /etc/locale.gen,打开编辑,选择相应的语言(取消行首的注释)。推荐使用UTF-8的那个,兼容性强。
en_us.UTF-8 UTF8
zh_CN.GB18030 GB18030
zh_CN.UTF-8 UTF8
执行命令,生成语言包
locale-gen
设置系统语言为 zh_CN.UTF-8
,编辑 /etc/locale.conf
,写入以下内容
LANG="zh_CN.UTF-8"
(以上方法只能解决ssh中文显示问题,本机直接字符界面启动,中文还是方块)
安装中文字体,推荐使用文泉驿。(最新系统非必要,2017年11月1日)
pacman -S wqy-zenhei
时区
设置时区为 Shanghai
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
时间
树莓派没有硬件时钟,每次关机时间都会丢失,因此需要设置自动联网对时。安装 ntp
,并启用自动对时(新系统好像是不用额外安装就可以联网就自动对时了)
sudo pacman -S ntp
sudo systemctl enable ntpd.service
3.5 配置无线WiFi
写在前面:由于是东拼西凑的,假如你的树莓派是使用目前最新的archlinux版本(2017年11月1日),只需看我标橙色底色部分即可。如果不行,再看全部或者自行百度。谢谢!
树莓派3中自带WiFi,所以不用再上某宝淘了。又省了几十块。树莓派到手差不多一个月了,一直是直接插网线的。因为这期间一直在试用各个系统(raspberry,centos,archlinux,其实还行试一下Fedora和gentoo来的,现在看来这3个就可以了)。主要是想搭建web服务,好像前面两个系统都搭建不成功,archlinux昨天应该是成功。有时间看能不能部署一个web网站上去....反正自己目前想弄的差不多了,所以想试一下通过WiFi连接...(被搞吐血了,每次总是以为好了,可是又不行。不过这次应该总算是好了吧)
摘自:
# 如果之前systemctl enable dhcpcd.service
systemctl stop dhcpcd.service #停住服务
systemctl disable dhcpcd.service #取消开机启动
systemctl status dhcpcd.service #查看状态
# 然后
cd /etc/netctl
cp examples/wireless-wpa . # 后面有一个i点,表示当前目录 A simple WPA encrypted wireless connection
vi wireless-wpa # Modify
Interface=wlan0 # iw dev查看, 或ip link 或ifconfig
Connection=wireless
Security=wpa
IP=dhcp
ESSID='wifi-name' #这个是你需要连接WiFi的名字
Key='wifi-passwd' #WiFi密码
注意,必须先完成以上才能进行一下,否则有一系列问题
netctl enable wireless-wpa
netctl start wireless-wpa
reboot
摘自:
如何在 Arch Linux 的终端里设定 WiFi 网络
如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi。尽管整个过程有点简单,不过我还是要讲一下。在这篇文章里,我将带领新手们通过一步步的设置向导,把你们的 Arch Linux 接入到你的 WiFi 网络里。
在 Linux 里有很多程序来设置无线连接,我们可以用 ip
和 iw
来配置因特网连接,但是对于新手来说有点复杂。所以我们会使用 netctl
命令,这是一个基于命令行的工具,用来通过配置文件来设置和管理网络连接。
注意:所有的设定都需要 root 权限,或者你也可以使用 sudo
命令来完成。
搜索网络
运行下面的命令来查看你的网络接口:
iwconfig
运行如下命令启用你的网络接口,如果没有启用的话:
ip link set interface up
运行下面的命令搜索可用的 WiFi 网络。可以向下翻页来查看。
iwlist interface scan | less
注意: 命令里的 interface 是之前用 iwconfig
获取到的实际网络接口。
扫描完,如果不使用该接口可以运行如下命令关闭:
ip link set interface down
使用 netctl 配置 Wi-Fi:
在使用 netctl
设置连接之前,你必须先检查一下你的网卡在 Linux 下的兼容性。
运行命令:
lspci -k
这条命令是用来检查内核是否加载了你的无线网卡驱动。输出必须是像这样的:
如果内核没有加载驱动,你就必须使用有线连接来安装一下。这里是 Linux 无线网络的官方维基页面:https://wireless.wiki.kernel.org/。
如果你的无线网卡和 Linux 兼容,你可以使用 netctl configuration
。
netctl
使用配置文件,这是一个包含连接信息的文件。创建这个文件有简单和困难两种方式。
简单方式 – Wifi-menu
如果你想用 wifi-menu
,必须安装 dialog
。
- 运行命令:
wifi-menu
-
选择你的网络
wifi-menu to setup wifi in arch
-
输入正确的密码并等待
wifi-menu setup wifi password in arch
如果没有连接失败的信息,你可以用下面的命令确认下:
ping -c 3 www.google.com
哇!如果你看到正在 ping,意味着网络设置成功。你现在已经在 Arch Linux 下连上 WiFi 了。如果有任何问题,可以倒回去重来。也许漏了什么。
困难方式
比起上面的 wifi-menu
命令,这种方式会难一点点,所以我叫做困难方式。在上面的命令里,网络配置会自动生成。而在困难方式里,我们将手动修改配置文件。不过不要担心,也没那么难。那我们开始吧!
-
首先第一件事,你必须要知道网络接口的名字,通常会是
wlan0
或wlp2s0
,但是也有很多例外。要确认你自己的网络接口,输入iwconfig
命令并记下来。scan wifi networks in arch linux cli
-
运行命令:
cd /etc/netctl/examples
在这个目录里,有很多不同的配置文件例子。
-
拷贝将用到的配置文件例子到
/etc/netctl/your_profile
cp /etc/netctl/examples/wireless-wpa /etc/netctl/your_profile
-
你可以用这个命令来查看配置文件内容:
cat /etc/netctl/your_profile
view network profile in arch linux
-
用
vi
或者nano
编辑你的配置文件的下面几个部分:nano /etc/netctl/your_profile
- `Interface`:比如说 `wlan0` - `ESSID`:你的无线网络名字 - `key`:你的无线网络密码
注意:
如果你不知道怎么用 nano
,打开文件后,编辑要修改的地方,完了按 ctrl+o
,然后回车,然后按 ctrl+x
。
edit network profile in arch
运行 netctl
-
运行命令:
cd /etc/netctl
ls
你一定会看到
wifi-menu
生成的配置文件,比如wlan0-SSID
;或者你选择了困难方式,你一定会看到你自己创建的配置文件。 -
运行命令启动连接配置:
netctl start your_profile
。 -
用下面的命令测试连接:
ping -c 3 www.google.com
输出看上去像这样:
check internet connection in arch linux
-
最后,你必须运行下面的命令:
netctl enable your_profile
。netctl enable your_profile
这样将创建并激活一个 systemd 服务,然后开机时自动启动。然后欢呼吧!你在你的 Arch Linux 里配置好 wifi 网络啦。
其他工具
你还可以使用其他程序来设置无线连接:
iw:
iw dev wlan0 link
– 状态iw dev wlan0 scan
– 搜索网络iw dev wlan0 connect your_essid
– 连接到开放网络iw dev wlan0 connect your_essid key your_key
- 使用 16 进制密钥连接到 WEP 加密的网络
wpa_supplicant
- https://wiki.archlinux.org/index.php/WPA_supplicant
Wicd
- https://wiki.archlinux.org/index.php/wicd
NetworkManager
- https://wiki.archlinux.org/index.php/NetworkManager
总结
会了吧!我提供了在 Arch Linux 里接入 WiFI 网络的三种方式。这里有一件事我再强调一下,当你执行第一条命令的时候,请记住你的网络接口名字。在接下来搜索网络的命令里,请使用你的网络接口名字比如 wlan0
或 wlp2s0
(上一个命令里得到的),而不是用 interface 这个词。如果你碰到任何问题,可以在下面的评论区里直接留言给我。然后别忘了在你的朋友圈里和大家分享这篇文章哦。谢谢!
4.系统备份
写在备份前面:特别是没有屏幕,依靠ssh登录的同学注意了。按照下面的方式备份的话,备份之前请修改以下配置文件/etc/ssh/sshd_config,找到PasswordAuthentication yes,去掉前面的注释符;否则可能还原回去之后,ssh登录不是。至于为什么安装官方的安装方法,就算关机了,后续开机还能继续登录?对此,我也百思不得其解。
先说我的备份吧!我下面的所有操作都是基于window10下面的vmware虚拟机中的centos6.5操作系统。然后在centos中进行备份以及还原操作。下面就简单粗暴,直接贴备份的命令
#暂弃,请跳过这一步
tar cvpzf arch_backup.tar.gz --exclude=/proc/* --exclude=/dev/* --exclude=/sys/* --exclude=/lost+found --exclude=/mnt/* --exclude=/tmp/* --exclude=/media --exclude=/run/* --exclude=/var/lock/* --exclude=/var/run/* --exclude=/var/lib/pacman/* --exclude=/var/cache/pacman/pkg/* --exclude=/home/bysu/arch_backup.tar.gz /
其中--exclude是需要排除的目录,我懒得重建,所以都是排除目录下面的文件及其文件目录。其中/home/bysu/arch_backup.tar.gz是备份文件本身(为了稳妥,我通过pwd命令查看当前路径之后,然后再通过绝对路径指定排除的备份文件,当然你也可以通过相对路径,按需调整吧)。否则会备份一个巨无霸出来。
注意:经过本人这两个星期反复测试,发现恢复回去,通过pacman安装软件会报错。所以本人对上述的备份命令做出了让步。
先通过pacman -Scc
清理所有缓存,但这样 pacman 在重装软件包时就只能重新下载了。不过官方的建议是:除非空间不足,否则不应这么做。通过下面的命令备份。
nohup tar cvpzf arch_backup.tar.gz --exclude=/proc/* --exclude=/media/samba/guest/* --exclude=/media/samba/share-rw/* --exclude=/media/samba/lifuli/* --exclude=/media/samba/bysu/* --exclude=/home/bysu/arch_backup.tar.gz / &
#如果过一阵没有跳到终端输入界面,可以直接回车
备份结束时会报如下错误,不过不影响:
tar: Exiting with failure status due to previous errors
通过上面的备份文件还原到新卡上,通过pacman -S安装软件可能会提示下面的错误
:: Retrieving packages...
error: failed retrieving file 'python-3.6.3-1-aarch64.pkg.tar.xz' from mirrors.tuna.tsinghua.edu.cn : Connection timed out after 10001 milliseconds
error: failed retrieving file 'python-3.6.3-1-aarch64.pkg.tar.xz' from mirrors.ustc.edu.cn : Connection timed out after 10001 milliseconds
error: failed retrieving file 'python-3.6.3-1-aarch64.pkg.tar.xz' from mirror.archlinuxarm.org : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds
warning: failed to retrieve some files
error: failed to commit transaction (download library error)
Errors occurred, no packages were upgraded.
后来通过下面的方法解决了
更新pacman
pacman -S pacman
系统还原更加简单。直接准备一张新的sd卡(为免生事端,我在window10中通过【MiniTool分区向导免费版】直接把sd卡的分区删除掉)。然后接下来的步骤跟上面安装系统的步骤一模一样,唯一不同的就是写入文件的镜像改成你的备份文件。至于备份文件如何传到虚拟系统centos6.5中,或通过共享或直接借助软件xftp又或者WinSCP这个软件(我就是使用这个)。这里我也贴出最后的命令吧
tar -zvxpf arch_backup.tar.gz -C root
后续研究rsync备份,然后继续更新该节点...
5.更新 linux内核
树莓派的 Arch Linux ARM 默认使用的不是最新的内核,可以更新成最新的
pacman -S linux-raspberrypi3-latest
6.配置web服务(基于LAMP)
英文文档比较丰富:https://wiki.archlinux.org/index.php/Apache_HTTP_Server
6.1 先安装Apache、PHP
pacman -Sy php php-apache php-gd
【上面命令会自动安装Apache、PHP】
先启动一下Apache看报什么错误
[root@alarm alarm]# apachectl
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::ba27:ebff:fe34:38d5. Set the 'ServerName' directive globally to suppress this message
配置apache:
vi /etc/httpd/conf/httpd.conf
查找ServerName,会看到#ServerName www.example.com:80。把前面的注释#去掉,然后改成你自己的主机名,如果是本机可以改成:
SeverName localhost:80
https://wiki.archlinux.org/index.php/Apache_HTTP_Server
在 /etc/httpd/conf/httpd.conf中找到下面这行,并注释掉
:
#LoadModule mpm_event_module modules/mod_mpm_event.so
找到下面这行,把前面的#去掉。
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
To enable PHP, add these lines to /etc/httpd/conf/httpd.conf
:
在 LoadModule
列表末尾加上下面两句(我的是在185行后面,不同版本的配置文件不同,自己看):
LoadModule php7_module modules/libphp7.so AddHandler php7-script .php
在 Include
列表末尾加上下面这句:
Include conf/extra/php7_module.conf
sytemctl重启 httpd.service
服务.
sytemctl httpd.service restart
测试PHP的配置: 在你的Apache DocumentRoot
目录 (譬如 /srv/http/
or ~/public_html
) 中创建test.php
文件,内容如下:
可以通过如下命令直接创建
echo "" /srv/http/test.php
浏览器中输入:
http://localhost/test.php or http://localhost/~myname/test.php
6.2 安装mysql(官方默认mariadb)
具体配置见:https://wiki.archlinux.org/index.php/MySQL
pacman -Sy mariadb
安装完mariadb后,先别急着启动mariadb.service服务,先运行如下命令:
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
现在可以启动mariadb.service服务了。
systemctl start mysqld
然后需要将MySQL设置开机启动:
systemctl enable mysqld
接下来给mariadb进行安全设置
mysql_secure_installation
先回车,然后一路y下去,期间两次需要输入root的密码
新增普通用户
$ mysql -u root -p
MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass'; MariaDB> GRANT ALL PRIVILEGES ON mydb.* TO 'monty'@'localhost'; MariaDB> FLUSH PRIVILEGES; MariaDB> quit
6.3设置PHP支持mariadb
在 /etc/php/php.ini
文件中取消其注释(删掉行首的;号即可):
extension=pdo_mysql.so extension=mysqli.so
注意: mysql.so
在 PHP 7.0中已经被移除了.
测试php是否连接mariadb。
vi /srv/html/conn.php #新建一个conn.php文件
把下面的内容输入conn.php文件中。
' . 'Connect DB error';
exit;
}
else{
echo 'successful';
}
?>
curl http://192.168.31.146/conn.php #其中192.168.31.146为你本机的ip,请自行更改
不出意外的话,那么你会看到页面输入successful
如果需要通过上面这种方式(终端curl命令)查看php的版本号
更改上面的conn.php的内容为
phpinfo();
?>
或者使用phpversion()函数
echo phpversion();
?>
其他配置参考官方文档。下面从官方文档摘选一部分。
6.4 Configuration files
MariaDB configuration options are read from the following files in the given order (according to mysqld --help --verbose
output):
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
Depending on the scope of the changes you want to make (system-wide, user-only...), use the corresponding file. See this entry of the KnowledgeBase for more information.
Grant remote access
Warning: This is not considered as best practice and may cause security issues. Consider using Secure Shell, VNC or VPN, if you want to maintain the MySQL-server outside and/or inside your LAN.
If you want to access your MySQL server from other LAN hosts, you have to edit the following lines in /etc/mysql/my.cnf
:
[mysqld] ... #skip-networking bind-address =...
Grant any MySQL user remote access (example for root):
$ mysql -u root -p
Check current users with remote access privileged:
SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';
Now grant remote access for your user (here root)::
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'my_optional_remote_password' WITH GRANT OPTION;
You can change the '%' wildcard to a specific host if you like. The password can be different from user's main password.
Disable remote access
The MySQL server is accessible from the network by default. If MySQL is only needed for the localhost, you can improve security by not listening on TCP port 3306. To refuse remote connections, uncomment the following line in /etc/mysql/my.cnf
:
skip-networking
You will still be able to log in from the localhost.
-------------------------------------------------------------------------------------------------------------------------------
7. 安装samba,实现家庭版NAS
中文版(这个不怎么靠谱,还是看下面英文版的吧):
https://wiki.archlinux.org/index.php/Samba_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
英文版 https://wiki.archlinux.org/index.php/Samba
pacman -Sy samba
可以通过touch,在/etc/samba/中创建一个空白文件smb.conf。或者通过下面的命令,从git下载到/etc/samba/中
wget "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" -O /etc/samba/smb.conf
启动smbd和nmbd
systemctl start smbd.service nmbd.service
设置随机启动
systemctl enable smbd.service nmbd.service
添加samba用户
先添加系统用户
sudo useradd samba_user
再添加samba的用户
sudo smbpasswd -a samba_user
可以在配置文件里修改samba用户的密码
文件位置一般是在:/etc/samba/smb.conf
可以通过命令,查看帮助信息:
man smbpasswd
可以通过命令,查看samba的配置文件位置。
whereis samba
8. 安装aria2,实现离线下载,上传百度云
https://wiki.archlinux.org/index.php/Aria2
========================================================================================================================================
下面开始连载archlinux在树莓派上的教程了。博文中作者是基于树莓派2上配置的,因为我使用的是树莓派3.后续会在原博文的基础上修改为使用树莓派3.
网址:http://blog.sina.com.cn/s/blog_537308540102vmm8.htm
其中安装Apache+PHP+ MySQL(四)已经被我重写,因为我安装发现很多步骤都不一样了。如有需要,建议查看原博。
====================================================================
起航ArchLinux(三)
也是第一次接触ArchLinux,Linux我以前只用过CentOS,用来做服务器。好在Linux类的系统基本大同小异,现在有Baidu,信息丰富,慢慢地摸索,慢慢地折腾了。
【网上Baidu的许多资料,都是过时的,ArchLinux新版更改许多,许多资料建立老版本基础上,已经不再适用!】
刚装上的ArchLinux是基本系统,字符界面的,需要安装许多软件,先熟悉字符界面,再开始图像界面,一步一个脚印。
ArchLinux 使用pacman 来进行安装包的管理,使用非常方便。
vi 文本编辑器真不方便,先把它干掉: pacman -R vi
自带的nano 编辑器,还不错,就用它了!
1、安装源先更换一下,使用中科大的,提高网络速度:
[root@alarmpi ~]nano /etc/pacman.d/mirrorlist
修改为:
Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
2、然后更新一下系统:
[root@alarmpi ~]# pacman -S yu
3、 安装lrzsz,可以使用CRT传输文件:
[root@alarmpi ~]# pacman -S lrzsz
4、设置时区,默认是UTC0 (0时区,中国是东8区)
[root@alarmpi ~]#ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
【其实就是修改了/etc/localtime的软连接,连到了/usr/share/zoneinfo/Asia/Shanghai这个文件】
测试一下,看看时区是否正确:
[root@alarmpi etc]# date
Fri Apr 24 13:28:54 CST 2015
5、设置固定的IP地址:
ArchLinux现在使用netctl 管理网络连接,
先编辑一个eth0的接口:
[root@alarmpi ~]# netctl edit eth0
Connection=ethernet
Description=NIC
Interface=eth0
IP=static
Address=('192.168.1.29/24')
Gateway='192.168.1.1'
DNS=('192.168.1.1')
然后使这个eth0接口可以启动的时候激活:
[root@alarmpi ~]# netctl enable eth0
【ArchLinux 使用现在使用systemd管理系统】
安装Apache+PHP+ MySQL(四)
为方便管理mysql,安装一个phpmyadmin。
运行下面的命令安装 phpMyAdmin:
#pacman -S phpmyadmin php-mcrypt
配置
如果已经安装过老版本的phpmyadmin,请先删除:
rm -r /srv/httpd/phpMyAdmin
复制配置文件到你的httpd的配置文件目录
cp /etc/webapps/phpmyadmin/apache.example.conf /etc/httpd/conf/extra/httpd-phpmyadmin.conf
将下面这行添加到 /etc/httpd/conf/httpd.conf:
Include conf/extra/httpd-phpmyadmin.conf
或者,在命令行执行下面的命令也是相同的结果:
echo -e "\nInclude conf/extra/httpd-phpmyadmin.conf" >> /etc/httpd/conf/httpd.conf
编辑/usr/share/webapps/phpMyAdmin/.htaccess,像下面这样注释掉(或者删除)'deny form all':
#deny from all
否则在访问phpmyadmin installation时,会返回错误信息"Error 403 - Access forbidden!"。
'/etc/httpd/conf/extra/httpd-phpmyadmin.conf'中应该包含了下面这些信息:
Alias /phpmyadmin/ "/usr/share/webapps/phpMyAdmin/" AllowOverride All Options FollowSymlinks Order allow,deny Allow from all
打开'/etc/php/php.ini',编辑'open_basedir'这行,将下面的路径补充在后面:
:/usr/share/webapps/:/etc/webapps
例如,像下面这个样子:
open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/srv/:/usr/share/webapps/:/etc/webapps
phpmyadmin需要PHP的mcrypt模块支持,编辑/etc/php/php.ini
的:
;extension=mcrypt.so
取消前面的注释
extension=mcrypt.so
安装Gcc,Make,wiringPi (五)
C语言开发工具安装不必可少的,那就开始吧:
很简单,执行如下即可:
[root@alarmpi ~]# pacman -Sy make gcc
树莓派2的GPIO有40个脚比树莓派1多了许多。用C语言控制GPIO,有个库:wiringPi,使用很方便。
wiringPi是一个简单易用的函数库,通过wiringPi可以扩展SPI和I2C等芯片。
【可以参考微博:http://blog.csdn.net/xukai871105/article/details/17881433】
ArchLinux也有这个安装包:
[root@alarmpi ~]# pacman -Sy wiringpi
查看一下GPIO管脚定义:
[root@alarmpi ~]# watch -n 0.5 gpio readall
树莓派的GPIO口有两种命名方式,一种是wpi方式,另一种是Broadcom方式,当使用WiringPi时,应参考前者。
GPIO 点亮LED (六)
前一篇已经安装了Gcc,wiringpi等工具,现在可以进行GPIO控制LED实验了:
简单写一个C程序 led.c:
[root@alarmpi GPIO]# nano led.c
#include // 加上wiringpi的头文件
#include
#include
int main (int argc,char* argv[])
{
if (-1 == wiringPiSetup()) {
printf("Setup wiringPi failed!");
return 1;
}
pinMode(4, OUTPUT); // 设置输出模式
while(1) {
digitalWrite(4, 1); // GPIO.4输出高电平
delay(800); // 延时800ms
digitalWrite(4, 0); // GPIO.4输出低电平
delay(800);
}
return 0;
}
然后编译led.c:
[root@alarmpi GPIO]# gcc led.c -o led -lwiringPi
成功生成了一个叫 led 的程序。
然后接线了,因为程序中控制的是GPIO.4 脚的高低电平循环,LED要接在GPIO.4 脚上,另一个接VCC
GPIO上有3.3v 也有5v , 我们选3.3v,看下面接线图:
我们要找出GPIO的第1脚 和16脚,树莓派的电路板上没有标出哪个是第1脚,我们可以看GPIO的焊点,
做过电路设计的人都知道,方形焊点的是第1脚
然后就可以接线了:
运行程序成功使LED闪烁:
[root@alarmpi GPIO]# ./led
无损扩容(七)
在树莓派2上装了许多软件以后,发现2G的TF卡已经用了80%了,看来只能再使用大点的TF卡了!
先找了一张4G的卡试试,过几天再买大点的。
本想通过ghost克隆卡,但ghost对卡里的linux分区不太支持,不成功。
然后找了DiskGenius4.7专业版 克隆整个硬盘的方式克隆卡,成功了!新卡插到树莓派上,一切正常!
但发现容量还是2G,原来DiskGenius克隆了原来大小,4G卡的其他2G是“空余空间”。
用DiskGenius调整分区大小,说:该分区不支持无损调整。
那就只能用Linux的fdisk了。
先用老的卡启动树莓派,然后已经克隆的4G卡,通过TF读卡器在USB口插入到树莓派,发现设备名是: sda(插入的时候会显示出了)
然后用fdisk删除linux分区,再新建分区,然后resize2fs 调整大小,成功!
(因为这都只改动了分区表,所以原来的文件都还在)
[root@alarmpi ~]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.26.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p 显示分区信息
Disk /dev/sda: 3.7 GiB, 3904897024 bytes, 7626752 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: 0x4b785da1
Device Boot Start End Sectors Size Id Type
/dev/sda1 32 206847 206816 101M 6 FAT16
/dev/sda2 206848 3887103 3680256 1.8G 83 Linux
Command (m for help): d 删除命令
Partition number (1,2, default 2): 2 选择第2个分区,就是linux分区
Partition 2 has been deleted.
Command (m for help): p 显示分区信息,看是否已经删除
Disk /dev/sda: 3.7 GiB, 3904897024 bytes, 7626752 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: 0x4b785da1
Device Boot Start End Sectors Size Id Type
/dev/sda1 32 206847 206816 101M 6 FAT16 只有一个分区了
Command (m for help): n 新建分区
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p 选择建立主分区
Partition number (2-4, default 2): 直接回车默认
First sector (206848-7626751, default 206848): 直接回车默认(开始扇区)
Last sector, +sectors or +size{K,M,G,T,P} (206848-7626751, default 7626751): 直接回车默认(结束扇区)
Created a new partition 2 of type 'Linux' and of size 3.6 GiB.
Command (m for help): p 显示分区信息,看是否增加成功
Disk /dev/sda: 3.7 GiB, 3904897024 bytes, 7626752 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: 0x4b785da1
Device Boot Start End Sectors Size Id Type
/dev/sda1 32 206847 206816 101M 6 FAT16
/dev/sda2 206848 7626751 7419904 3.6G 83 Linux
Command (m for help): w 保存分区修改
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@alarmpi ~]# resize2fs /dev/sda2 调整sda2 ,即刚建立的分区大小
resize2fs 1.42.12 (29-Aug-2014)
Resizing the filesystem on /dev/sda2 to 927488 (4k) blocks.
The filesystem on /dev/sda2 is now 927488 (4k) blocks long.
[root@alarmpi ~]# mount /dev/sda2 /mnt mount上看看原来文件还在不?
[root@alarmpi ~]# ls -l /mnt
total 72
lrwxrwxrwx 1 root root 7 Apr 23 16:36 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 23 16:40 boot
drwxr-xr-x 2 root root 4096 Apr 2 01:44 dev
drwxr-xr-x 38 root root 4096 Apr 24 22:44 etc
drwxr-xr-x 2 root root 4096 Feb 24 22:27 home
lrwxrwxrwx 1 root root 7 Apr 23 16:36 lib -> usr/lib
drwx------ 2 root root 16384 Apr 23 16:30 lost+found
drwxr-xr-x 2 root root 4096 Feb 24 22:27 mnt
drwxr-xr-x 3 root root 4096 Apr 2 01:45 opt
dr-xr-xr-x 2 root root 4096 Apr 2 01:44 proc
drwxr-x--- 5 root root 4096 Apr 25 10:18 root
drwxr-xr-x 2 root root 4096 Apr 2 01:44 run
lrwxrwxrwx 1 root root 7 Apr 23 16:36 sbin -> usr/bin
drwxr-xr-x 4 root root 4096 Feb 24 22:27 srv
dr-xr-xr-x 2 root root 4096 Apr 2 01:44 sys
drwxrwxrwt 2 root root 4096 Apr 2 01:44 tmp
drwxr-xr-x 8 root root 4096 Apr 2 01:44 usr
drwxr-xr-x 12 root root 4096 Jan 1 1970 var
使用树莓派的spi口使用射频读卡(八)
树莓派的GPIO里面有2个spi口,Achlinux安装默认是关闭的,要使用它,先必须打开它:
编辑/boot/config.txt文件:
[root@alarmpi boot]# nano /boot/config.txt
去掉前面的#,成为如下(打开spi)
device_tree_param=spi=on
加上模块spidev、spi-bcm2835 使启动的时候自己加载:
[root@alarmpi ~]# nano /etc/modules-load.d/raspberrypi.conf
添加2行:
spidev
spi-bcm2835
重新启动!
看看是否有2个spi设备:
[root@alarmpi ~]# ls /dev/sp*
/dev/spidev0.0 /dev/spidev0.1
有这2个设备说明成功开启了spi口,接下了可以使用它了,我们要使用spi连接 射频卡的读卡设备,实验开始了:
程序中用到了bcm2835的库,所以需要安装这个库:
[root@alarmpi ~]# pcaman -Q libbcm2835
【该库的介绍可以见:http://www.airspayce.com/mikem/bcm2835/】
使用RC522的射频卡模块,淘宝模块价格10多点,很经济!
【http://detail.tmall.com/item.htm?spm=a230r.1.14.14.BuOBtd&id=40584858657&ns=1&abbucket=9】
接线图:
通过整整2天的摸索,参考了许多网站,终于搞定了射频卡,看我手机拍的视频:
C语言代码:
spi.c:
#include
#include "RFID.h"
#include
void writeMFRC522(unsigned char Address, unsigned char value);
void antennaOn(void);
void RFID_init()
{
//SPI
bcm2835_spi_begin();
bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);
bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);
bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536);
bcm2835_spi_chipSelect(BCM2835_SPI_CS0);
bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);
writeMFRC522(CommandReg, PCD_RESETPHASE);
writeMFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
writeMFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg
writeMFRC522(TReloadRegL, 30);
writeMFRC522(TReloadRegH, 0);
writeMFRC522(TxAutoReg, 0x40); //100%ASK
writeMFRC522(ModeReg, 0x3D); // CRC valor inicial de 0x6363
antennaOn(); //打开天线
}
void writeMFRC522(unsigned char Address, unsigned char value)
{
char buff[2];
buff[0] = (char)((Address<<1)&0x7E);
buff[1] = (char)value;
bcm2835_spi_transfern(buff,2);
}
unsigned char readMFRC522(unsigned char Address)
{
char buff[2];
buff[0] = ((Address<<1)&0x7E)|0x80;
bcm2835_spi_transfern(buff,2);
return (uint8_t)buff[1];
}
void setBitMask(unsigned char reg, unsigned char mask)
{
unsigned char tmp;
tmp = readMFRC522(reg);
writeMFRC522(reg, tmp | mask); // set bit mask
}
void clearBitMask(unsigned char reg, unsigned char mask)
{
unsigned char tmp;
tmp = readMFRC522(reg);
writeMFRC522(reg, tmp & (~mask)); // clear bit mask
}
void antennaOn(void)
{
unsigned char temp;
temp = readMFRC522(TxControlReg);
if (!(temp & 0x03))
{
setBitMask(TxControlReg, 0x03);
}
}
void antennaOff(void)
{
unsigned char temp;
temp = readMFRC522(TxControlReg);
if (!(temp & 0x03))
{
clearBitMask(TxControlReg, 0x03);
}
}
void calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData)
{
unsigned char i, n;
clearBitMask(DivIrqReg, 0x04); //CRCIrq = 0
setBitMask(FIFOLevelReg, 0x80); //清FIFO指针
//Write_MFRC522(CommandReg, PCD_IDLE);
//向FIFO中写入数据
for (i=0; i
writeMFRC522(FIFODataReg, *(pIndata+i));
writeMFRC522(CommandReg, PCD_CALCCRC);
//等待CRC计算完成
i = 0xFF;
do
{
n = readMFRC522(DivIrqReg);
i--;
}
while ((i!=0) && !(n&0x04)); //CRCIrq = 1
//读取CRC计算结果
pOutData[0] = readMFRC522(CRCResultRegL);
pOutData[1] = readMFRC522(CRCResultRegM);
}
unsigned char MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen)
{
unsigned char status = MI_ERR;
unsigned char irqEn = 0x00;
unsigned char waitIRq = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (command)
{
case PCD_AUTHENT: //认证卡密
{
irqEn = 0x12;
waitIRq = 0x10;
break;
}
case PCD_TRANSCEIVE: //发送FIFO中数据
{
irqEn = 0x77;
waitIRq = 0x30;
break;
}
default:
break;
}
writeMFRC522(CommIEnReg, irqEn|0x80); //允许中断请求
clearBitMask(CommIrqReg, 0x80); //清除所有中断请求位
setBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO初始化
writeMFRC522(CommandReg, PCD_IDLE); //无动作,取消当前命令
//向FIFO中写入数据
for (i=0; i
writeMFRC522(FIFODataReg, sendData[i]);
//执行命令
writeMFRC522(CommandReg, command);
if (command == PCD_TRANSCEIVE)
setBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts
//等待接收数据完成
i = 2000; //i根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
//CommIrqReg[7..0]
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
n = readMFRC522(CommIrqReg);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitIRq));
clearBitMask(BitFramingReg, 0x80); //StartSend=0
if (i != 0)
{
if(!(readMFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr
{
status = MI_OK;
if (n & irqEn & 0x01)
status = MI_NOTAGERR; //??
if (command == PCD_TRANSCEIVE)
{
n = readMFRC522(FIFOLevelReg);
lastBits = readMFRC522(ControlReg) & 0x07;
if (lastBits)
*backLen = (n-1)*8 + lastBits;
else
*backLen = n*8;
if (n == 0)
n = 1;
if (n > MAX_LEN)
n = MAX_LEN;
//读取FIFO中接收到的数据
for (i=0; i
backData[i] = readMFRC522(FIFODataReg);
}
}
else
status = MI_ERR;
}
//SetBitMask(ControlReg,0x80); //timer stops
//Write_MFRC522(CommandReg, PCD_IDLE);
return status;
}
unsigned char findCard(unsigned char reqMode, unsigned char *TagType)
{
unsigned char status;
unsigned int backBits; //接收到的数据位数
writeMFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???
TagType[0] = reqMode;
status = MFRC522ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
if ((status != MI_OK) || (backBits != 0x10))
status = MI_ERR;
return status;
}
unsigned char anticoll(unsigned char *serNum)
{
unsigned char status;
unsigned char i;
unsigned char serNumCheck=0;
unsigned int unLen;
clearBitMask(Status2Reg, 0x08); //TempSensclear
clearBitMask(CollReg,0x80); //ValuesAfterColl
writeMFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]
serNum[0] = PICC_ANTICOLL;
serNum[1] = 0x20;
status = MFRC522ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
if (status == MI_OK)
{
//校验卡序列号
for (i=0; i<4; i++){
*(serNum+i) = serNum[i];
serNumCheck ^= serNum[i];
}
if (serNumCheck != serNum[i]){
status = MI_ERR;
}
}
setBitMask(CollReg, 0x80); //ValuesAfterColl=1
return status;
}
void RFID_halt()
{
unsigned char status;
unsigned int unLen;
unsigned char buff[4];
buff[0] = PICC_HALT;
buff[1] = 0;
calculateCRC(buff, 2, &buff[2]);
status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
}
int main(){
unsigned char s;
unsigned char id[10];
int i;
if (!bcm2835_init()) return -1;
RFID_init();
while(1){
if (findCard(0x52,&s)==MI_OK){
if ( anticoll(id)==MI_OK){
for(i=0;i<5;i++) printf("%d ",id[i]);
printf("\n");
} else printf("ERR\n");
}
sleep(1);
}
bcm2835_spi_end();
bcm2835_close();
return 0;
}
RFID.h:
#define MAX_LEN 18
/
//MF522命令字
/
#define PCD_IDLE 0x00 //取消当前命令
#define PCD_AUTHENT 0x0E //验证密钥
#define PCD_RECEIVE 0x08 //接收数据
#define PCD_TRANSMIT 0x04 //发送数据
#define PCD_TRANSCEIVE 0x0C //发送并接收数据
#define PCD_RESETPHASE 0x0F //复位
#define PCD_CALCCRC 0x03 //CRC计算
/
//Mifare_One卡片命令字
/
#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态
#define PICC_REQALL 0x52 //寻天线区内全部卡
#define PICC_ANTICOLL 0x93
#define PICC_ANTICOLL1 0x93 //防冲撞
#define PICC_ANTICOLL2 0x95 //防冲撞
#define PICC_AUTHENT1A 0x60 //验证A密钥
#define PICC_AUTHENT1B 0x61 //验证B密钥
#define PICC_READ 0x30 //读块
#define PICC_WRITE 0xA0 //写块
#define PICC_DECREMENT 0xC0 //扣款
#define PICC_INCREMENT 0xC1 //充值
#define PICC_RESTORE 0xC2 //调块数据到缓冲区
#define PICC_TRANSFER 0xB0 //保存缓冲区中数据
#define PICC_HALT 0x50 //休眠
/
//MF522 FIFO长度定义
/
#define DEF_FIFO_LENGTH 64 //FIFO size=64byte
/
//MF522寄存器定义
/
// PAGE 0
#define RFU00 0x00
#define CommandReg 0x01
#define CommIEnReg 0x02
#define DivlEnReg 0x03
#define CommIrqReg 0x04
#define DivIrqReg 0x05
#define ErrorReg 0x06
#define Status1Reg 0x07
#define Status2Reg 0x08
#define FIFODataReg 0x09
#define FIFOLevelReg 0x0A
#define WaterLevelReg 0x0B
#define ControlReg 0x0C
#define BitFramingReg 0x0D
#define CollReg 0x0E
#define RFU0F 0x0F
// PAGE 1
#define RFU10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define RFU1A 0x1A
#define RFU1B 0x1B
#define MifareReg 0x1C
#define RFU1D 0x1D
#define RFU1E 0x1E
#define SerialSpeedReg 0x1F
// PAGE 2
#define RFU20 0x20
#define CRCResultRegM 0x21
#define CRCResultRegL 0x22
#define RFU23 0x23
#define ModWidthReg 0x24
#define RFU25 0x25
#define RFCfgReg 0x26
#define GsNReg 0x27
#define CWGsCfgReg 0x28
#define ModGsCfgReg 0x29
#define TModeReg 0x2A
#define TPrescalerReg 0x2B
#define TReloadRegH 0x2C
#define TReloadRegL 0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
// PAGE 3
#define RFU30 0x30
#define TestSel1Reg 0x31
#define TestSel2Reg 0x32
#define TestPinEnReg 0x33
#define TestPinValueReg 0x34
#define TestBusReg 0x35
#define AutoTestReg 0x36
#define VersionReg 0x37
#define AnalogTestReg 0x38
#define TestDAC1Reg 0x39
#define TestDAC2Reg 0x3A
#define TestADCReg 0x3B
#define RFU3C 0x3C
#define RFU3D 0x3D
#define RFU3E 0x3E
#define RFU3F 0x3F
/
//和MF522通讯时返回的错误代码
/
#define MI_OK 0
#define MI_NOTAGERR (-1)
#define MI_ERR (-2)
安装X窗口系统,QT编程环境(九)
项目展示中,ArchLinux系统的字符界面,有点寒碜,安装图像界面也是必不可少的。
ArchLinux中安装X窗口系统比较简单:
[root@alarmpi ~]# pacman -S xorg-server xorg-xinit xorg-utils xorg-server-utils
安装显示卡驱动
[root@alarmpi ~]# pacman -S xf86-video-fbdev
这样你可以在终端用startx启动X窗口系统了:
[root@alarmpi ~]# startx
启动以后发现一片空白,只有一个光标,这是因为还没有安装桌面系统,我们可以安装openbox 等软件。
我们的项目中不需要这些,就不安装了。
我们还需要一个图形界面的软件环境,现在QT比较流行,就使用它了:
[root@alarmpi ~]# pacman -S qt
有了QT我们可以开发项目需要的图形界面了!
可以开始了!(十)
上面就篇已经基本上搭建了项目所需要的所有环境,熟悉了ArchLinux,安装了web服务器,php,数据库。
掌握了树莓派的GPIO口,了解了spi口和射频模块的连接,一切技术上的问题已经掌握!
项目可以真正开始了!
==========================无线网络设置补充==========================
配置无线网络一般分两步:第一步是识别硬件、安装正确的驱动程序并进行配置,安装盘中已经包含驱动,但是通常需要额外安装;第二步是选择一种管理无线连接的方式。这篇文章涵盖了这两方面,并提供了无线管理工具的链接地址。
检查设备状态
根据设备是 PCI 还是 USB 连接,执行 lspci -k
或 lsusb -v
检查设备驱动是否已经加载:
$ lspci -k
06:00.0 Network controller: Intel Corporation WiFi Link 5100 Subsystem: Intel Corporation WiFi Link 5100 AGN Kernel driver in use: iwlwifi Kernel modules: iwlwifi
如果是 USB 设备,执行 dmesg | grep usbcore
可以看到类似下面的输出 usbcore: registered new interface driver rtl8187
。
检查USB无线网卡是否已经正确识别
lsusb
如果树莓派已经正常识别,在显示类似于如下的信息中可以看到你的USB无线网卡设备ID和芯片型号
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
通过 ip link
查看无线 (设备名,通常是类似 wlan0
) 的设备。启用设备:
# ip link set <设备名> up
如果设备加载,接口正常启用,说明不需要安装额外的驱动和固件。
关闭设备的话
# ip link set <设备名> down
查看接入点
# iw dev wlan0 scan |less
注意: 如果显示 "Interface doesn't support scanning",可能是忘了安装固件。有时不以 root 运行 iwlist
也会产生这个问题。同样无线网络可能被软禁于,请安装 rfkill 并运行 rfkill list all
进行检查。
需要关注的信息:
- SSID: 网络的名称.
- Signal: 用 dbm (-100 to 0) 报告的无线信号强度。数值越接近零,信号越好。观察高质量连接和低质量连接的数值差异可以了解设备的信号范围。
- Security: 没有直接报告, 检查
capability
开头的行,如果有Privacy
信息,例如capability: ESS Privacy ShortSlotTime (0x0411)
, 表示网络具有某种程度的保护,- 如果有
RSN
信息,网络被 Robust Security Network(WPA2) 协议保护。 - 如果有
WPA
信息,网络被 Wi-Fi Protected Access 协议保护。 - 在
RSN
和WPA
信息块中,可能看到如下信息:- Group cipher: 数值包括 TKIP, CCMP, both, others.
- Pairwise ciphers: 数值包括 TKIP, CCMP, both, others. 可能和 Group cipher 数值不同.
- Authentication suites: 数值包括 PSK, 802.1x, others. 家用路由器通常可以看到 PSK (i.e. 密码). 在大学中,通常会链接到需要登录名和密码的 802.1x 网络。需要知道其使用的密码管理方式(例如 EAP), 封装方法 (例如 PEAP). 详情请参考 这里 和 这里.
- 如果没有看到
RSN
或WPA
,但是看到了Privacy
, 表示使用的是 WEP.
- 如果有
或者通过命令(对应的网络热点名称:ESSID)
sudo iwlist wlan0 scan | less
如果出现no scan results,可能是上面启动设备刚刚启动设备。如果出现下面报错,则是没有启动设备。
wlan0 Failed to read scan data : Network is down
通过iwconfig确认一下是否已经有了对应的WiFi驱动,如果没有这需要另外安装
iwconfig
lo no wireless extensions.
wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
eth0 no wireless extensions.
如果出现了wlan0,那说明网卡已经正常工作了。
确定树莓派可以检测到你建立的wifiap之后,按照如下方法配置连接网络
运行模式
设置无线网卡的操作模式,如果连接到漫游网络,需要设置操作模式为 ibss
# iw wlan0 set type ibss
注意: 有些网卡需要先关闭无线接口(ip link set wlan0 down
)才能修改模式。
使用如下命令获得wifi设置:
sudo wpa_passphrase SSID名称 密码 > /etc/wpa_supplicant/wpa_supplicant.conf #如果提示权限不够,可以切换root用户
其中wpa_supplicant.conf文件中被写入如下内容
network={
ssid="SSID名称"
#psk="密码"
psk=4b7084a26fea96aaf6751aabbcc1151fb8f47c5fc0674cd6e877a2ecd70b596e
}
连接
根据加密方式不同,需要使用密码将无线设备关联到接入点。
WPA/WPA2
# wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
# dhcpcd wlan0
假设设备使用 wext
驱动。如果无法工作,可能需要调整选项,参见 WPA supplicant。
如果连接成功,在新终端中执行后续命令或者通过 Ctrl+c
退出并使用 -B
参数在后台再次执行上述命令。
# -B 表示后台运行
# -D 设备协议
# -i 设备名
# -c 配件文件
WPA supplicant 页面包含更多参数和配置文件的信息。
通过下面命令确认是否连接成功:
# iw dev wlan0 link
设置开机自动联网
开机自启动服务:
sudo systemctl enable dhcpcd.service
假设要使用的接入点 ESSID 为 MyEssid
:
无加密
# iw wlan0 connect MyEssid
WEP
使用十六进制或 ASCII 密码(格式是自动识别出来的,因为 WEP 密码长度是固定的):
# iw dev wlan0 connect your_essid key 0:your_key
使用十六进制或 ASCII 密码,第三个是默认 (从0计数,共四个):
# iw dev wlan0 connect your_essid key d:2:your_key
获取 IP 地址
使用 DHCP:
# dhcpcd wlan0
静态 IP:
# ip addr add 192.168.0.2/24 dev wlan0 # ip route add default via 192.168.0.1
Tip: dhcpcd 提供了 钩子, 可以使用它自动在无线接口上启动 WPA supplicant。
示例
下面是一个用 WPA supplicant 和 DHCP 设置无线网络的完整示例.
# ip link set dev wlan0 up # wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf # dhcpcd wlan0
要关闭连接,可以禁用接口:
# ip link set dev wlan0 down
要使用静态 IP,将 dhcpcd 命令替换为:
# ip addr add 192.168.0.10/24 broadcast 192.168.0.255 dev wlan0 # ip route add default via 192.168.0.1
禁用接口前,需要先刷新 IP 地址和网关:
# ip addr flush dev wlan0 # ip route flush dev wlan0
如果提示下列错误
如果运行输出
wlan soft blocked
or wlan hardware blocked
这个是因为,无线已经被锁定了,就像你按了笔记本电脑上提供的 wifi关闭快捷键一样
wifi被关闭了,我们要开启才能启动了wifi模块。
rfkill
rfkill 提供就像我们笔记本电脑对wifi 蓝牙等设备开闭的快捷键一样的功能
列出所有的设备,设备有编号
rfkill list
# 输出
1: phy1: Wireless LAN
Soft blocked: no
Hard blocked: no
# 1: 表示wlan设备的编号,下面都是使用这个编号来处理
# no 表示没有被锁定 yes 表示被锁定
rfkill block 1
rfkill list
# 输出
1: phy1: Wireless LAN
Soft blocked: yes
Hard blocked: no
# 我们可以看到 Soft 已经被锁定的,这样我们就不能使用wifi了
锁定设备
解锁设备
rfkill unblock 1
rfkill list
# 输出
1: phy1: Wireless LAN
Soft blocked: no
Hard blocked: no
# 我们可以看到 Soft 已经解锁,这样我们就能使用wifi了
==========================================================================
网摘的都统一放后面吧!
系统备份与还原:
一、引导到基本Linux系统,可用LiveCD,我个人用是grub4dos引导U盘上的archboot ISO镜像。
二、将源分区挂到系统的一个目录下,一般是/mnt,至少我选的是这个。
三、在/mnt下执行“;tar jcvpf backup.tar.bz2 ./ –exclude=files”,其中backup.tar.bz2是备份文件的名字,–exclude=files是要排除的文件及文件夹,要施加多次–exclude=参数,具体要排除的文件及目录如下:
/mnt/*,当然,也可以直接的排除/mnt目录,这个无所谓
/proc/*,这个和网上说的直接排除/proc目录不同,我试了一下,如果直接排除了目录,会影响ARCH的启动,其他发行版不知
/sys/*,同上,建议把目录留下
/tmp/*,这个可以直接排除/tmp目录,但是还是觉得留下目录,排除目录下的东西比较好
/opt,这个直接排除目录就行了,反正如果有东西要装在/opt下,目录不存在的话,会自己创建的
/media/*,这个排除目录还是目录下的内容其实无所谓
/var下的一些东西,这个/var不能完全排除,但是这个目录下的一些log和缓存可以排除,具体的自己选,对于各发行版,备份前记得用各自的命令把软件包缓存清一下,不然……
备份文件本身,这个比较傻,但tar的确是这样做的,因为你备份了当前目录下的东西,而备份文件又是在当前目录下,所以,它会把自己也加进去,这个,不知道说什么好。
四、解包,这个是恢复系统的时候用的,没什么好说的,简单的tar解包指令就行了,目录分区先格式化好,然后挂载到某处,直接解包就行了。
====================================================
我用 rsync -aAXvP
通过网络传的话可以带 -z 开压缩.
开个exclude文件把不应该备份的目录剔除就可以了. 举例:
/proc/*
/dev/*
/sys/*
/tmp/*
/mnt/*
/media/*
/run/*
/var/lock/*
/var/run/*
/var/lib/pacman/*
/var/cache/pacman/pkg/*
/lost+found
我一直用这个方法定期备份整个/, 还可以用这个备份轻易起一个新的机器用 (只需要chroot进去改fstab(因为我用UUID)和装一下grub)
tar -c --xz -f my_archive.tar.xz test.txt #压缩
tar -x --xz -f my_archive.tar.xz #解压
=================================================================
4.1 Linux系统备份与还原TAR(跨机)
http://blog.sina.com.cn/s/blog_6e88948f0102vh30.html
作者:szyzln/转载请说明出处/2015年5月24日
申明:部分命令和机制原理参考于网络贡献的前辈们
说明:
此手册直接采用Linux系统的TAR命令进行备份与还原。虽然是基于每个文件的打包压缩,时间上会慢,但它的优势有以下几点:
1、不需要新旧主机任何硬件配置上、分区上保持一致,做到完全的独立;
2、理论上也不需要新旧主机Linux的内核版本保持一致;
3、在还原的主机上完全可以直接使用一块新硬盘,而不需要事先先安装操作系统。
当然,TAR还原比较简单。重点还需理解Linux下的GRUB引导和修复。
4.2 Linux系统完全备份
方法一:采用TAR命令
(1)、首先成为root用户:
$ sudo su
(2)、然后进入文件系统的根目录(当然,如果你不想备份整个文件系统,你也可以进入你想要备份的目录,包括远程目录或者移动硬盘上的目录):
# cd /
(3)、执行备份系统的完整命令:
# tar cvpzf zxhkredhat.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/dev --exclude=/databack --exclude=/zxhkredhat.tgz /
[命令详解]:
“tar”当然就是我们备份系统所使用的程序了;
“cvpfz”是tar的选项,意思是“创建档案文件”、“保持权限”(保留所有东西原来的权限)、“使用gzip来减小文件尺寸”;
“backup.gz”是我们将要得到的档案文件的文件名;
“/”是我们要备份的目录,在这里是整个文件系统;
--exclude表示备份时排除的无用目录,当然也包含本身产生的备份文件名。
[说明]:在档案文件名“backup.gz”和要备份的目录名“/”之间给出了备份时必须排除在外的目录。有些目录是无用的,例如“/proc”、“ /lost+found”、“/sys”。当然,“backup.gz”这个档案文件本身必须排除在外,否则你可能会得到一些超出常理的结果。如果不把“ /mnt”排除在外,那么挂载在“/mnt”上的其它分区也会被备份。另外需要确认一下“/media”上没有挂载任何东西(例如光盘、移动硬盘),如果有挂载东西,必须把“/media”也排除在外。
(4)、备份完成后,系统“/”根目录下会生成一个名为“backup.tgz”的文件,它的尺寸有可能非常大。现在你可以把它烧录到DVD上或者放到你认为安全的地方去。
[说明]:我这里生成的备份TARGZ文件大小为8.04G,备份时间约为50分钟。
4.3 Linux系统完全还原
方法一:采用TAR命令
1、安装相同发行版本的Linux操作系统,具体内核版本可以不一样。分区情况也不用与原来保持一致。
2、使用LiveCD进入到虚拟内存操作系统。
3、提前备份好原来已安装系统的grub.conf和fstab文件
4、解压
5、修改UUID
6、如果无法启动,使用RedHat安装进入修复模式
Chroot /mnt/sysiamge
Grub-instll /dev/sda
若开机Grub提示“boot error 15 :Error 15 file not found”
解决方法:请检查GRUB相关文件的内核文件所在位置。通常与/boot分区有关。
若开机Grub提示“dracut:dono't how to hand root=f078”
解决方法:将root=UUID改成root=/dev/sdaX这种格式。
若开机系统提示/usr/libexec/gconf-sanity-check-2退出状态256的解决
解决方法:chmod 777 /tmp
若开机系统提示“Could not update ICEauthority file /var/lib/gdm/.ICEauthority”
解决方法:略
4.4 新硬盘还原
(1)、使用LiveCD光盘点击[试用Ubuntu]进入光盘操作系统。
首先找到硬盘。这里假设是未格式化的一块新硬盘
#fdisk -l
Disk /dev/sda:22.0 GiB,24603262976 bytes,
其次,对这块新硬盘进行分区
#fdisk /dev/sda
N为创建 D为删除 P为列出分区信息 W保存分区
然后对分区进行格式化,格式化时指定文件系统格式
#tune2fs -U 22efe8c5-af5e-4744-b7e4-9901a29a679c /dev/sda1
格式式为交换分区:mkswap -U 4b433d7b-846f-4307-93f8-26ab041e8d67 /dev/sda5
[说明]:UUID可以在原系统/etc/fstab配置文件里挂载信息可以查询。
[说明]:查看当前设备块UUID:#blkid
然后,将刚才新建Linux分区挂载到当前LiveCD光盘操作系统中的/mnt
#mount /dev/sda1 /mnt
最后,将之前备份好的TGZ文件放在/mnt目录下。
(2)、解压系统备份文件
#tar zxvf sysback.tgz -C .
(3)、删除或创建一些系统临时产生的目录
(4)、修改UUID
主要是检查/etc/fstab和/boot/grub/grub.cfg里面的与当前设备块UUID是否一致。
[说明]:查看当前设备块UUID:#blkid
(5)、修复GRUB
#grub-install --root-directory=/mnt /dev/sda
重启下再执行:
#update-grub
4.5 扩展知识
一、常用命令
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda2 97G 19G 73G 21% /
tmpfs 3.9G 260K 3.9G 1% /dev/shm
/dev/sda1 194M 32M 153M 17% /boot
/dev/sda6 97G 8.3G 84G 9% /databak
/dev/sda5 97G 15G 77G 16% /usr/local
/dev/sda7 162G 1.4G 152G 1% /var/lib/mysql
[root@localhost ~]# hostname
Localhost.localdomain
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 x86_64 x86_64 GNU/Linux
4.6 Grub引导
严格来讲,目前Linux操作系统分早期Grub和最新的Grub2版本。这里以CentOS的grub0.97举例。
GRUB原理详解:http://blog.chinaunix.net/uid-24774106-id-3497929.html
三个重要的文件:
/etc/fstab
/boot/grub/mesu.lst
/boot/grub/grub.config
参考教材:
系统安装:
http://www.jianshu.com/p/be4a44a54b65
添加用户
http://www.cnblogs.com/kex1n/p/5199109.html
中文字体支持
http://www.linuxdown.net/install/config/2016/0609/5832.html
设置WiFi
https://notelzg.github.io/2016/11/29/archlinux-%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C%E9%85%8D/
http://blog.csdn.net/cugbabybear/article/details/23551007
系统备份
http://blog.csdn.net/sailor201211/article/details/46519919