基于CentOS7系统部署cobbler批量安装系统

图为开源自动化运维体系链

1、cobbler实现自动装机
2、saltstack实现工程自动化配置
3、kubernetes实现容器自动化编排
4、zabbix实现自动化监控
5、elastic实现应用日志自动化收集
6、jenkins实现开发持续化交付

image

原理分析

cobbler简介

Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置。相当于Cobbler封装了DHCP、TFTP、XINTED等服务,结合了PXE、kickstart等安装方法,可以实现自动化安装操作系统,并且可以同时提供多种版本,以实现在线安装不同版本的系统。

cobbler相关服务

DHCP:DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546号端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做“双机热备”的。
TFTP:TFTP是一种比较特殊的文件传输协议。相对于FTP和目前经常使用的SFTP,TFTP是基于TCP/IP协议簇,用于进行简单文件传输,提供简单、低开销的传输服务。TFTP的端口设置为69。
相对于常见的FTP,TFTP有两个比较好的优势:

  1. TFTP基于UDP协议,如果环境中没有TCP协议,是比较合适的;
  2. TFTP执行和代码占用内存量比较小;
    默认情况下,Linux内部是安装了tftp服务器包的。但是默认是不启动的。
    PXE:预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。
    PXE当初是作为Intel的有线管理体系的一部分,Intel 和 Systemsoft于1999年9月20日公布其规格(版本2.1)[1]。通过使用像网际协议(IP)、用户数据报协议(UDP)、动态主机设定协定(DHCP)、小型文件传输协议(TFTP)等几种网络协议和全局唯一标识符(GUID)、通用网络驱动接口(UNDI)、通用唯一识别码(UUID)的概念并通过对客户机(通过PXE自检的电脑)固件扩展预设的API来实现目的。

交互过程

image

  1. 裸机配置了从网络启动后,开机后会广播包请求DHCP服务器(cobbler server)发送其分配好的一个IP
  2. DHCP服务器(cobbler server)收到请求后发送responese,包括其ip地址
  3. 裸机拿到ip后再向cobbler server发送请求OS引导文件的请求
  4. cobbler server告诉裸机OS引导文件的名字和TFTP server的ip和port
  5. 裸机通过上面告知的TFTP server地址和port通信,下载引导文件
  6. 裸机执行执行该引导文件,确定加载信息,选择要安装的os,期间会再向cobbler server请求kickstart文件和os image
  7. cobbler server发送请求的kickstart和os iamge
  8. 裸机加载kickstart文件
  9. 裸机接收os image,安装该os image

注释:

系统环境准备及其下载cobbler

一.系统环境

开启两个网卡。一个仅主机模式,一个桥接模式,主机模式对内提供cobbler服务。

image

image

