(注:如若记忆没有出现偏差,本文应是写于2015年,楼主习惯使用LaTeX写笔记,后发现markdown不错,于是稍有修改后发布与此。)
(下文中的所有命令需要以root权限执行)
前言
目前个人常用的单块硬盘的存储量一般是4T左右,随着工作数据量的不断增加以及安全备份的需要,个人单机的容量往往不够用,因此使用大容量存储器成为了必然选择。大容量存储器既能满足团队的数据存储的需求,也有利于团队成员之间共享数据。目前服务器使用的单块硬盘容量可以达到8T左右(注:2017年已有单块10T的硬盘上市)。
这里假定团队除BOSS以外,还有包含以下成员:
表1:成员信息表
成员
主目录名称
次要组名
共享目录名称
备注
BOSS
Boss
BeyondGroup
TeamShare
BOSS账户对所有成员的主目录拥有读取权限
忆霜晨
YiSC
BeyondGroup
TeamShare
兼职管理员,但并非root账户
Jack
Jack
BeyondGroup
TeamShare
Peter
Peter
BeyondGroup
TeamShare
美美
MeiMei
BeyondGroup
TeamShare
雷雷
LeiLei
BeyondGroup
TeamShare
存储器的操作系统采用的是Linux(考虑到便利性,以及并不需要在存储器使用Windows的应用),在Linux的各种发行版中,以CentOS、Debian、Ubuntu等最具代表性,三个Linux发行版各有千秋,考虑到systemd等的应用趋势和软件库的更新速度,这里采用的是Debian 8作为存储器的操作系统。
一、搭建本地镜像
在物理隔离环境中,为了使用方便,可以搭建离线的本地镜像作为软件源。在Debian的发行版中,一般包含有三个iso镜像文件,这三个镜像文件可以挂载安装一些常用的Linux软件,但是毕竟包含不全。所以,将软件源从网上的镜像站点同步下来是一种更好的办法。
1.1 查看镜像源的使用帮助
在国内各个镜像站点中,163源下载速度不错,对于Debian 8.x版本来说,163源使用帮助如下(对应文件: /etc/apt/sources.list):
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
#debian 的安全更新
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
第一个字段:包类型,deb是二进制包,deb-src表示源码包。
第二个字段:镜像站点的网址。
第三个字段:版本对应的仓库。
jessie:表示Debian 8.x的主仓库;
jessie-updates:表示非安全更新仓库;
jessie-backports:表示后备仓库,Debian stable 发布后,其所有软件版本号便已被冻结,所有软件只修 bug,不增加任何特性。但有人可能需要新特性,甚至某些较新的软件原来根本就没有。该仓库正因此而设,但欠官方维护。
其余字段:
main:本身是自由软件,且所有依赖的包也都是自由软件。
non-free:本身并非自由软件,无论依赖如何。
contrib:本身是自由软件,但依赖不纯,即依赖中至少有一例 contrib 或 non-free 者。
1.2 下载源
下载镜像源使用的是apt-mirror工具,在连接网络的Linux系统中安装此工具后(例如在Ubuntu安装sudo apt-get install apt-mirror),配置下载镜像源的网址。apt-mirror工具的配置文件是/etc/apt/mirror.list,将前面163源的使用帮助给出的地址添加到该配置文件中:
# 下载到哪个目录下
set base_path /media/sf_share/Debian8.x_amd64_mirror
set mirror_path $base_path/mirror
set skel_path $base_path/skel
set var_path $base_path/var
set cleanscript $var_path/clean.sh
set defaultarch
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
# 下载使用的线程数
set nthreads 20
set _tilde 0
#镜像的网址
deb-amd64 http://mirrors.163.com/debian/ jessie main non-free contrib
deb-amd64 http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-amd64 http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-amd64 http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
#clean http://ftp.cn.debian.org/debian
之后运行apt-mirror命令即可。对Debian 8.x amd64来说,大概有70G左右的内容,可用tar工具将其打包以便拷贝。
1.3 配置源
镜像源下载好之后,修改/etc/apt/sources.list文件的配置内容,将使用的源改为本地下载好的镜像,然后执行命令:apt-get update即可。
#这里的/xxx/表示镜像源在本地存放的路径。
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian/ \
jessie main contrib non-free
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian/ \
jessie-updates main non-free contrib
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian/ \
jessie-backports main non-free contrib
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian-security/ \
jessie/updates main non-free contrib
注意:使用本地源执行apt-get update时,如出现“Release file expired”错误,执行如下命令进行更新操作:apt-get -o Acquire::Check-Valid-Until=false update。或者在/etc/apt/apt.conf.d/建立文件例如取名:10no--check-valid-until,然后写入内容:
Acquire::Check-Valid-Until "0";
二、FTP服务设置
在对比了几种FTP之后,这里选择使用PureFTP工具来创建FTP服务器。
2.1 安装配置
在 Debian 中, PureFTP 通过/etc/pure-ftpd/conf/目录中的配置文件来确定启动参数。也可以通过查询启动参数的意义,直接采用命令启动,不过最好还是配置这些文件,通过 PureFTP 的内置转换工具,自动将配置文件转换为启动参数。(PureFTP会将参数转换为启动命令,通过systemctl status pure-ftpd可以查看PureFTP的详细启动命令,即可了解其默认设置。)
参数的意义参见官方手册,这里通过脚本来完成配置。需要注意的是,和官方的配置方式不同,在Debian中,PureFTP的每一个参数都对应一个以该参数命名的文件。
Tips:官方手册中除了包含编译、使用等内容以外,还有一个常见问题列表,这个列表非常值得参考,例如如何设置给用户设置共享文件夹等。
文件: ftpSet.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\n 安装 pureFTP"
apt-get install pure-ftpd pure-ftpd-common -y
# 配置 pureFTP
echo -e "\n 配置 pureFTP"
confDir=/etc/pure-ftpd/conf
# 默认已禁止匿名登录
# 限制用户在自己的主目录里
echo "yes" > $confDir/ChrootEveryone
# 使用系统认证用户
echo "yes" > $confDir/UnixAuthentication
# 禁止以.开头文件的读写
echo "yes" > $confDir/ProhibitDotFilesWrite
echo "yes" > $confDir/ProhibitDotFilesRead
echo "yes" > $confDir/DontResolve
# 最大连接数
echo "5" > $confDir/MaxClientsPerIP
# 最大空闲时长
echo "20" > $confDir/MaxIdleTime
# 最大磁盘使用率
echo "98" > $confDir/MaxDiskUsage
# 创建文件的默认权限设置
echo "117 117" > $confDir/Umask
echo -e "\n 重启 pure-ftpd 服务"
systemctl restart pure-ftpd
2.2 设置共享目录
在 chroot 开启的时候如何给 FTP 用户设置共享目录呢?这个问题官方的常见问题手册给出了回答。 PureFTP 源码编译时,可以选择虚拟 chroot 选项,这种情形下,可以通过创建软链接: ln -s来实现共享 (注意使用绝对路径)。但是, Debian 官方仓库中并未开启虚拟 chroot 选项。另一种更好的方法是,将共享目录挂载到用户目录下,命令为: mount - -bind。可写到/etc/fstab 文件中,实现开机挂载。在下一部分会继续介绍。
2.3 虚拟用户
PureFTP 的用户不一定非得是 Linux 用户,可以通过设定一个专门的 FTP Linux 账户,然后所有虚拟用户通过该专门的 Linux 账户访问 FTP,具体命令参见官方手册。
增加虚拟、修改虚拟账户的命令是: pure-pw,其后跟的命令和 Linux 账户配置是一样的。存储虚拟账户的文件格式为:
::::::...
该文件包含了用户使用 FTP 的宽带等设置,其中, account、 password、 uid、 gid、 home 为非空字段。密码的加密方式和系统账户是一样的, home 字段若以“/./”结尾则表示 chroot。添加虚拟用户后, Pure-FTP 的命令可将该文件转化为二进制的 PureDB,该文件是二进制文件,经过了排序处理,在有大量虚拟用户的情况下,可以加快处理速度。也可以使用内置命令直接复制系统账户。
Tips:须查看 Pure-FTP 的配置文件,确认配置文件中默认设置的认证文件位置。例如,在Debian 7.x 中,须做一下如下操作:cd /etc/pure-ftpd/auth,然后ln -s ../conf/PureDB,否则虚拟账户会无法进行认证,可以查看 log 确认问题所在。
三、创建账户并配置权限
3.1 账户设置
创建账号用到的命令及其主要参数意义如下:
useradd [参数选项] 用户账户名 *
参数
-u:指定UID
-g:初始用户组
-G:次要用户组
-m:创建主文件夹
-d:指定主文件夹的绝对路径
-s:指定shell
根据前文中的表1,这里创建用户的命令为:
useradd -G BeyondGroup -m -s /bin/bash -d 主文件夹路径 用户名
创建账户之后,为账户设置密码并修改主文件夹的权限:
echo 用户名:密码 | chpasswd
chmod 750 主文件夹路径
在Debian 8中,使用上述命令创建账户时,账户的初始用户组与账户名字相同,例如:
useradd -G BeyondGroup -m -s /bin/bash -d /home/YiSC YiSC
/home/YiSC目录的所有者为YiSC,所属组也为YiSC。为了使BOSS账户可以查看组员的组目录,这里需要用到ACL(Access Control List),即访问控制列表。命令为:
setfacl -m u:BOSS:rx /home/YiSC
3.2 共享目录夹设置
3.2.1 共享目录权限
首先创建共享目录:
mkdir /home/TeamShare
为了能够使所有成员可以访问该目录,设置该目录的所属组为BeyondGroup,所有成员都包含在该组之中,因而可以访问该目录:
chown root:BeyondGroup /home/TeamShare
事情到这里并没有结束,假定用户YiSC在/home/TeamShare目录下,创建了hello.c文件,想共享给团队所有成员,那么会有什么问题呢?
Tips: 因为用户YiSC所属的默认组为YiSC,因此,hello.c文件的所属组为YiSC,而一般情况下,账户创建文件的others权限为0,所以团队其他成员无法查看该文件。(注:这里需要了解一点umask值的知识,输入命令umask -S即可查看该值,例如可以设置该值为0007,第四位为7,表示others权限在默认值基础上减掉7,也就是说创建的文件权限为770,others权限为0。)
那么如何解决这个问题呢?答案就是Set GID。Set GID即设置文件的特殊权限,数字为2,表现为 s 这个标志在文件用户组的 x 权限上。 可针对目录设置,对目录设置时:
用户在此目录下的有效用户组将会变成该目录的用户组;
在此目录下,用户创建的文件用户组与该目录用户组相同。
为共享目录设置特殊权限:
chmod 2770 /home/TeamShare
此时,用户YiSC在/home/TeamShare目录下创建了hello.c文件,hello.c文件的所属组和/home/TeamShare目录的所属组相同,都为BeyondGroup,因此团队所有成员都可以访问该文件了。
3.2.2 挂载目录
前面FTP部分提到了共享目录,由于FTP服务将用户限制在自己的主目录里,为了在FTP中访问共享目录,可以将共享目录挂载到用户的主目录下,并设置开机自动挂载。
# 在用户组目录创建一个目录用于挂载共享目录并设置权限
mkdir /home/YiSC/TeamShare
chown YiSC:YiSC /home/YiSC/TeamShare
# 开机挂载
echo "/home/TeamShare /home/YiSC/TeamShare none defaults,bind 0 0" \
>> /etc/fstab
四、配置用户环境
4.1 配置Vim
Vim常用的几款插件有:NERD-Tree、taglist、ctrlp等,在用户主目录创建.vim目录并下载的插件包解压到该目录,Vim的配置文件位于用户主目录的.vimrc文件。为用户简单配置Vim如下:
"文件: Vim.dat
"显示行号
set number
"显示光标当前位置
set ruler
"总是显示状态栏
set laststatus=2
" 高亮显示当前行/列
"set cursorline
"set cursorcolumn
"高亮显示搜索结果
set hlsearch
"查找前预览
set incsearch
"搜索时大小写不敏感
set ignorecase
"关闭兼容模式
set nocompatible
"禁止光标闪烁,gVim有效
"set gcr=a:block-blinkon0
"缩进方式
set tabstop=4
set softtabstop=4
set shiftwidth=4
"基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
"启动 vim 时关闭折叠代码
set nofoldenable
"配色方案
colorscheme koehler
" 开启文件类型侦测
filetype on
" 根据侦测到的不同类型加载对应的插件
filetype plugin on
"语法高亮
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
"插件设置
map :NERDTreeToggle
map :TlistToggle
let Tlist_Use_Right_Window=1
nmap h " control+h进入左边的窗口
nmap j " control+j进入下边的窗口
nmap k " control+k进入上边的窗口
nmap l " control+l进入右边的窗口
"对齐插件设置,不是特别灵敏
let mapleader=";"
nmap t& :Tab /&
vmap t& :Tab /&
nmap t= :Tab /=
vmap t= :Tab /=
nmap t" :Tab /"
vmap t" :Tab /"
nmap t: :Tab /:
vmap t: :Tab /:
nmap t:: :Tab /:\zs
vmap t:: :Tab /:\zs
nmap t, :Tab /,
vmap t, :Tab /,
nmap t,, :Tab /,\zs
vmap t,, :Tab /,\zs
nmap t :Tab /
vmap t :Tab /
4.2 配置bash环境
bash的配置文件(注:给用户的配置文件)位于用户主目录的.bashrc文件,添加以下内容对bash进行简单的配置:
umask 0007
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
export GIT_EDITOR=vim
五、总结
通过脚本,可以将这些工作轻松处理。
5.1 安装必要的软件
文件: installPackages.sh
#!/bin/bash
echo -e "\nYiYi's 脚本: 安装 编译环境、 Git、 Vim、 ctags、 sudo 等软件包\n"
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
apt-get install build-essential vim -y
apt-get install ctags -y
apt-get install git git-gui -y
apt-get install sudo -y
5.2 配置root的工作环境
文件:setRootEnv.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\nYiYi's 脚本: 设置 root 的用户环境\n"
homeDir=/root
chmod 750 $homeDir
# 创建 vim 配置文件目录
if [ ! -d "/root/.vim" ]
then
mkdir $homeDir/.vim
fi
echo -e "YiYi's 脚本: 复制 Vim 插件\n"
cp -av VimPlugin/* $homeDir/.vim/
# Vim.dat的内容见前文。
cp -v Vim.dat $homeDir/.vimrc
echo -e "\nYiYi's 脚本: 设置 .bashrc"
cat $homeDir/.bashrc | grep -q ".mybashset"
# 对bash环境进行简单设置,rootBash.dat内容见前文。
if [ $? -ne 0 ]
then
cp -v rootBash.dat $homeDir/.mybashset
/bin/bash ./backupFile.sh $homeDir/.bashrc
echo "source $homeDir/.mybashset" >> $homeDir/.bashrc
fi
echo -e "\nYiYi's 脚本: 设置ssh"
/bin/bash ./backupFile.sh /etc/ssh/sshd_config
echo "UseDNS no" >> /etc/ssh/sshd_config
systemctl restart ssh
这里的backupFile.sh是用来将系统原始文件备份的。
文件:backupFile.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
fileName=$1
cp -p $1{,.$(date +%F-%H-%M-%S).backup}
5.3 增加用户
文件:addUsers.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
# 增加用户组
teamName=BeyondGroup
groupadd $teamName
# 用户
accounts=$(cat accounts.dat)
# HOME目录
homeDir=/RAID5
# 创建共享目录
shareDir=$homeDir/TeamShare
mkdir $shareDir
chown root:$teamName $shareDir
chmod 2770 $shareDir
/bin/bash ./backupFile.sh /etc/fstab
for data in $accounts
do
userName=$(echo $data | cut -d ":" -f 1)
initPasswd=$(echo $data | cut -d ":" -f 2)
#创建用户
echo "Add User:" $userName
useradd -G $teamName -m -s /bin/bash -d /$homeDir/$userName $userName
echo $userName:$initPasswd | chpasswd
#修改主文件目录权限
if [ -d $homeDir/$userName ]
then
echo "Set HOMEDIR 750:" $homeDir/$userName
chmod 750 $homeDir/$userName
fi
/bin/bash ./setuserEnv.sh $userName
/bin/bash ./shareDir.sh $userName
done
mount -a
/bin/bash ./setACL.sh
echo -e "\nAll Done!"
accounts.dat是账户名和对应的初始密码。
文件:accounts.dat
BOSS:xxxxxxxxxxxxxxxxxxx
YiSC:xxxxxxxxxxxxxxxxxxx
Jack:xxxxxxxxxxxxxxxxxxx
Peter:xxxxxxxxxxxxxxxxxxx
MeiMei:xxxxxxxxxxxxxxxxxxx
LeiLei:xxxxxxxxxxxxxxxxxxx
setuserEnv.sh用于设置用户环境。
文件:setuserEnv.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\nYiYi's 脚本: 设置 $1 的用户环境\n"
userName=$1
homeDir=/RAID5/$userName
# 创建 Vim 插件目录
if [ ! -d "$homeDir/.vim" ]
then
mkdir $homeDir/.vim
fi
# 复制 Vim 插件
echo -e "YiYi's 脚本: 复制 Vim 插件\n"
cp -av VimPlugin/* $homeDir/.vim/
chown -R $userName:$userName $homeDir/.vim
# 复制 Vim 配置文件
cp -v Vim.dat $homeDir/.vimrc
chown $userName:$userName $homeDir/.vimrc
# 复制 bash 配置文件
echo -e "\nYiYi's 脚本: 设置 .bashrc"
/bin/bash ./backupFile.sh $homeDir/.bashrc
cp -v Bash.dat $homeDir/.mybashset
chown $userName:$userName $homeDir/.mybashset
cat $homeDir/.bashrc | grep -q ".mybashset"
if [ $? -ne 0 ]
then
echo "source $homeDir/.mybashset" >> $homeDir/.bashrc
fi
shareDir.sh用于设置共享目录。
文件:shareDir.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\nYiYi's 脚本: 设置 $1 的用户环境\n"
useName=$1
homeBase=/RAID5
homeDir=$homeBase/$useName
shareDir=$homeDir/TeamShare
# 创建共享目录
if [ ! -d "$shareDir" ]
then
mkdir $shareDir
chown $useName:$useName $shareDir
else
echo -e "\nYiYi's 脚本: $shareDir 目录已存在\n"
fi
# 开机挂载
echo "$homeBase/TeamShare $shareDir none defaults,bind 0 0" \
>> /etc/fstab
setACL.sh用于设置BOSS用户访问组员目录权限。
文件:setACL.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
# 用户
accounts=$(cat accounts.dat)
# HOME目录
homeDir=/RAID5
superUser=BOSS
for data in $accounts
do
userName=$(echo $data | cut -d ":" -f 1)
if [ $userName != $superUser ]
then
setfacl -m u:$superUser:rx $homeDir/$userName
fi
done
echo -e "\nYiYi's 脚本: ACL权限设置完毕\n"