**CentOS 7.5 深度配置** 1652270 **冯舜** Linux 共享目录给 Windows ===== 要求将 Linux 下的根目录中的 `/d1652270` 子目录共享给 Windows, 并解决一系列的访问问题.

建立子目录

切换到根目录 `/` , 使用 `mkdir d1652270` 建立子目录, 如 Figure [mkdir] 所示. ![Figure [mkdir]: 建立 d1652270 目录](pic2/1.png)

安装 Samba 服务器

Samba 是类 UNIX 系统对于 SMB/CIFS 文件共享协议的实现. 现在用 `yum install samba samba-client samba-common -y` 命令安装 Samba 服务器和客户端, 如 Figure [yumsamba] 和 Figure [yumsamba2]: ![Figure [yumsamba]: 安装 Samba 服务器和客户端](pic2/2.png) ![Figure [yumsamba2]: 安装 Samba 服务器和客户端](pic2/3.png) ## 将子目录共享并映射到 Windows 下的盘符 1. 确认 Windows 下的工作站域(工作组名)如 Figure [workgroup]. 本例中为 `WORKGROUP`: ![Figure [workgroup]: 确认 Windows 工作组名](pic2/4-.png) 2. 进入 `/etc/samba` 目录, 编辑配置文件 `smb.conf`, 如 Figure [smb.conf]. ![Figure [smb.conf]: 编辑 smb.conf](pic2/4.png) 如 Figure [vimsmb] 所示, 在 global 里添加、删除一些选项, 修改组为之前确认的工作组名, 并添加一个表示共享资源的段 `[d1652270]`, 指定 `path` 属性为刚刚建立的文件夹. ![Figure [vimsmb]: 编辑 smb.conf](pic2/vimsmb.png) 3. 配置用户: 首先用 `groupadd smbgroup` 在系统中创建名为 `smbgroup` 的用户组, 之后用 `useradd -G smbgroup 1652270` 在这个组中创建名叫 `1652270` 的用户, 并用 `passwd` 命令为其设置系统用户密码、用 `smbpasswd` 命令为其设置 Samba 访问密码, 如 Figure [smbuser]. 同时, 用 `chown` 和 `chmod` 命令更改 `/d1652270` 的拥有者、拥有用户组和访问权限为 `1652270:smbgroup` 和 `0744`. 如 Figure [smbchown] 所示. 同时, 需要用 `chcon` 命令更改安全上下文, 使文件夹能够用 Samba 共享. ![Figure [smbuser]: 设置 SMB 用户](pic2/smbuser.png) ![Figure [smbchown]: 设置文件夹权限和安全上下文](pic2/smbchown.png) 4. 使用 `systemctl` 命令启动 `smb` (Samba 服务器)、`nmb` (NetBIOS 名称解析服务器), 并将它们设为开机启动, 如 Figure [enable]. ![Figure [enable]: 使用 `systemctl` 启动服务](pic2/enable.png) 5. 使用防火墙设置命令 `firewall-cmd` 将 `samba` 服务对应的端口添加到白名单, 并加 `--reload` 参数应用防火墙设定, 如 Figure [firewall]. ![Figure [firewall]: 设置防火墙](pic2/firewall.png) 6. 使用 `su 1652270` 以 1652270 登录, 在 /d1652270 下建立中文、英文文件名的测试文件, 如 Figure [createtest]. ![Figure [createtest]: 建立测试文件](pic2/createtest.png) 7. 用 Windows 资源管理器打开"网络" (确保在当前网络中开启了网络共享), 若发现名为 `VM-LINUX` 的主机, 打开之; 否则在地址栏内输入 `\\192.168.80.230` (vm-linux 的 IP 地址) 按回车. 在弹出的验证对话框中输入用户名 `1652270` 和相应的密码, 确认后便列出了该用户可以访问的所有资源, 如 Figure [userpasswd] 和 Figure [allres]. ![Figure [userpasswd]: Windows 共享用户验证](pic2/userpasswd.png) ![Figure [allres]: Windows 登录 Samba 服务器](pic2/allres.png) 进入 `d1652270` 目录, 只发现和正常打开英文文件名的 `Test.txt`, 中文文件名的文件消失, 因此需要进一步设置, 如 Figure [onlyeng] ![Figure [onlyeng]: 无中文文件](pic2/onlyeng.png) 8. 再次配置 `/etc/samba/smb.conf`, 在 `global` 中添加与字符集有关的属性 `unix/display charset` 和 `dos charset` 为 `GBK` 和 `CP936`, 如 Figure [setcharset]. 编辑保存后, 重启 Samba 服务, 如 Figure [restartsmb]. 再次刷新 Windows 资源管理器, 发现中文名文件已经可以正常查看和打开, 如 Figure [havechn]. ![Figure [setcharset]: 设置字符集为 GBK 系](pic2/setcharset.png) ![Figure [restartsmb]: 重启 Samba 服务](pic2/restartsmb.png) ![Figure [havechn]: 中文文件名正常](pic2/havechn.png) 9. 使用 Windows 的 "映射到网络驱动器" 功能, 将 `\\192.168.80.230\d1652270` 映射到 `Z:` 盘, 如 Figure [mapdrive1]、Figure [mapdrive2]、 Figure [mapdrive3]. ![Figure [mapdrive1]: 映射到网络驱动器-1](pic2/mapdrive1.png) ![Figure [mapdrive2]: 映射到网络驱动器-2](pic2/mapdrive2.png) ![Figure [mapdrive3]: 映射到网络驱动器-3](pic2/mapdrive3.png) ## 设置 Windows 的访问权限 (只读 读写) 只需使用 `vim /etc/samba/smb.conf` 配置 Samba, 将要更改的资源的 `read only` 属性置为 `yes` 再重启 Samba 服务器即可实现只读, 如 Figure [readonly]、Figure [readonlyapply]、Figure [readonlyeffect]. ![Figure [readonly]: 设置资源只读](pic2/readonly.png) ![Figure [readonlyapply]: 重启服务器](pic2/readonlyapply.png) ![Figure [readonlyeffect]: Windows 无法保存, 只读生效](pic2/readonlyeffect.png) 将上述更改还原过后, 重启 Samba 服务器, 可以发现 Windows 可以保存更改, 设置读写生效, 如 Figure [readonlyreversed]. ![Figure [readonlyreversed]: Windows 可以保存, 读写生效](pic2/readonlyreversed.png) ## Windows 下创建文件名大小写问题 在 Windows 下于 Z: 盘创建一个全为大写的文件 `CAPITAL.txt` (Figure [capital]), 于 Linux 端执行 `ls /d1652270` 查看共享文件夹内容 (Figure [lsfile]). 可以发现, Linux 端该文件名大写, 且只能用全大写进行查询 (大小写敏感); ![Figure [capital]: 创建大写文件](pic2/capital.png) ![Figure [lsfile]: Linux 端对该文件查询](pic2/lsfile.png) 在 Linux 下于 `/d1652270` 创建一个大小写混杂的文件 `fileName.txt` (Figure [fileName]), 于 Windows 端的 cmd 命令行下查看 (Figure [dirfile]). 可以发现, Windows 端该文件名显示时大小写与创建时一致, 但查询时是大小写不敏感的; ![Figure [fileName]: 创建 `fileName.txt`](pic2/fileName.png) ![Figure [dirfile]: Windows 端对该文件查询](pic2/dirfile.png width=60%) 可以得出结论, 大小写是否敏感仅取决于访问该文件的操作系统. 现探讨重名问题: 在大小写敏感的 Linux 下创建两个仅大小写情况不同的文件, 在 Windows 下访问到的文件是否会判为重名, 若是, 访问的是哪一个文件. 过程详见 Figure [namecase] - Figure [catcase]. ![Figure [namecase]: Linux 创建仅大小写不同的文件](pic2/namecase.png) ![Figure [dirfile2]: Windows 资源管理器下查看](pic2/dirfile2.png) ![Figure [createcase]: Windows 资源管理器下试图创建重名](pic2/createcase.png) ![Figure [dirfile3]: CMD 下查看并 `type`](pic2/dirfile3.png width=60%) ![Figure [catcase]: Linux 下 `cat`](pic2/catcase.png) 出现了较大的不一致. 可以得出结论, Windows 容许由于其他原因造成的文件名相同、大小写不同且可以正常列出, 但不允许在 Windows 下新建文件达到这种情况; `type` 命令会尝试大小写不敏感地打印所有符合条件的文件名, 但可能由于 Windows 或 Samba 的 bug, 只展示了同一个文件的内容. ## 克隆的另一同局域网虚拟机访问共享文件夹 **注: 本节中的 `vm-linux` 为主机名的主机, 均指克隆的虚拟机, 即后文中的 `vm-linux-2`.** 1. 将"作业1. CentOS 7.5 安装配置"完成后的虚拟机进行克隆并启动, 用 `vim /etc/sysconfig/network-scripts/ifconf-ens32` 配置其 IP 为 `192.168.80.231`, 如 Figure [clonedvm]、Figure [ipconfigure]、Figure [restartnet]、Figure [reconnect]. ![Figure [clonedvm]: 克隆的虚拟机](pic2/clonedvm.png) ![Figure [ipconfigure]: 配置 IP](pic2/ipconfigure.png) ![Figure [restartnet]: 重启网络服务](pic2/restartnet.png width=120%) ![Figure [reconnect]: 换地址 SSH 登录成功](pic2/reconnect.png) 2. 执行以下操作: - 使用 `yum install` 安装 `samba-client cifs-utils` 软件包 - 使用 `mkdir -p /mnt/d1652270` 建立要挂载共享文件夹的目标位置 - 使用 `mount -t cifs -o user=1652270,password=******** //192.168.80.230/d1652270 /mnt/d1652270` 命令, 将 `192.168.80.230` 上的 `d1652270` 文件夹挂载到上述位置. - 使用 `ls` 查看文件夹下的文件名. 如 Figure [mountcifs] 所示. 发现中文名无法正常显示, 需要用指定的字符集重新挂载. ![Figure [mountcifs]: 挂载 CIFS 位置](pic2/mountcifs.png) 3. 使用指定的字符集重新挂载: ~~~~~~~~~~ umount /mnt/d1652270 mount -t cifs -o user=1652270,password=******,iocharset=gb2312 //192.168.80.230/d1652270 /mnt/d1652270/ ~~~~~~~~~~ 发现中文名显示成功, 可正常访问和修改文件夹. 如 Figure [remount]. ![Figure [remount]: 重新挂载](pic2/remount.png) ## 使另一台虚拟机不能访问共享文件夹而 Windows 仍可访问 1. 首先确认另一台虚拟机 `vm-linux-2` 和 Windows 能正常访问共享文件夹, 如 Figure [block1] ![](pic2/block1-.png width=80%) ![Figure [block1]: 正常访问](pic2/block1.png) 2. 在 Samba 服务器所在主机 `vm-linux` 下, 配置 `/etc/samba/smb.conf` 文件. 在 `[d1652270]` 段下增加 `allow hosts`或 `hosts allow` 属性, 设置可以访问的 IP 段为 `192.168.80.0/24 EXCEPT 192.168.80.231`, 如 Figure [allowhosts]. ![Figure [allowhosts]: 配置 allow hosts](pic2/allowhosts.png) 3. 重新启动 Samba 服务器: `systemctl restart smb`. 4. 检查结果: Windows 仍能正常访问 Samba 服务器中的内容, 但另一台 Linux 虚拟机不能正常访问而是出现 "权限不足" 的提示, 如 Figure [block2]. ![](pic2/block2-.png width=80%) ![Figure [block2]: 检查设置 IP 权限结果](pic2/block2.png) ## 字符集要求 已经在 [a. 将子目录共享并映射到 Windows 下的盘符](#toc1.1) 中完成. Windows 共享目录给 Linux 虚拟机(VMWare vmhgfs-fuse 方式) ===============

