Build Server配置经验

前言

最近帮team设了配置了build server,大概思路是给硬盘分很多区,每个user拥有自己独立的存储空间。实际操作过程中因为配置了多个SSD硬盘,每个硬盘是480G,所以就成了每个user的home目录下挂载一个SSD。这样每个用户在自己的存储空间里下载代码,build image,互不干扰。

配置过程中涉及到的知识有硬盘分区挂载,用户管理与权限配置,网络配置等知识,稍微总结一下:

硬盘分区与挂载

下述方案采取的是硬分区;后来才知道也可以采用quota进行软分区,感觉更加灵活一些:详情可参考https://www.zhihu.com/tardis/bd/art/541368726?source_id=1001,另外可搭配LVM把多个物理磁盘合成一个逻辑卷: https://www.jianshu.com/p/93c06f65a59f

硬盘分区

查看硬盘情况:

$ fdisk -l

对于Linux系统,应当使用ext4,查看硬盘格式:

# df -Th | grep "^/dev"
/dev/mapper/ubuntu--vg-ubuntu--lv ext4      109G   13G   92G  12% /
/dev/sde                          ext4      440G  311G  107G  75% /home/gfx-user2/SSD-e
/dev/sdg                          ext4      440G   73M  417G   1% /home/gfx-user4/SSD-g
/dev/sdf                          ext4      440G  127G  291G  31% /home/gfx-user3/SSD-f

 

对于硬盘,分两种情况:

  • 直接使用该硬盘,不分区
  • 该硬盘比较大,我们想给它分区再使用

 

对于直接使用的硬盘,将其格式化为ext4格式之后,就可以挂载使用了。

对于需要分区的硬盘,需要使用以下命令进行分区,并且分区之后的每个区都需要进行ext4的格式化,否则会发生挂载错误:

# 查看硬盘分区,其中/dev/sda表示第一块硬盘,/dev/sda1表示第一个分区,以此类推
$ sudo fdisk -l

# 查看磁盘数量和磁盘分区,这个更直观
$ sudo lsblk

#进行硬盘分区,以/dev/sdc为例
#首先格式化
$ sudo mkfs -t ext4 /dev/sdc

#使用fdisk命令进行分区,首先进入硬盘
$ sudo fdisk /dev/sdc

#help可以看到命令的详解,这里n是添加分区的选项
Command (m for help): n   
Partition type
   p   primary (0 primary, 1 extended, 3 free)
   l   logical (numbered from 5)

#这里是选择分区类型。分区类型有三种:主分区,扩展分区和逻辑分区。
#定义在网上可以查到,这里简介说一下怎么选择
#主分区不可以再切分,扩展分区是用来划分逻辑分区的,不能直接用。逻辑分区只能从扩展分区里进行再划分得到。主分区和扩展分区加起来,数量最多为4
# 因此如果你要划分的分区小于等于4,可以直接划4个主分区就可以。
# 如果要划分的分区大于4,那么需要最起码划1给扩展分区,用这个扩展分区划分更多的逻辑分区,从而获得更多的分区数量。

#这里我恰好需要划分4个分区,因此我全部选择主分区p.此处系统自动设置分区编号
Select (default p): p

Adding logical partition 1

#设置分区开始位置,默认即可,点击 enter
First sector (4096-4196351, default 4096):

# 设置分区的大小 “+500G”
Last sector, +sectors or +size{K,M,G,T,P} (4096-4196351, default 4196351): +500G

#保存分区
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.

#划分并保存完分区之后,可以查看目前的分区情况。如果没有生效,则重启系统试试。
$ sudo lsblk

 

值得注意的是,如果硬盘的容量大于2T,则无法使用MBR方式,只能用GPT的方式分区,即只能用parted命令分区,而fdisk最多只能分出2T的总空间,并有warnning: 

DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

 

原因是Parted分区使用全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构。传统的主启动记录 (MBR) 磁盘分区支持最大卷为 2.2 TB。Fdisk不支持GPT,所以大于2TB的硬盘需要使用parted分区。

parted 有两种运行模式:命令行模式和交互模式。与 fdisk 的交互模式交互模式不同,在 parted 的交互模式下执行命令,一旦按回车键确认,命令就马上执行,对磁盘的更改就立刻生效。我认为交互模式比较简单,下面以交互模式为例:

进入交互模式:

[root@localhost ~]# parted /dev/sdd
GNU Parted 2.1
使用 /dev/sdd
Welcome to GNU Parted! Type 'help' to viewa list of commands.
(parted)

查看分区信息:

(parted) print                                                           
错误: /dev/sdd: unrecognised disk label # 由于没有打上磁盘标签,所以表现信息无法列出
 
(parted) mklabel       #创建磁盘标签
新的磁盘标签类型? gpt    #输入磁盘标签类型
(parted) print    
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number Start  End  Size File system  Name  标志

创建分区:

(parted) mkpart                                                          
分区名称? []? 1                                                        
文件系统类型? [ext2]? ext4                                             
起始点? 1G                                                              
结束点? 20G
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number Start   End     Size   File system  Name  标志
 1     1000MB  20.0GB  19.0GB               1

 

如果不是ext4,使用如下命令格式化硬盘,否则挂载可能不成功(以/dev/sdb1为例):

# mkfs -t ext4 /dev/sdb1

 另外,使用命令格式化硬盘的时候可能会失败,“Warning, had trouble writing out superblocks.” 并且硬盘可能会变得在lsblk命令种不见。此时只需要重新启动系统,再次尝试mkfs格式化即可。

挂载

挂载硬盘时,我们可以先使用mount命令手动挂载,看能否成功。

$ sudo mount /dev/sdc1 /home/lyintel/mysdc1

