嵌入式Linux入门3:Linux服务器搭建

本文介绍在Linux系统(ubuntu 16.04)中搭建各种服务器的方法,包括NFS、samba、ssh、telnet。另外也会提及交叉编译器的安装。

一、ssh服务器

Linux(包括服务器、设备端)开启SSH,使用如ssh secure shell client等客户端工具连接、登陆,找到对应目录,可实现相互拷贝。

1、安装:

1
sudo apt-get install openssh-server

2、重启:

1
sudo/etc/init.d/ssh restart

3、修改端口

SSH默认服务端口为22,可修改为其它端口,如220,修改配置文件/etc/ssh/sshd_config,将Port 22改为Port 220即可。

附:SSH Secure Shell Client无法连接ubuntu解决方法

1、编辑/etc/ssh/sshd_config配置文件。

1.1、

PermitRootLogin prohibit-password改为 PermitRootLogin yes

1.2、最后添加:
1
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96 KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org

2、重启ssh服务

1
sudo service ssh restart

再次使用SSH Secure Shell Client即可连接。

二、samba服务器

Linux主机搭建samba服务器后,可以使用windows连接Linux,并建立硬盘映射,这样,就可以将主机当成Windows一个硬盘使用。

1、samba的安装:

1
2
sudo apt-get install samba 
sudo apt-get install smbclient (客户端,可选)

注:如果安装有错误,则要更新源:

1
sudo apt-get update

2、创建共享目录(可选):

1
2
mkdir /home/latelee/share 
sudo chmod 777 /home/latelee/share

3、创建Samba配置文件:

3.1. 保存现有的配置文件(可选)

1
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

3.2. 修改现配置文件

1
sudo vim /etc/samba/smb.conf

在smb.conf最后添加

1
2
3
4
5
6
[home] # 用于显示在windows的名称
    comment = samba home # 注释,不要也可以
    path = /home/latelee # 共享目录路径
    writable = yes # 可写
    browseable = yes # 可看
    guest ok = no # 不允许guest

注:格式如上,路径根据实际情况改

4、创建samba帐户

1
2
3
4
5
  sudo touch /etc/samba/smbpasswd (此步不要也行)
  sudo smbpasswd -a latelee(用户名)

New SMB password:(此处密码,建议与登陆密码相同)
Retype new SMB password:(此处密码,建议与登陆密码相同)

注:如果没有第四步,登录时会提示 session setup failed: NT_STATUS_LOGON_FAILURE

5、重启samba服务器

1
2
3
4
5
6
fc10系统: 
/etc/init.d/smb restart

ubuntu系统:
sudo /etc/init.d/samba restart
sudo /etc/init.d/smbd restart (此步可不要)

注:不同版本路径、名称可能不同,根据实际情况尝试。

6、测试 (不要也行)

1
smbclient -L //localhost/共享目录

7、使用windows连接

在windows地址栏中输入:\\<虚拟机IP地址>\home,如:\\192.168.28.131\home,然后输入账号密码即可。

三、telnet服务器

1、安装:

默认源没有xinetd等软件包,所以要更新源:

1
2
3
sudo apt-get update
sudo apt-get install xinetd telnetd
sudo apt-get install inetutils-telnetd

2、配置

修改文件 /etc/xinetd.conf (xinetd默认为此文件):

1
2
3
4
5
6
7
8
9
10
11
# new add by Late Lee
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root (存疑:root表示执行程序的权限还是登陆用户?从测试中看,是root权限,换其它用户名,会提示telnetd /usr/lib/telnet login permission denied)
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}

3、修改端口

修改/etc/services,将telnet的23改为其它的不冲突的端口号,如250。

4、重启

1
/etc/init.d/xinetd restart

5、登陆

命令:

1
telnet ip 端口号

6、允许root登陆

ubuntu不允许root用户用telnet来登陆,但可以使用非root用户,与ssh类似。
如果一定要用root登陆,方法有2种:

6.1、将/etc/securetty文件改名

6.2、在/etc/securetty文件最后添加

1
2
3
4
5
6
7
8
9
10
11
# add pts by Late Lee
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9

说明: securetty文件规定了root可以从哪些终端登陆,像ssh、telnet等是用伪终端pts,另外该文件还有如标准终端的tty(按Ctrl+Alt+数字登陆)、串口ttyS、ttyUSB、ttyO(OMAP系的串口),等等

四、NFS服务器

使用nfs挂载之后,可以将远程主机目录作为本地目录那样使用。十分方便。

1、安装

1
sudo apt-get install nfs-kernel-server

注:如果失败,可以再尝试一次,或者用命令:

1
sudo apt-get update

2、配置

编辑文件/etc/exports,加入下列语句:

1
[共享目录绝对路径] *(rw,no_root_squash,no_all_squash,sync)

例如:

1
/opt *(rw,no_root_squash,no_all_squash,sync)

注:可添加多个共享目录

3、启动NFS服务

1
sudo /etc/init.d/nfs-kernel-server restart

4、ARM-Linux挂载测试

命令示例:

1
mount -t nfs -o nolock 172.18.18.18:/opt /mnt/nfs

说明,最好添加-o nolock选项,否则可以挂载不成功。

五、交叉编译器安装

交叉编译器种类很多,版本也很多,所以,此处只列出一般的方法。

1、获取