[root@ken ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:13:a1:49 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.190/24 brd 192.168.4.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe13:a149/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:13:a1:53 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.128/24 brd 192.168.182.255 scope global noprefixroute dynamic eth1
valid_lft 1786sec preferred_lft 1786sec
inet6 fe80::7073:2021:e866:204f/64 scope link noprefixroute
valid_lft forever preferred_lft forever

系统版本:CentOS Linux release 7.5.1804 (Core)
内网IP:192.168.182.128/24   #用来对内通信,提供cobbler服务
外网IP:192.168.4.190/24     #连接外网

二. 关闭安全服务

[root@ken ~]# systemctl stop firewalld #关闭防火墙
[root@ken ~]# setenforce 0 #关闭selinux

三. 下载cobbler及其所需服务程序

2.,配置yum源
[epel]
name=epel
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
[centos]
name=centos base
enabled=1
gpgcheck=0
baseurl=http://mirrors.163.com/centos/7/os/x86_64/

3,下载相关的软件
[root@ken ~]# yum install httpd cobbler tftp-server xinetd syslinux dhcp pykickstart -y

4.启动tftp服务
[root@ken ~]# vim /etc/xinetd.d/tftp
disable = no
[root@ken ~]# systemctl restart xinetd

  1. 配置dhcp服务
    subnet 192.168.182.0 netmask 255.255.255.0 {
    range 192.168.182.10 192.168.182.20;
    default-lease-time 600;
    max-lease-time 7200;
    filename “pxelinux.0”;
    }
    [root@ken ~]# systemctl restart dhcpd

  2. 启动httpd
    [root@ken ~]# systemctl restart httpd

  3. 启动cobbler
    [root@ken ~]# systemctl restart cobblerd

8.cobbler检测
[root@ken ~]# cobbler check

  1. 修改提示信息

1 : The ‘server’ field in /etc/cobbler/settings must be set to something other than localhost, or kickstarting features will not work. This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it.
把server指定的本地IP改为提供cobbler服务的IP地址

2 : For PXE to be functional, the ‘next_server’ field in /etc/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network.
把next_server指定的本地IP改为提供cobbler服务的IP地址

4 : enable and start rsyncd.service with systemctl
[root@ken ~]# systemctl restart rsyncd
[root@ken ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.

6 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to ‘cobbler’ and should be changed, try: “openssl passwd -1 -salt ‘random-phrase-here’ ‘your-password-here'” to generate new one
[root@ken ~]# openssl passwd -1 -salt ‘123’ ‘123’
$1$123$nE5gIYTYiF1PIXVOFjQaW/

  1. 重启cobbler并在此检测
    [root@ken ~]# systemctl restart cobblerd
    [root@ken ~]# cobbler check
    The following are potential configuration items that you may want to fix:
    1 : Some network boot-loaders are missing from /var/lib/cobbler/loaders, you may run ‘cobbler get-loaders’ to download them, or, if you only want to handle x86/x86_64 netbooting, you may ensure that you have installed a recent version of the syslinux package installed and can ignore this message entirely. Files in this directory, should you want to support all architectures, should include pxelinux.0, menu.c32, elilo.efi, and yaboot. The ‘cobbler get-loaders’ command is the easiest way to resolve these requirements.
    2 : debmirror package is not installed, it will be required to manage debian deployments and repositories
    3 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them
    Restart cobblerd and then run ‘cobbler sync’ to apply changes.

11.同步
[root@ken ~]# cobbler sync
task started: 2019-05-24_104642_sync
task started (id=Sync, time=Fri May 24 10:46:42 2019)
running pre-sync triggers
cleaning trees
removing: /var/lib/tftpboot/grub/images
copying bootloaders
trying hardlink /usr/share/syslinux/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0
trying hardlink /usr/share/syslinux/menu.c32 -> /var/lib/tftpboot/menu.c32
trying hardlink /usr/share/syslinux/memdisk -> /var/lib/tftpboot/memdisk
copying distros to tftpboot
copying images
generating PXE configuration files
generating PXE menu structure
rendering TFTPD files
generating /etc/xinetd.d/tftp
cleaning link caches
running post-sync triggers
running python triggers from /var/lib/cobbler/triggers/sync/post/*
running python trigger cobbler.modules.sync_post_restart_services
running shell triggers from /var/lib/cobbler/triggers/sync/post/*
running python triggers from /var/lib/cobbler/triggers/change/*
running python trigger cobbler.modules.manage_genders
running python trigger cobbler.modules.scm_track
running shell triggers from /var/lib/cobbler/triggers/change/*
*** TASK COMPLETE ***

  1. 导入镜
    [root@ken ~]# cobbler import –path=/mnt –name=”centos7″
    task started: 2019-05-24_104753_import
    task started (id=Media import, time=Fri May 24 10:47:53 2019)
    Found a candidate signature: breed=redhat, version=rhel6
    Found a candidate signature: breed=redhat, version=rhel7
    Found a matching signature: breed=redhat, version=rhel7
    Adding distros from path /var/www/cobbler/ks_mirror/centos7:
    creating new distro: centos7-x86_64
    trying symlink: /var/www/cobbler/ks_mirror/centos7 -> /var/www/cobbler/links/centos7-x86_64
    creating new profile: centos7-x86_64
    associating repos
    checking for rsync repo(s)
    checking for rhn repo(s)
    checking for yum repo(s)
    starting descent into /var/www/cobbler/ks_mirror/centos7 for centos7-x86_64
    processing repo at : /var/www/cobbler/ks_mirror/centos7
    need to process repo/comps: /var/www/cobbler/ks_mirror/centos7
    looking for /var/www/cobbler/ks_mirror/centos7/repodata/comps.xml
    Keeping repodata as-is :/var/www/cobbler/ks_mirror/centos7/repodata
    *** TASK COMPLETE ***

13.查看生成的distro
[root@ken ~]# cobbler distro list
centos7-x86_64

14.查看生成的profile
[root@ken ~]# cobbler profile list
centos7-x86_64

15.准备kickstart文件
[root@ken ~]# cp anaconda-ks.cfg /var/lib/cobbler/kickstarts/ks.cfg

16.编辑kickstart文件
url –url=http://192.168.182.128/cobbler/ks_mirror/centos7/

17.制作自己的profile
[root@ken ~]# cobbler profile add –distro=centos7-x86_64 –kickstart= /var/lib/cobbler/kickstarts/ks.cfg –name=”cent7_ken”

  1. 删除默认的profile
    [root@ken ~]# cobbler profile remove –name=centos7-x86_64
    [root@ken ~]# cobbler profile list
    cent7_ken

19.开启客户端进行验证

注意:
1.客户端模式需要与服务器模式一致
2. 内存最少3个G
cobbler实现单台服务器提供安装不同操作系统

第一步:关机重新挂载新的光盘(vmeare)

第二步:开启所有相关的服务
[root@ken ~]# systemctl restart httpd cobblerd xinetd dhcpd

第三步:在linux系统中挂载光盘
[root@ken ~]# mount /dev/cdrom /mnt
mount: /dev/sr0 is write-protected, mounting read-only

第四步:导入一个新的镜像
[root@ken ~]# cobbler import –path=/mnt –name=”centos7.3″
task started: 2019-05-24_192206_import
task started (id=Media import, time=Fri May 24 19:22:06 2019)
Found a candidate signature: breed=redhat, version=rhel6
Found a candidate signature: breed=redhat, version=rhel7
Found a matching signature: breed=redhat, version=rhel7
Adding distros from path /var/www/cobbler/ks_mirror/centos7.3:
creating new distro: centos7.3-x86_64
trying symlink: /var/www/cobbler/ks_mirror/centos7.3 -> /var/www/cobbler/links/centos7.3-x86_64
creating new profile: centos7.3-x86_64
associating repos
checking for rsync repo(s)
checking for rhn repo(s)
checking for yum repo(s)
starting descent into /var/www/cobbler/ks_mirror/centos7.3 for centos7.3-x86_64
processing repo at : /var/www/cobbler/ks_mirror/centos7.3
need to process repo/comps: /var/www/cobbler/ks_mirror/centos7.3
looking for /var/www/cobbler/ks_mirror/centos7.3/repodata/comps.xml
Keeping repodata as-is :/var/www/cobbler/ks_mirror/centos7.3/repodata
*** TASK COMPLETE ***

第四步:查看生成的distro
[root@ken ~]# cobbler distro list
centos7-x86_64
centos7.3-x86_64

第五步:制作profile
[root@ken ~]# cobbler profile add –distro=centos7.3-x86_64 –kickstart=/var/lib/cobbler/kickstarts/ks.cfg –name=”centos7.3_ken”

第六步: 删除默认的profile
[root@ken ~]# cobbler profile list
cent7_ken
centos7.3-x86_64
centos7.3_ken
[root@ken ~]# cobbler profile remove –name=centos7.3-x86_64
[root@ken ~]# cobbler profile list
cent7_ken
centos7.3_ken

第七步:开启客户端进行验证

find详解

1.name: 指定文件名

例子1. 找到以ken结尾的文件
[root@ken ~]# find / -name “*ken”
/sys/firmware/dmi/entries/15-0/sys tem_event_log/change_token
/etc/yum.repos.d/ken
/var/spool/mail/ken
/home/ken

例子2:找到包含ken的文件
[root@ken ~]# find / -name “ken” | head -3
/sys/bus/hid/drivers/kensington
/sys/devices/pci0000:00/0000:00:00.0/broken_parity_status
/sys/devices/pci0000:00/0000:00:01.0/broken_parity_status

  1. perm:指定文件权限

例子1:找到所有644权限的文件
[root@ken ~]# find / -perm 644 | head -3
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
[root@ken ~]# ls -l /boot/grub2/device.map
-rw-r–r–. 1 root root 64 Feb 26 22:25 /boot/grub2/device.map

例子2:模糊匹配644权限
[root@ken ~]# find / -perm -644 | head -3
/boot/efi
/boot/efi/EFI
/boot/efi/EFI/centos
[root@ken ~]# ls -l /boot/efi
total 0
drwxr-xr-x. 3 root root 20 Feb 26 22:21 EFI

  1. user:指定属主

例子1:找到属主是ken的文件
[root@ken ~]# find /etc -user ken
[root@ken ~]# find / -user ken
find: ‘/proc/1672/task/1672/fd/6’: No such file or directory
find: ‘/proc/1672/task/1672/fdinfo/6’: No such file or directory
find: ‘/proc/1672/fd/5’: No such file or directory
find: ‘/proc/1672/fdinfo/5’: No such file or directory
/var/spool/mail/ken
[root@ken ~]# ls -l /var/spool/mail/ken
-rw-rw—- 1 ken mail 0 Mar 11 18:16 /var/spool/mail/ken

4.group:指定属组

例子1:
[root@ken ~]# ls -l /var/spool/mail/ken
-rw-rw—- 1 ken mail 0 Mar 11 18:16 /var/spool/mail/ken
[root@ken ~]# find / -group ken
find: ‘/proc/1709/task/1709/fd/6’: No such file or directory
find: ‘/proc/1709/task/1709/fdinfo/6’: No such file or directory
find: ‘/proc/1709/fd/5’: No such file or directory
find: ‘/proc/1709/fdinfo/5’: No such file or directory
/home/ken
/home/ken/.bash_logout
/home/ken/.bash_profile
/home/ken/.bashrc
/home/ken/.bash_history
[root@ken ~]# ls -l /home/ken -d
drwx—— 2 ken ken 83 Mar 11 18:16 /home/ken

  1. nouser:指定无属主

例子1:
[root@ken ~]# useradd kenken
[root@ken ~]# touch test
[root@ken ~]# chown kenken: test
[root@ken ~]# userdel kenken
[root@ken ~]# find / -nouser
find: ‘/proc/1811/task/1811/fd/6’: No such file or directory
find: ‘/proc/1811/task/1811/fdinfo/6’: No such file or directory
find: ‘/proc/1811/fd/5’: No such file or directory
find: ‘/proc/1811/fdinfo/5’: No such file or directory
/root/test
/var/spool/mail/kenken
/home/kenken
/home/kenken/.bash_logout
/home/kenken/.bash_profile

  1. nogroup:指定无属主
    [root@ken ~]# find / -nogroup
    find: ‘/proc/1848/task/1848/fd/6’: No such file or directory
    find: ‘/proc/1848/task/1848/fdinfo/6’: No such file or directory
    find: ‘/proc/1848/fd/5’: No such file or directory
    find: ‘/proc/1848/fdinfo/5’: No such file or directory
    /root/test
    /home/kenken
    /home/kenken/.bash_logout
    /home/kenken/.bash_profile
    /home/kenken/.bashrc

7.type:指定文件类型

例子1:找到所有的链接文件
[root@ken ~]# find / -type l | head -3
/dev/cdrom
/dev/snd/by-path/pci-0000:02:02.0
/dev/initctl
[root@ken ~]# ls -l /dev/cdrom
lrwxrwxrwx 1 root root 3 May 24 19:19 /dev/cdrom -> sr0
[root@ken ~]#

例子2: 找到所有普通文件
[root@ken ~]# find / -type f | head -3
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
[root@ken ~]# ls -l /boot/grub2/device.map
-rw-r–r–. 1 root root 64 Feb 26 22:25 /boot/grub2/device.map
[root@ken ~]#

  1. size:指定文件大小

例子1:找到大于100M的文件
[root@ken ~]# find / -size +100M
/proc/kcore
find: ‘/proc/2018/task/2018/fd/6’: No such file or directory
find: ‘/proc/2018/task/2018/fdinfo/6’: No such file or directory
find: ‘/proc/2018/fd/5’: No such file or directory
find: ‘/proc/2018/fdinfo/5’: No such file or directory
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/root/gitlab-ce-8.9.5-ce.0.el7.x86_64.rpm
^C
[root@ken ~]# ls -lh /root/gitlab-ce-8.9.5-ce.0.el7.x86_64.rpm
-rw-r–r– 1 root root 265M Nov 13 2018 /root/gitlab-ce-8.9.5-ce.0.el7.x86_64.rpm

  1. mtime: 指文件修改时间,权限,属主,属组

例子1:找到文件修改时间一天以上的
[root@ken ~]# find / -mtime +1 | head -3
/boot
/boot/efi
/boot/efi/EFI
[root@ken ~]# stat /boot
File: ‘/boot’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 64 Links: 5
Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-05-24 19:31:37.453000000 +0800
Modify: 2019-02-26 22:25:57.574000000 +0800
Change: 2019-03-14 18:49:48.066000000 +0800
Birth: –

  1. atime:指定文件访问时间

[root@ken ~]# find / -atime +1 | head -3
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
^C
[root@ken ~]# stat /boot/grub2/device.map
File: ‘/boot/grub2/device.map’
Size: 64 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1572929 Links: 1
Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-02-26 22:25:05.730000000 +0800
Modify: 2019-02-26 22:25:05.582000000 +0800
Change: 2019-02-26 22:25:05.582000000 +0800
Birth: –

11.ctime:指定文件内容

例子1:指定文件内容修改一天以上
[root@ken ~]# find / -ctime +1 | head -3
/boot
/boot/efi
/boot/efi/EFI
C
[root@ken ~]# stat /boot
File: ‘/boot’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 64 Links: 5
Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-05-24 19:31:37.453000000 +0800
Modify: 2019-02-26 22:25:57.574000000 +0800
Change: 2019-03-14 18:49:48.066000000 +0800
Birth: –

  1. exec: 执行命令

例子1:删除无属主的文件
[root@ken ~]# find / -nouser
find: ‘/proc/2395/task/2395/fd/6’: No such file or directory
find: ‘/proc/2395/task/2395/fdinfo/6’: No such file or directory
find: ‘/proc/2395/fd/5’: No such file or directory
find: ‘/proc/2395/fdinfo/5’: No such file or directory
/root/test
/var/spool/mail/kenken
/home/kenken
/home/kenken/.bash_logout
/home/kenken/.bash_profile
/home/kenken/.bashrc
[root@ken ~]# find / -nouser -exec rm -rf {} ;
find: missing argument to `-exec’
[root@ken ~]# find / -nouser -exec rm -rf {} ;
find: ‘/proc/2451/task/2451/fd/6’: No such file or directory
find: ‘/proc/2451/task/2451/fdinfo/6’: No such file or directory
find: ‘/proc/2451/fd/5’: No such file or directory
find: ‘/proc/2451/fdinfo/5’: No such file or directory
find: ‘/home/kenken’: No such file or directory
[root@ken ~]# find / -nouser
find: ‘/proc/2463/task/2463/fd/6’: No such file or directory
find: ‘/proc/2463/task/2463/fdinfo/6’: No such file or directory
find: ‘/proc/2463/fd/5’: No such file or directory
find: ‘/proc/2463/fdinfo/5’: No such file or directory

例子2:xargs
[root@ken ~]# touch {1..100}.txt
[root@ken ~]# powd
-bash: powd: command not found
[root@ken ~]# pwd
/root
[root@ken ~]# ls
100.txt 19.txt 28.txt 37.txt 46.txt 55.txt 64.txt 73.txt 82.txt 91.txt anaconda-ks.cfg
10.txt 1.txt 29.txt 38.txt 47.txt 56.txt 65.txt 74.txt 83.txt 92.txt a.out
11.txt 20.txt 2.txt 39.txt 48.txt 57.txt 66.txt 75.txt 84.txt 93.txt gitlab-ce-8.9.5-ce.0.el7.x86_64.rpm
12.txt 21.txt 30.txt 3.txt 49.txt 58.txt 67.txt 76.txt 85.txt 94.txt ken1
13.txt 22.txt 31.txt 40.txt 4.txt 59.txt 68.txt 77.txt 86.txt 95.txt
14.txt 23.txt 32.txt 41.txt 50.txt 5.txt 69.txt 78.txt 87.txt 96.txt
15.txt 24.txt 33.txt 42.txt 51.txt 60.txt 6.txt 79.txt 88.txt 97.txt
16.txt 25.txt 34.txt 43.txt 52.txt 61.txt 70.txt 7.txt 89.txt 98.txt
17.txt 26.txt 35.txt 44.txt 53.txt 62.txt 71.txt 80.txt 8.txt 99.txt
18.txt 27.txt 36.txt 45.txt 54.txt 63.txt 72.txt 81.txt 90.txt 9.txt
[root@ken ~]# find /root -name “*txt” | xargs rm -rf
[root@ken ~]# ls
anaconda-ks.cfg a.out gitlab-ce-8.9.5-ce.0.el7.x86_64.rpm ken1

13.find可以使用-a和-o或!

例子1:找到所有事普通文件并且权限是777
[root@ken ~]# find / -type f -a -perm 644 | head -3
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
[root@ken ~]# ls -l /boot/grub2/device.map
-rw-r–r–. 1 root root 64 Feb 26 22:25 /boot/grub2/device.map

posted @ 2019-07-03 15:09  BeiteJohn  阅读(447)  评论(0编辑  收藏  举报