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用户的配置文件,从而互相不影响了。
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
浙公网安备 33010602011771号