建立子目录并在 VMWare Workstation 中设立共享文件夹

1. 在 Windows 的 `D:` 盘下创建目录 `w1652270`, 如 Figure [w1652270]. 在其下建立一个中文文件名和一个英文文件名文件, 建立好后查看如 Figure [w1652270-files]. ![Figure [w1652270]: 建立目录](pic2/w1652270.png) ![Figure [w1652270-files]: 建立文件](pic2/w1652270-files.png) 2. 将虚拟机关机, 在 "编辑虚拟机设置" 中的 "高级选项卡", 设置 "共享文件夹". 新增 `D:\w1652270` 为共享文件夹, 不要勾选 "只读" 选项. 设置好的界面如 Figure [sharefolder] 所示. 保存并关闭界面. ![Figure [sharefolder]: 设置共享文件夹](pic2/sharefolder.png) ## Linux 下映射目录 1. 开启虚拟机, 登录到 SSH shell. 用 `mkdir -p /mnt/w1652270` 建立要挂载到的文件夹 (Figure [linuxmkdirw]) ![Figure [linuxmkdirw]: 建立挂载文件夹](pic2/linuxmkdirw.png) 2. 安装 `policycoreutils-python` 包: `yum install -y policycoreutils-python` 3. CentOS 中的 vmware-tools 可能并未配置完善, 需要重新配置. 在 VMWare Workstation 中选择 "虚拟机 -> 重新安装 VMWare Tools...", 并在弹出对话框中选 "是". ![Figure [vmwaretools]: 安装 VMWare Tools](pic2/vmwaretools.png) ![Figure [vmwaretools-yes]: 安装 VMWare Tools: 选择是](pic2/vmwaretools-yes.png) 4. 此时光驱内的镜像被替换. 在第一次作业中, 光驱被挂载到 `/media/CentOS_ISO` 文件夹, 现在查看该文件夹的内容以确认装载了 VMWare Tools 的光盘 (Figure [vmwaretools-ls]) ![Figure [vmwaretools-ls]: 安装 VMWare Tools: 已经挂载](pic2/vmwaretools-ls.png) 5. 拷贝安装文件到临时文件夹, 解压之, 安装: ~~~~~~~~~~~~ bash mkdir -p /tmp/vmtools cp /media/CentOS_ISO/VMwareTools-10.2.5-8068393.tar.gz /tmp/vmtools/ cd /tmp/vmtools/ tar xzf ./VMwareTools-10.2.5-8068393.tar.gz cd vmware-tools-distrib/ ./vmware-install.pl ~~~~~~~~~~~~ 之后按照提示操作. 6. 安装后便可以挂载共享文件夹. 共享文件夹已经默认挂载到 `/mnt/hgfs` 下, 但可以执行以下命令以正确的编码挂载到我们需要的位置: `vmhgfs-fuse -omodules=iconv,to_code=CP936 .host:/w1652270 /mnt/w1652270/`. 挂载后进入挂载目录查看, 已有两个已创建的文件, 证明挂载成功, 中文正常显示, 且读写正常, 如 Figure [mounthgfs] ![Figure [mounthgfs]: 挂载宿主机文件](pic2/mounthgfs.png) ## 设置 Linux 的访问权限(只读, 读写) 如前文所提, 在设置 "VMWare 共享文件夹" 时, 勾选 "只读" 选项, 即可将文件夹设置为 "只读"; 否则为 "读写". 以下是 "只读" 的设置过程和结果展示. ![Figure [sharefoler-readonly]: 设置"只读"](pic2/sharefolder-readonly.png) ![Figure [sharefoler-readonly2]: 设置"只读"后, 写权限受限](pic2/sharefolder-readonly2.png) ## Linux 下创建文件名大小写问题 在 Windows 下, 对于文件名大小写的敏感情况是可预料的 (大小写不敏感). 现在在 Linux 下创建仅大小写不同的两个文件, 并观察建立后的现象如下图. ![Figure [casename-1]: Linux 下创建](pic2/casename-1.png) ![Figure [casename-2]: Windows 下查看](pic2/casename-2.png) 可以发现, Linux 可以在这个目录下大小写不敏感地操作文件. 而这也意味着后创建的仅大小写不同的文件覆盖了前者; 而 Windows 下可以预料, 也是大小写不敏感的. ## 取消映射 只需退出 `w1652270` 目录, 执行 `umount /mnt/w1652270` 即可, 如 Figure [umount]. ![Figure [umount]: Windows 下查看](pic2/umount.png) ## 重启自动映射 在 `/etc/fstab` 下增加表项: `.host:/w1652270 /mnt/w1652270 fuse.vmhgfs-fuse auto_unmount,defaults,modules=iconv,to_code=CP936 0 0`, 如 Figure [fstab]. ![Figure [fstab]: /etc/fstab 下增加表项](pic2/fstab.png) 保存退出并重启. 重启后查看 `/mnt/w1652270`, 一切正常. ![Figure [mountafterreboot]: `/mnt/w1652270` 被自动挂载](pic2/mountafterreboot.png) ## 映射(挂载)前文件夹下已有文件如何处理 这些文件不会丢失. 由于 Linux 的 VFS 机制, 挂载时对于文件目录结构的改变只保存在内存中, 而不会应用到实际硬盘上. 取消挂载后, 这些文件会重现在原有目录. ![Figure [back]: `file` 文件回来了](pic2/back.png) ## 字符集要求 已经在 [a. Linux 下映射目录](#toc2.1) 中完成. Windows 共享目录给 Linux 虚拟机(使用局域网文件共享实现) =================

