1. 请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
1. 加电自检:POST 通电后主板CMOS中的BIOS(基本输入输出系统)将进行硬件自检并简单设置,根据硬盘等 相关设备情况进入下一步 BIOS:Basic Input and Output System基本输入输出系统 2. 引导加载次序:BOOT Sequence 按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备 3. 引导加载器:bootloader 用来引导系统加载的程序 ·windows: ntloader ·Linux: LILO:LInux Loader(早期) GRUB: GRand Uniform Bootloader(统一引导加载器) GRUB 0.X: GRUB Legacy(GRUB传统版) GRUB 1.x: GRUB2(CentOS 7) 功能: 提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存 中的特定空间中,解压、展开,并把系统控制权移交给内核。 MBR: 446:bootloader 64:fat 2:55AA GRUB: 4. GRUB引导加载器 GRUB 是bootloader阶段的引导程序,CentOS主要通过GRUB(GRand Unified Bootloader)引导。 (1)GRUB引导步骤:grub legacy stage1: mbr(磁盘分区表) stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统; stage2:磁盘分区(/boot/grub/) 配置文件:/boot/grub/grub.conf ß /etc/grub.conf stage2及内核等通常放置于一个基本磁盘分区; (2)GRUB的功用 1.提供菜单、并提供交互式接口 e: 编辑模式,用于编辑菜单; c: 命令模式,交互式接口; 2.加载用户选择的内核或操作系统 允许传递参数给内核 可隐藏此菜单 3.为菜单提供了保护机制 为编辑菜单进行认证 为启用内核或操作系统进行认证 (3)GRUB常用命令 ·#help: 获取帮助列表 ·#help KEYWORD: 详细帮助信息 ·#find (hd#,#)/PATH/TO/SOMEFILE:查找磁盘#上的#分区的某文件 ·#root (hd#,#)把第#磁盘的第#号分区设定为grub的根设备 ·#kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核 支持使用的cmdline参数;例如:init=/path/to/init, selinux=0 表示禁用内核 ·#initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk; ·#boot: 引导启动选定的内核; 手动在grub命令行接口启动系统: # grub > root (hd#,#) ( hd#:磁盘编号 #:分区编号 ) # grub > kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE # grub > initrd /initramfs-VERSION-RELEASE.img # grub > boot (4)配置文件(grub保护机制) [root@localhost ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/sda1 # initrd /boot/initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title centos (2.6.32-71.el6.i686) root (hd0,0) kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro root=UUID=e6d7fd68-b2ef-424a-b4f4-f1145d953389 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet initrd /boot/initramfs-2.6.32-71.el6.i686.img 常用配置项 default=#: 设定默认启动的菜单项;落单项(title)编号从0开始; timeout=#:指定菜单项等待选项选择的时长; splashimage=(hd#,#) /PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径; hiddenmenu:隐藏菜单; password [--md5] STRING: 菜单编辑认证; title TITLE:定义菜单项“标题”, 可出现多次; root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”; kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核 initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件; password [--md5] STRING: 启动选定的内核或操作系统时进行认证; 5. 进入Kernel 在GRUB中选择对应的kernel后,kernel会对自身进行初始化 自身初始化: 1.探测可识别到的所有硬件设备; 2.加载硬件驱动程序;(有可能会借助于ramdisk加载驱动) ramdisk:内核中的特性之一:使用缓冲和缓存来实现对磁盘上的文件访问 CentOS 5:initrd, 工具程序:mkinitrd CentOS 6:initramfs, 工具程序:mkinitrd,dracut 3.以只读方式挂载根文件系统; 4.运行用户空间的第一个应用程序:/sbin/init init程序的类型 SysV: init, CentOS 5 配置文件:/etc/inittab Upstart: init, CentOS 6 配置文件:/etc/inittab, /etc/init/*.conf Systemd:systemd, CentOS 7 配置文件:/usr/lib/systemd/system, /etc/systemd/system 系统初始化小结: POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init 6. 运行init CentOS 6的init位置为/sbin/init,共分7个级别 6.1运行级别:为了系统的运行或维护等应用目的而设定 0:关机 1:单用户模式(root, 无须登录), single, 维护模式; 2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式; 3:多用户模式,正常模式;文本界面; 4:预留级别;可同3级别; 5:多用户模式,正常模式;图形界面; 6:重启 默认级别:3,5 切换级别:init ? 如:# init 0 表示关机 查看级别: # runlevel # who -r [root@localhost ~]# runlevel N 5 [root@localhost ~]# who -r 运行级别 5 2016-08-10 11:09 6.2 配置文件:/etc/inittab, CenOS 6的upstart程序配置文件还包括/etc/init/*.conf 配置文件格式为:id:runlevel:action:process 每行定义一种action以及与之对应的process(进程) id:指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项, 要求id与tty的编号相同,否则getty程序将不能正常工作。 runlevel:init的系统运行级别 action:是用来定义后面process的运行方式,常用的有下面几种 wait: 切换至此级别运行一次; respawn:此process终止,就重新启动之; initdefault:设定默认运行级别;process省略; sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit process:为具体的执行程序 查看本机配置文件显示为 id:5:initdefault:表示默认运行级别5,即多用户模式的图形界面 [root@localhost ~]# cat /etc/inittab | tail -10 # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: 如果设定系统初始化方式为:10:0:wait:/etc/rc.d/rc 0 表示读取/etc/rc.d/rc3.d/下的配置文件 rc 0 相当于读取/etc/rc.d/rc0.d/ 打开此目录下的文件名为:K或S+2个数字+文件名 [root@localhost ~]# ls /etc/rc.d/rc0.d K01certmonger K72autofs K87irqbalance K01smartd K73ypbind K87restorecond K02avahi-daemon K74acpid K87rpcbind K02oddjobd K74haldaemon K88auditd K05atd K74nscd K88nslcd K10cups K74ntpd K88rsyslog K10psacct K75netfs K89portreserve K10saslauthd K75ntpdate K89rdisc K15httpd K75udev-post K90network K16abrtd K80kdump K92ip6tables K25sshd K80sssd K92iptables K30postfix K83bluetooth K95cgconfig K43vmware-tools-thinprint K83nfslock K95firstboot K50dnsmasq K83rpcgssd K99cpuspeed K50netconsole K83rpcidmapd K99lvm2-monitor K50snmpd K84NetworkManager K99microcode_ctl K50snmptrapd K84wpa_supplicant K99sysstat K60crond K85mdmonitor K99vmware-tools K60nfs K85messagebus S00killall K69rpcsvcgssd K86cgred S01halt 说明: K开头的文件,K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务; S开头的文件,S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务; 7.系统初始化脚本:/etc/rc.d/rc.sysinit,会在系统启动时运行一次 主要作用 1.设置主机名; 2.设置欢迎信息; 3.激活udev和selinux; 4.挂载/etc/fstab文件中定义的文件系统; 5.检测根文件系统,并以读写方式重新挂载根文件系统; 6.设置系统时钟; 7.激活swap设备; 8.根据/etc/sysctl.conf文件设置内核参数; 9.激活lvm及software raid设备; 10.加载额外设备的驱动程序; 11.清理操作; 8.启动系统服务 centos6下的系统服务脚本都放在/etc/rc.d/init.d或者/etc/init.d中,因为建立了链接, 所以内容是一样的 [root@localhost ~]# ll /etc/init.d lrwxrwxrwx. 1 root root 11 7月 4 17:17 /etc/init.d -> rc.d/init.d [root@localhost ~]# ls !$ ls /etc/init.d abrtd haldaemon nfs rsyslog acpid halt nfslock sandbox atd httpd nscd saslauthd auditd ip6tables nslcd single autofs iptables ntpd smartd avahi-daemon irqbalance ntpdate snmpd bluetooth kdump oddjobd snmptrapd certmonger killall portreserve sshd cgconfig lvm2-monitor postfix sssd cgred mdmonitor psacct sysstat cpuspeed messagebus rdisc udev-post crond microcode_ctl restorecond vmware-tools cups netconsole rpcbind vmware-tools-thinprint dnsmasq netfs rpcgssd wpa_supplicant firstboot network rpcidmapd ypbind functions NetworkManager rpcsvcgssd chkconfig命令: (1)查看服务在所有级别的启动或关闭设定情形: chkconfig [--list] [name] [root@localhost ~]# chkconfig --list NetworkManager 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 abrtd 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭 acpid 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 ... ... (2)添加: SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d) # chkconfig --add name (3)删除: # chkconfig --del name (4)修改指定的链接类型 # chkconfig [--level levels] name <on|off|reset> --level LLLL: 指定要设置的级别;省略时表示2345; 注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本, 而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/ 目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中; mingetty会调用login程序9. 设置登陆终端 根据终端配置打印登陆提示符 初始化阶段小结为: /sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、 完成系统初始化 --> 关闭对应下需要关闭的服务,启动需要启动服务 --> 设置登录终端 总结 POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
(1)为硬盘新建两个主分区;/dev/sdb1; /dev/sdb2 [root@localhost ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x14cc3f0b. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (655-2610, default 655): Using default value 655 Last cylinder, +cylinders or +size{K,M,G} (655-2610, default 2610): +5G Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x14cc3f0b Device Boot Start End Blocks Id System /dev/sdb1 1 654 5253223+ 83 Linux /dev/sdb2 655 1308 5253255 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@localhost ~]# partx -a /dev/sdb # 通知内核重新读取硬盘分区 BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2 [root@localhost ~]# mkfs -t ext4 /dev/sdb1 # 设置文件格式为ext4 [root@localhost ~]# mkfs -t ext4 /dev/sdb2 (2)为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供rootfs; [root@localhost ~]# mkdir /mnt/boot /mnt/sysroot [root@localhost ~]# mount /dev/sdb1 /mnt/boot/ [root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/ [root@localhost ~]# ls /mnt/boot lost+found [root@localhost ~]# ls /mnt/sysroot lost+found [root@localhost ~]# cp /boot/vmlinuz-2.6.32-71.el6.i686 /mnt/boot/vmlinuz [root@localhost ~]# cp /boot/initramfs-2.6.32-71.el6.i686.img /mnt/boot/initramfs.img [root@localhost ~]# ls /mnt/boot initramfs.img lost+found vmlinuz # 为其安装grub [root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb [root@localhost sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media [root@localhost sysroot]# ls bin etc lib lost+found mnt root sys usr dev home lib64 media proc sbin tmp var (3)为rootfs提供bash、ls、cat程序及所依赖的库文件; [root@localhost ~]# mkdir /mnt/sysroot/{bin,lib64}/ [root@localhost sysroot]# cp /bin/bash /bin/ls /bin/cat /mnt/sysroot/bin/ [root@localhost sysroot]# cp `ldd /bin/bash | sed '1d'| grep -Eo "/.*[0-9] "` /mnt/sysroot/lib64/ [root@localhost sysroot]# cp `ldd /bin/ls | sed '1d'| grep -Eo "/.*[0-9] "` /mnt/sysroot/lib64/ [root@localhost sysroot]# cp `ldd /bin/cat | sed '1d'| grep -Eo "/.*[0-9] "` /mnt/sysroot/lib64/ (4)为grub提供配置文件; [root@localhost sysroot]# vim /mnt/boot/grub/grub.conf [root@localhost sysroot]# cat /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS (Express) root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机; 关闭用来设置的虚拟机,新建虚拟机,将原来添加的虚拟磁盘加载到新虚拟机,可正常启动bash,并能执行ls和cat命令 bash-4.1 # ls /bin/ bash cat ls
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
一、kickstart文件的格式: (1)命令段:指明各种安装前配置,如键盘类型等; (2)程序包段:指明要安装的程序包组或程序包,不安装的程序包等; %packages(开始) @group_name(包组) package(要安装的程序包) -package(不安装的程序包) %end(结束) (3)脚本段: %pre: 安装前脚本 运行环境:运行于安装介质上的微型Linux环境 %post: 安装后脚本 运行环境:安装完成的系统; (4)命令段中的命令: # 必备命令 authconfig: 认证方式配置 authconfig --useshadow --passalgo=sha512(密码加密格式) bootloader:bootloader的安装位置及相关配置 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto crashkernel=auto rhgb rhgb quiet quiet" keyboard: 设定键盘类型 lang: 语言类型 part: 创建分区 rootpw: 指明root的密码 timezone: 时区 # 可选命令 install OR upgrade(安装或升级) text: 文本安装界面 network firewall selinux halt(关机) poweroff(关机) reboot(重启) repo(安装过程中额外用到的) user:安装完成后为系统创建新用户 url: 指明安装源 二、创建kickstart文件的方式: (1)直接手动编辑; 依据某模板修改; (2)可使用创建工具:system-config-kickstart (CentOS 6) 依据某模板修改并生成新配置; 三、检查ks文件的语法错误:ksvalidator # ksvalidator /PATH/TO/KICKSTART_FILE 四、创建引导光盘: # mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 – boot-info-table -V “CentOS 6.8 x86_64 boot”-b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/ 1、anaconda的配置方式: (1) 交互式配置方式; (2) 通过读取事先给定的配置文件自动完成配置; a)按特定语法给出的配置选项; kickstart文件; b)安装引导选项: text: 文本安装方式 method: 手动指定使用的安装方法 c)与网络相关的引导选项: ip=IPADDR netmask=MASK gateway=GW dns=DNS_SERVER_IP ifname=NAME:MAC_ADDR d)与远程访问功能相关的引导选项: vnc vncpassword='PASSWORD' e)指明kickstart文件的位置 ks= DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE Hard drive: ks=hd:/device/drectory/KICKSTART_FILE HTTP server: ks=http://host:port/path/to/KICKSTART_FILE FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE f)启动紧急救援模式: rescue 2、 kickstart文件的格式: a)命令段:指明各种安装前配置,如键盘类型等; b)程序包段:指明要安装的程序包组或程序包,不安装的程序包等; %packages @group_name package -package %end c)脚本段: %pre: 安装前脚本 d)运行环境:运行于安装介质上的微型Linux环境 %post: 安装后脚本 运行环境:安装完成的系统; 命令段中的命令: 必备命令 authconfig: 认证方式配置 authconfig --useshadow --passalgo=sha512 bootloader:bootloader的安装位置及相关配置 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto crashkernel=auto rhgb rhgb quiet quiet" keyboard: 设定键盘类型 lang: 语言类型 part: 创建分区 rootpw: 指明root的密码 timezone: 时区 可选命令 install OR upgrade text: 文本安装界面 network firewall selinux halt poweroff reboot repo user:安装完成后为系统创建新用户 url: 指明安装源 3、创建kickstart文件的方式: (1) 直接手动编辑; 依据某模板修改; (2) 可使用创建工具:system-config-kickstart (CentOS 6) 依据某模板修改并生成新配置; 4、检查ks文件的语法错误:ksvalidator # ksvalidator /PATH/TO/KICKSTART_FILE 5、创建引导光盘: # mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 – boot-info-table -V “CentOS 6.8 x86_64 boot” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/ [root@localhost ~]# yum install system-config-kickstart [root@localhost ~]# system-config-kickstart # 进入图形界面
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, statusstart: 输出“starting 脚本名 finished.”…
(2) 其它任意参数,均报错退出;
#!/bin/bash # chkconfig: - 88 12 # description:test service script prog=$(basename $0) lockfile=/var/lock/subsys/$prog start(){ if [ -e $lockfile ];then echo "$prog is aleady running." return 0 else touch $lockfile [ $? -eq 0 ] && echo "starting $prog finished." fi } stop(){ if [ -e $lockfile ];then rm -f $lockfile && echo "stop $prog ok." else echo "$prog is stopped yet." fi } status(){ if [ -e $lockfile ];then echo "$prog is running." else echo "$prog is stopped." fi } usage(){ echo "Usage:$prog {start|stop|restart|status}" } if [ $# -lt 1 ] || [ $1 != "start" -a $1 != "stop" -a $1 != "restart" -a $1 != "status" ];then usage exit 1 fi case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
方法一:(while循环) #/bin/bash read -p "Enter a user name:" username while true;do if who | grep "^$username" &> /dev/null;then break fi sleep 3 done echo "$username logged on!" 方法二:(until循环) #/bin/bash read -p "Enter a user name:" username until who | grep "^$username" &> /dev/null;do sleep 3 done echo "$username logged on!"
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#/bin/bash cat << EOF cpu) display cpu info mem) display memory info disk) display disk info quit) quit ======================== EOF read -p "Enter a option:" option while [ "$option" ! = "cpu" -a "$option" ! = "mem" -a "$option" ! = "disk" -a "$option" ! = "disk" -a "$option" ! = "quit" ];do read -p "Wrong option,please enter again:" option done case "$option" in cpu) lscpu ;; mem) cat /proc/meminfo ;; disk) fdisk -l ;; *) echo "Quit..." exit 0 ;; esac
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;当输入的是用户名,则调用函数显示用户信息;当用户输入quit,则退出脚本;
进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash # function showinfo { if id $name &> /dev/null;then echo "UID : `id -u $name`" echo "SHELL:`grep -E '^('$name')\>' /etc/passwd | cut -d: -f7`" read -p "Enter a username or quit:" name else read -p "wrong argument,plsease enter a username or quit:" name fi } read -p "Enter a username or quit:" name while [ "$name" != "quit" ];do showinfo $name done
8、写一个脚本,完成如下功能(使用函数)
(1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
(2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;(ldd /bin/ls | grep -o "/[^[:space:]]\{1,\}"可筛选出命令对应的库文件)
#!/bin/bash read -p "Enter a exeable commond:" cmd path() { whereis $cmd | cut -d' ' -f2 } mkdir /mnt/sysroot/{bin,lib} comfilecp(){ cp $(path $1) /mnt/sysroot$(path $1) echo "cp command file $(path $1) to /mnt/sysroot sucess." } libfilecp(){ libdir=`ldd $(path $1)| sed '1d'| grep -Eo "/.*[0-9] "` for i in $libdir;do cp $i /mnt/sysroot$i echo "cp lib file $line to /mnt/sysroot sucess." done } comfilecp libfilecp
原创文章,作者:二极管,如若转载,请注明出处:http://www.178linux.com/34335
评论列表(1条)
写的很好,排版也很棒,加油