获取交叉编译器的方式有很多种,如果购买了开发板,一般会提供光盘(或网盘压缩包),里面有交叉编译器,如果没有,可以到官方网站下载(国内有的厂家权限管理较严,必须购买板子才提供账号)。也可以在网上搜索得到。下面是笔者找到的几个地址:
http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 注:该地址的版本非常低,是十几年前的版本。

在ubuntu下,可以直接使用apt来安装。比如:

1
2
sudo apt-get install -y gcc-arm-linux-gnueabi g++-arm-linux-gnueabi # 普通版本
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y # 硬件浮点版本

2、安装

安装交叉编译器非常简单,就是设置环境变量PATH的值,即将交叉编译的bin目录设置到PATH里即可。但是目前有很多芯片的开发环境比较复杂(或者将很多库、功能集中在一直,或者依赖工具、库太多),需要专门的脚本才能设置好。这里暂时不涉及。
设置PATH的格式是:export PATH=<交叉编译器bin目录的绝对路径>:$PATH。一般在~/.bashrc文件最后添加即可。添加完成后,需要执行source ~/.bashrc命令更新环境变量。当然,如果是团队协作,可以在/etc/profile中添加,这样所有登陆用户都可用。
下面是笔者的设置示例(在~/.bashrc文件末尾,笔者有2个交叉编译器,所以设置了2行):

1
2
3
export PATH=/home/latelee/linux_ebook/arm-unknown-linux-gnueabihf/bin:$PATH

export PATH=/home/latelee/bin/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/:$PATH

注:~表示用户的home目录,比如在笔者虚拟机上就表示/home/latelee

3、验证

在命令行输入<交叉编译器名称> -v[或--version]即可查看编译器版本,也可验证是否正确安装。
直接输入arm,再按2次Tab键,输入y即可查看所有以arm开头的命令。
笔者在虚拟机上安装了2个,如下:

1
2
3
4
$ arm-fsl-linux-gnueabi-gcc --version
arm-fsl-linux-gnueabi-gcc (Freescale MAD -- Linaro 2011.07 -- Built at 2011/08/10 09:20) 4.6.2 20110630 (prerelease)
$ arm-unknown-linux-gnueabihf-gcc --version
arm-unknown-linux-gnueabihf-gcc (crosstool-NG crosstool-ng-1.23.0) 6.3.0

arm-fsl-linux-gnueabi-gcc是由Linaro出口的,而arm-unknown-linux-gnueabihf-gcc则是由笔者使用crosstool-ng编译出来的。

4、使用

交叉编译器的使用与其它编译器没有什么不同。以Makefile为例,可以在Makefile文件中添加或修改CROSS_COMPILE选项,也可以在make的时候手动指定CROSS_COMPILE的值。下面是编译内核的一个例子:

1
make zImage CROSS_COMPILE=arm-fsl-linux-gnueabi- ARCH=arm

注:CROSS_COMPILE是默认的交叉编译器前缀。

5、交叉编译器小知识

每个交叉编译器的名称都会有所不同,而且名称都比较长。具体到交叉编译器的bin目录查看。但是,一般情况,都会提供arm-linux-gcc这样的简称——其实它是一个链接文件。
交叉编译器的名称规则为<前缀>-<工具名称>。简述如下:
1、前缀如下:
<架构>-<CPU核心/或芯片厂家>-<所运行的操作系统>-<编译器库和目标镜像规范>
arm-fsl-linux-gnueabi-分别表示:arm芯片,飞思尔卡平台(fsl),生成的文件运行在linux系统,接口规范为gnueabi
2、工具名称表示binary utils,比如编译器为gcc,调试器为gdb,链接器为ld,等等。
综合来说,就构成很多不同的工具,列举如下:

1
2
3
4
5
6
7
8
9
10
11
$ arm-fsl-linux-gnueabi-
arm-fsl-linux-gnueabi-addr2line arm-fsl-linux-gnueabi-gcc arm-fsl-linux-gnueabi-objcopy
arm-fsl-linux-gnueabi-ar arm-fsl-linux-gnueabi-gcc-4.6.2 arm-fsl-linux-gnueabi-objdump
arm-fsl-linux-gnueabi-as arm-fsl-linux-gnueabi-gcov arm-fsl-linux-gnueabi-populate
arm-fsl-linux-gnueabi-c++ arm-fsl-linux-gnueabi-gdb arm-fsl-linux-gnueabi-ranlib
arm-fsl-linux-gnueabi-cc arm-fsl-linux-gnueabi-gdbtui arm-fsl-linux-gnueabi-readelf
arm-fsl-linux-gnueabi-c++filt arm-fsl-linux-gnueabi-gprof arm-fsl-linux-gnueabi-run
arm-fsl-linux-gnueabi-cpp arm-fsl-linux-gnueabi-ld arm-fsl-linux-gnueabi-size
arm-fsl-linux-gnueabi-ct-ng.config arm-fsl-linux-gnueabi-ld.bfd arm-fsl-linux-gnueabi-strings
arm-fsl-linux-gnueabi-elfedit arm-fsl-linux-gnueabi-ldd arm-fsl-linux-gnueabi-strip
arm-fsl-linux-gnueabi-g++ arm-fsl-linux-gnueabi-nm

注:关于abi、eabi、gnueabi、gnueabihf等的知识,自行了解。

李迟 2017.7.8 周六 傍晚 2019.7.20 周六 补充