设置子目录共享

1. 右键 `w1652270` 文件夹, 单击 "属性 -> 共享 -> 高级共享", 如 Figure [winshare] 配置, 将本机当前用户(在本例中为 Shun Feng, 下方需要将 `******` 更改为对应密码)赋予所有权限. ![Figure [winshare]: 设置子目录共享](pic2/winshare.png) ## Linux 下映射目录 1. 开启虚拟机, 登录到 SSH shell. 用 `mkdir -p /mnt/w1652270` 建立要挂载到的文件夹. 2. 挂载共享文件夹: `mount -t cifs -o user="Shun Feng",password=******,vers=2.1,iocharset=gb2312 //192.168.80.1/w1652270 /mnt/w1652270/` (注意指定高版本的 Samba 协议). 挂载后进入挂载目录查看, 发现挂载成功, 中文正常显示, 且读写正常, 如 Figure [mountcifs2] ![Figure [mountcifs2]: 挂载宿主机文件](pic2/mountcifs2.png) ## 设置 Linux 的访问权限(只读, 读写) 如前文所提, 在设置 "高级共享 -> 权限" 时, 对本机用户去掉 "更改" 复选框, 即可将文件夹设置为 "只读"; 否则为 "读写". 以下是 "只读" 的设置过程和结果展示. ![Figure [sharefoler-readonly3]: 设置"只读"](pic2/sharefolder-readonly3.png) ![Figure [sharefoler-readonly4]: 设置"只读"后, 写权限受限](pic2/sharefolder-readonly4.png) ## Linux 下创建文件名大小写问题 同 [2.c Linux 下创建文件名大小写问题](#toc2.3). ## 取消映射 同 [2.d 取消映射](#toc2.4). ## 重启自动映射 在 `/etc/fstab` 下增加表项: `//192.168.80.1/w1652270 /mnt/w1652270/ cifs user=Shun\040Feng,password=******,vers=2.1,iocharset=gb2312 0 0` (注意用 `\040`代替空格). 可以使用 `mount -fav` 不做更改地检查 `/etc/fstab` 文件内容. 保存退出并重启. 重启后查看 `/mnt/w1652270`, 一切正常. ## 映射(挂载)前文件夹下已有文件如何处理 同 [2.f 映射(挂载)前文件夹下已有文件如何处理](#toc2.6). ## 字符集要求 已经在 [a. Linux 下映射目录](#toc3.1) 中完成. Linux 下新增磁盘 ============= ## 虚拟机新增磁盘 关闭虚拟机, 在 "编辑虚拟机设置" 中点击 "添加" 添加设备, 选择设备为一个 SCSI 4GB 虚拟硬盘. 添加完成后, 保存并退出设置. ![Figure [adddisk]: 虚拟机添加磁盘](pic2/adddisk.png) ![Figure [adddisk]: 虚拟机添加磁盘 2](pic2/adddisk1.png) ## 在 Linux 内分区、挂载 1. 开启虚拟机. 2. 用 `blkid` 与 `mount` 或者 `fdisk -l` 等与磁盘有关的命令, 辨别出各磁盘的设备文件. 在本例子中, `/dev/sda` 是 256 GB 的主磁盘, `/dev/sdb` 是 4GB 的新增磁盘. ![Figure [blkid]: 使用 `blkid`](pic2/blkid.png) ![Figure [fdisk]: 使用 `fdisk`](pic2/fdisk.png) 3. 对 `/dev/sdb` 进行分区: `fdisk /dev/sdb` - 输入 p, 查询分区表, 发现没有任何一个分区; - 输入 n, 再输入 p 和 1, 在第一个位置创建一个主分区. 选择系统默认的起始扇区, 输入 `+2G` 表示终止扇区偏移 2 GiB. 输入 p, 查询分区表, 发现创建好了第一个分区. - 输入 n, 再输入 p 和 2, 在第二个分区位创建一个主分区. 选择系统默认的起始扇区和终止扇区(占满硬盘). 输入 p, 查询分区表, 发现创建好了第二个分区. - 输入 w, 保存分区表并退出. - 再次输入 `fdisk -l` 查看所有分区, 发现出现了两个新的分区设备 `/dev/sdb1` 和 `/dev/sdb2`. ![Figure [fdisk1]: 使用 `fdisk` 创建分区 1](pic2/fdisk1.png) ![Figure [fdisk2]: 使用 `fdisk` 创建分区 2](pic2/fdisk2.png) ![Figure [fdisk3]: 使用 `fdisk` 创建分区 3](pic2/fdisk3.png) ![Figure [fdisk4]: 使用 `fdisk` 创建分区 4](pic2/fdisk4.png) ![Figure [afterfdisk]: 使用 `fdisk -l` 查询刚创建的分区](pic2/afterfdisk.png) 4. 格式化两个新分区, 并装载到指定目录 如 Figure [mkfs1]、Figure [mkfs2] 所示, 使用 `mkfs.ext4 /dev/sdb?` 命令格式化两个新分区为 EXT4 文件系统. 再如 Figure [mkdirandmount] 所示, 用 `mkdir` 创建装载目录, 再用 `mount` 命令挂载它们, 并用 `df -h` 检查挂载的文件系统, 发现装载正常. ![Figure [mkfs1]: 格式化 `sdb1`](pic2/mkfs1.png) ![Figure [mkfs2]: 格式化 `sdb2`](pic2/mkfs2.png) ![Figure [mkdirandmount]: 创建装载目录并装载两个分区设备](pic2/mkdirandmount.png) Linux 下新增网卡 ============= ## 虚拟机新增网卡 关闭虚拟机, 在 "编辑虚拟机设置" 中点击 "添加" 添加设备, 选择设备为一个网络适配器. 添加完成后, 设置该网络适配器的连接模式为"桥接", 保存并退出设置. ![Figure [addnet]: 虚拟机添加网卡](pic2/addnet.png) ![Figure [addnet2]: 虚拟机添加网卡 2](pic2/addnet2.png) ## 设置 Linux 新网卡网段 1. 开启虚拟机. 2. 输入命令 `ifconfig`, 如 Figure [ifconfig] 所示, 增加了叫做 `ens34` 的网卡. 但它并没有一个 IPv4 地址. ![Figure [ifconfig]: 增加了网卡 ens34](pic2/ifconfig.png) 3. 从已有网卡的 `ifcfg-ens32` 创建这张网卡的配置文件, 使用 `vim` 编辑修改. 特别要将 IP 地址修改为 `192.168.1.0/24` 网段内的地址, 如 Figure [vimnet] 和 Figure [vimnet2]. ![Figure [vimnet]: 修改网卡 ens34 启动配置](pic2/vimnet.png) ![Figure [vimnet2]: 修改网卡 ens34 启动配置](pic2/vimnet2.png) 4. 有可能需要在 VMWare Workstation 的 "编辑 -> 虚拟网络编辑器" 中, 以管理员权限更改设置, 设置 "桥接" 到宿主机连接到寝室路由器的网卡, 以确保 "桥接" 网络出现并有效. 5. 执行 `service network restart` 重启网络服务. 在此之后, 执行 `ping 192.168.1.1` 和 `ping 192.168.80.1` 均正常收到回应. 若之前配置了网关和 DNS, 此时应能访问外网, 如 Figure [connected] 所示. ![Figure [connected]: 重启网络服务, 正常连接(由于编码原因, 返回正文中文乱码)](pic2/connected.png) Linux 下新增用户 ================== ## 创建用户组 stu 和两个普通用户 如下, 建立用户组和两个用户 `u1652270` 与`u1652269`, 并将它们加到新组中, 自动创建用户文件夹: ~~~~~~~~~~ groupadd stu useradd -mG stu u1652270 useradd -mG stu u1652269 groupmems -g stu -l ~~~~~~~~~~ 如果有需要的话, 使用 `usermod -g 1002 u1652270` 将主组修改为 `stu`, 其中 `1002` 是查询 `/etc/group` 得到的 `stu` 的 GID. ![Figure [groupadd]: 创建用户组 stu 和两个普通用户](pic2/groupadd.png) ## 使 `/home/u165****` 作为两个普通用户的根目录 在创建用户时增加的 `-m` 选项已经为用户创建了家目录 `/home/u165****`. 如果想要修改用户的家目录, 可用 `usermod -d /home/u1652270 u1652270`. 至于修改用户的根目录, 可以通过以下方法来做到: - 用 `usermod -s /path/to/myshell` 将用户登录 Shell 定义为一个运行 `chroot --userspec=... /home/u1652270 /bin/sh` 的脚本. 其中, `/home/u1652270` 下应有 `/bin/bash` 和装有它所依赖运行库的 `lib64` 目录; 要执行大部分命令, 还需要一个静态链接的 `busybox`. 这会导致每次该用户登录需要 root 密码或足以执行 `chroot` 所需的权限. - 在 `/etc/ssh/sshd_config` 中添加一个对于 `u1652270` 的匹配, 并在其下增加选项 `ChrootDirectory /home/u1652270`. 这只会对 SSH 远程登录生效. ## root 用户为普通用户设置密码 ~~~~~~~~~~ passwd u1652270 passwd u1652269 ~~~~~~~~~~ ![Figure [setpasswd]: 为普通用户设置密码](pic2/setpasswd.png) ## root 用户禁用/启用普通用户 ~~~~~~~~~~ passwd -l u1652270 # 禁用用户 passwd -u u1652270 # 启用用户 ~~~~~~~~~~ ![Figure [locked]: 禁用后, 普通用户无法登录, root 用户正常](pic2/locked.png) ![Figure [unlocked]: 启用后, 普通用户正常登录](pic2/unlocked.png) 若需要使 root 用户使用 `su` 也无法登录, 可以使用: ~~~~~~~~~~ usermod -s /sbin/nologin u1652270 # 禁用用户 usermod -s /bin/bash u1652270 # 启用用户 ~~~~~~~~~~ ![Figure [nologin]: 使用指定 shell 的方法来禁用/启用用户](pic2/nologin.png) ## root 删除普通用户 ~~~~~~~~~ userdel u1652270 ~~~~~~~~~ ![Figure [userdel]: 删除用户](pic2/userdel.png) ## 创建和 root 有同样权限的用户 使用 `useradd -u 0 --non-unique newroot` 来创建一个 UID 为 0, 用户名不唯一的用户 newroot. 这个用户可以和 root 有不同的用户名和密码, 但由于 UID 为 0, 与 root 具有完全相同的权限. 如 Figure [newroot]. ![Figure [newroot]: 新增 root 用户](pic2/newroot.png) ![Figure [newroot2]: 新增 root 用户 - tty 下登录](pic2/newroot2.png) Linux 设置密码复杂性 ================== 首先用 `vim /etc/security/pwquality.conf` 打开密码质量模块的配置文件. 以下提到的配置项均需要去掉行首 `#` 号解除注释后再配置. ## 设置密码的最短长度 编辑 `minlen` 属性为想要的长度, 如 Figure [pwquality] 中设置最短长度为 10. ## 设置密码必须包含的字符 对于 "数字、大写字母、小写字母、其他字符" 设置必须包含的最少字符数, 只需分别将 `dcredit ucredit lcredit ocredit` 的值赋为所需字符数的相反数即可, 如 Figure [pwquality] 中限制必须有 3 个数字、3 个大写字母、2 个小写字母、1 个其他字母. ## 设置新旧密码至少有多少个字符不相同 如 Figure [pwquality], 在 `difok` 中赋值为所需值即可. ![Figure [pwquality]: 密码质量配置](pic2/pwquality.png) 设置完 `pwquality.conf` 后, 保存退出即刻生效. (使用刚创建的 u1652269 进行演示) ![Figure [pwqualityapply]: 密码质量配置生效](pic2/pwqualityapply.png) ## 设定修改新密码时不能与之前 n 次相同 编辑 `/etc/pam.d/system-auth`, 增加一行 `password requisite pam_pwhistory.so use_authtok remember=n retry=3`, 其中 n 为想要设置的值, 如 Figure [pwhistory]. 保存退出后, 即时生效, 如 Figure [pwhistoryapply]. ![Figure [pwhistory]: 密码历史配置](pic2/pwhistory.png) ![Figure [pwhistoryapply]: 密码历史配置生效](pic2/pwhistoryapply.png) ## 用户首次登录时强制改密 使用 `chage -d 0 u1652270` 可以将用户的密码有效期置为 0, 用户下次登录必须改变密码, 如 Figure [chage] 和 Figure [chageapply]. 在创建用户之后立刻执行此指令, 即可强制首次登录修改密码. ![Figure [chage]: 密码有效期归零配置](pic2/chage.png) ![Figure [chageapply]: 更改密码提示](pic2/chageapply.png) ## 设置每隔一段时间强制修改密码 仍旧使用 `chage` 命令: ~~~~~~~~ chage -M 90 u1652270 chage -l ~~~~~~~~ 前一句命令将最大密码修改间隔修改到 90 天. 后一句命令可以查看密码过期时间, 如 Figure [chagem]. 这个时间取决于系统时钟. 将时间修改为三个月后, 如图 Figure [chagemapply], 退出 u1652270 用户重新登录, 会发现系统提示强制修改密码, 如 Figure [chagemapply2]. ![Figure [chagem]: 修改密码最大间隔配置](pic2/chagem.png) ![Figure [chagemapply]: 修改系统时间](pic2/chagemapply.png) ![Figure [chagemapply2]: 更改密码提示](pic2/chagemapply2.png) 普通用户磁盘配额限制 =================== 使用 `quota` 实现磁盘配额限制. 在使用 `quota` 前, 首先要将目的文件系统使用 `usrquota,grpquota` 选项重新挂载. 要使得选项重启自动生效, 编辑 `/etc/fstab` 文件, 添加 `/home` 的挂载选项, 如 Figure [addquota]. ![Figure [addquota]: 编辑 `/etc/fsab` 添加 `/home` 的挂载选项](pic2/addquota.png) 使用 `mount -fav` 确认编辑后的配置文件无误如 Figure [fav], 之后重新挂载, 启用 `quota`, 如 Figure [enablequota]: ~~~~~~~~~~~~~~~~ umount /home mount /home mount | grep home # 查看选项中是否有两个 quota 选项 quotacheck -cugv /home # XFS 文件系统不需如此 quotaon /home # XFS 文件系统不需如此 ~~~~~~~~~~~~~~~~ ![Figure [fav]: `mount -fav`](pic2/fav.png) ![Figure [enablequota]: 启用 `quota`](pic2/enablequota.png) ## 设置单用户磁盘限额 使用 `edquota 用户名` 如 `edquota u1652270` 编辑这个用户的磁盘限额, 如 Figure [edquota]. ![Figure [edquota]: 配置 `quota`](pic2/edquota.png) 软设置和硬设置都会限制磁盘容量的使用, 不同的是, 软设置容许用户超过限制一段时间, 而硬设置不会容许. 软设置宽限时间过去后, 会变成硬设置. 一般应使硬设置略微超过软设置. 可以使用 `edquota -t` 设置宽限时间, 如 Figure [edquotat]. ![Figure [edquotat]: 配置 `quota` Grace time](pic2/edquotat.png) ![Figure [quotaapply]: 配置限额后, 生成大文件失败](pic2/quotaapply.png) ## 设置用户组磁盘限额 使用 `edquota -g 组名` 如 `edquota -g stu` 设置用户组的磁盘限额. 如 Figure [edquotag]. ![Figure [edquotag]: 配置组 `quota`](pic2/edquotag.png) !!! 注: 要使得 `u1652270` 的磁盘使用计入 `stu` 组中, 必须使用 `usermod -g 1002 u1652270` 将主组修改为 `stu`. 其中 `1002` 是查询 `/etc/group` 得到的 `stu` 的 GID. ## 查看某用户当前磁盘配额 使用 `quota -u 用户名` 查看该用户的配额. 若要查看用户组的配额, 在 XFS 文件系统上使用 `quota -g 组名` 有时会给出错误的结果. 应使用 `xfs_quota -x -c "report -h" /home`. ![Figure [quotau]: 查看用户配额](pic2/quotau.png) ![Figure [xfs]: 查看组配额](pic2/xfs.png) 编写批量创建用户的 Shell 程序 =========================== 1. 创建配置文件 `student.conf` 和 `initpwd.dat` 如图 Figure [studentconf]. ![Figure [studentconf]: 建立两个配置文件](pic2/studentconf.png) 2. 创建 `user_add.sh`. 脚本内容如 Listing [useradd]. ~~~~~~~~~~~~~~ bash #!/bin/bash # Batch create users defined in $1 with initial password written in $2 usage() { echo "$0 - Script to batch create users" echo "Usage: $0 student.conf initpwd.dat" return } if [ -z $1 ] || [ ! -z $3 ] || [ $# -ne 2 ] ; then echo "Error: must have 2 arguments, you have $#" usage exit 1 fi if [ ! -r $1 ]; then echo "Error: $1 not readable" usage exit 2 fi if [ ! -r $2 ]; then echo "Error: $2 not readable" usage exit 3 fi STU_INITPWD=$(head -1 $2 | sed -e "s/^[[:space:]]*//" -e "s/[[:space:]]*$//") echo "Read student initial password: $STU_INITPWD" while read f do if [ "${f:0:1}" = "#" ]; then # comment line continue fi STU_ID=$(cut -d" " -f1 -s <<< "$f") STU_NAME=$(cut -d" " -f2 -s <<< "$f") if [ -z "$STU_ID" ] || [ -z "$STU_NAME" ]; then continue fi useradd -mG stu u$STU_ID > /dev/null || { STU_ERR=$?;echo "执行 useradd -mG stu u$STU_ID 时错误 $STU_ERR";exit ${STU_ERR} ; } passwd --stdin u$STU_ID <<< "$STU_INITPWD" > /dev/null || { STU_ERR=$? ; echo "执行 passwd --stdin u$STU_ID <<< \"$STU_INITPWD\" 时错误 $STU_ERR" ; exit $STU_ERR; } chage -d 0 u$STU_ID > /dev/null || { STU_ERR=$? ; echo "执行 chage -d 0 u$STU_ID 时错误 $STU_ERR" ; exit $STU_ERR; } echo "用户 u$STU_ID[$STU_NAME]已建立" done < $1 ~~~~~~~~~~~~~~ [Listing [useradd]: user_add.sh] 3. 保存并赋予 `user_add.sh` 以执行权限: `chmod +x user_add.sh`. 之后尝试执行它: ~~~~~~~~~~~~~ ./user_add.sh student.conf initpwd.dat ./user_add.sh 1 ./user_add.sh ./user_add.sh student.conf initpwd.dat nonsense.dat ./user_add.sh notexist.file notexistalso.file ~~~~~~~~~~~~~ 如 Figure [execute] 所示. 可以发现, 脚本可以正常运行, 并很好处理各种错误情况. ![Figure [execute]: 执行 `user_add.sh`](pic2/execute.png) 脚本运行过后, 尝试列举 `stu` 组下的用户并登录刚刚创建的用户: ![Figure [scriptapply0]: 列出 `stu` 组的用户](pic2/scriptapply0.png) ![Figure [scriptapply]: 登录 1652270](pic2/scriptapply.png) ![Figure [scriptapply2]: 登录 1652268](pic2/scriptapply2.png) ![Figure [scriptapply3]: 登录 1652267](pic2/scriptapply3.png) 发现用户已经成功创建, 并被强制要求修改密码.