这样做的好处是可以测试挂载能否成功。如果没有经过测试,直接写入/etc/fstab进行开机挂载的话,一旦挂载失败,则系统无法正常启动,一些服务比如sshd会无法启动,导致你无法远程登录设备。

如果mount挂载分区报错 “mount: wrong fs type, bad option, bad superblock on”。可能有两个原因:

  • 分区未进行进行格式化
  • 没有安装nfs-common
$sudo apt-get install nfs-common

 

mount只能临时挂载,系统重启后就失效,因此mount测试成功之后,我们就可以设置开机挂载硬盘:

vim /etc/fstab
/dev/sdd /home/gfx-user1/SSD-d ext4 defaults 0 0
/dev/sde /home/gfx-user2/SSD-e ext4 defaults 0 0
/dev/sdf /home/gfx-user3/SSD-f ext4 defaults 0 0
/dev/sdg /home/gfx-user4/SSD-g ext4 defaults 0 0

稍微需要注意的一点是不要用NTFS格式的硬盘,因为Linux对NTFS的支持并不好

硬盘mount之后,默认是属于root的,需要用chown命令修改成对应user的,不然没有读写等权限。

$ chown -R <uid>:<gid> <mount_path>

$ id <username>
#查看对应user的uid和gid

 

用户管理与权限配置

补充一下创建/删除新用户,设置用户密码,删除用户的命令

# useradd -m username
# -m选项,创建用户后也自动创建/home下面的用户目录,如果没有-m则不自动创建
# passwd username

# userdel -r username
# -r选项,自动删除/home下面的用户目录

 

搭建build环境的时候,有时执行一些命令的时候需要当前用户有sudo权限才行,比如sudo apt-get install等,没有权限的话会提示例如“is not in the sudoers file”。可以用如下命令添加(以添加sudo权限给gfx-user为例)。值得注意的是,build环境搭建好之后,要去掉用户的sudo权限,不然该用户可以用sudo su的方式获得root身份从而修改/删除别的用户的文件。保存时会提醒read only, 记得要用wq!保存(我记得!代表不保存的,比如q!,不知道为啥wq!可以强行保存)。

sudo su
# vim /etc/sudoers
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
gfx-user1       ALL=(ALL:ALL) ALL
gfx-user2       ALL=(ALL:ALL) ALL
gfx-user3       ALL=(ALL:ALL) ALL
gfx-user4       ALL=(ALL:ALL) ALL

 

顺便说一下sudo执行和直接root用户执行命令的区别

1. 用户环境

sudo可以用用户的环境。例如,假如我在用户pansz环境中为vim配好了一套很习惯的配置,直接用root的话,那么vim就使用root用户的环境了,我为pansz用户定制的屌炸天的插件都没有了,vim成了原始配置。

同理,当一个主机有多个管理员时,每个人可能都不喜欢别人给root环境中指定的配置,可能导致root用户的配置文件被改来改去。有了sudo之后,每个人在root权限下都可以使用自己用户的环境配置,就可以只用定义自己用户的环境不修改root用户的配置文件,从而互相不影响了。

2. sudo 不需要知道root密码
sudo 执行方式 不需要知道root的密码,这才是sudo存在的最大意义,换言之,你可以让某个用户某个时间段拥有某些命令(或全部命令)的root操作权限,但又不用给他root密码。
另外值得要注意的是,在默认情况下,sudo拥有的权力也是非常大的,比如sudo su来获取root用户身份,作为服务器管理员要特别注意这一点。
 
3. 避免误操作
还有一种说法是,一般来说,root被认为是一种极其危险的存在,root一条命令失误可能毁了整个系统。万一你输入rm -rf xxxxx 的时候不小心多按个 /呢。不要笑,这都是实际发生过的事。所以我们在以root身份干活的时候都需要w-check,也就是一个人输命令另外一个人盯着,按回车之前要俩个人都确认了才能按。因此sudo的还有一个作用就是,让你明确知道这条命令很可能有风险,掂量掂量再按。

4. 渡让少数权限

另一个重要作用就是渡让少量权限给非root用户,比如你需要在网页上控制一个服务重启,你难道要用root身份启动apache吗?这个时候就可以配置sudo让apache用户可以以root身份执行某条特定的指令。


另外使用新创建的用户时,发现tab的自动补全功能不见了。这是因为新创建的用户进入shell后默认用的是sh而不是shell。修改有两种办法:
方法1(已经添加的用户):
用ubuntu账户登陆机器,使用命令
sudo chsh -s /bin/bash newUserName
方法2(将要添加的用户):
sudo vim /etc/default/useradd
修改 $SHELL 为$SHELL = /bin/bash,重新登陆即可.

 

网络配置

最后是配置server的hostname:

# vim /etc/hostname

# vim /etc/hosts

 


参考链接:
  • https://www.zhihu.com/question/51746286/answer/127292065
  • https://www.zhihu.com/question/51746286/answer/127353757
  • https://www.cnblogs.com/liangdiaonumberone/p/14253579.html
  • https://www.cnblogs.com/azureology/p/13234962.html
  • https://blog.csdn.net/u013806541/article/details/69665469
  • https://www.cnblogs.com/fieldtianye/p/9295986.html
  • http://blog.sina.com.cn/s/blog_640531380102ytyg.html
  • https://blog.csdn.net/inkfish/article/details/5168676
  • https://blog.csdn.net/wohu1104/article/details/121021207
  • Ubuntu磁盘分区与挂载 https://blog.csdn.net/make_progress/article/details/118571375
  • 使用parted对大于2T的硬盘分区 https://blog.51cto.com/jackeyge/1878676
posted @ 2021-12-23 17:08  青山牧云人  阅读(686)  评论(0)    收藏  举报