Linux 运维工程师笔试题
一、基本知识题(共 10 题,每题 3 分)
1 、用什么命令查询指定 IP 地址的服务器端口?
yuminstall-y nmap
2 、用什么命令定义某个程序执行的优先级别?
nice renice
3 、如何让 history 命令显示具体时间?
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"export HISTTIMEFORMAT 重新开机后会还原,可以写/etc/profile
4 、查看 Linux 系统当前指定用户的邮件队列命令是?
[root@test4 ~]# mailq[root@test4 ~]# mail -u rootHeirloom Mail version 12.4 7/29/08.Type ? for help."/var/mail/root": 9 messages 8unread1AnacronTue Jun 1806:4018/625"Anacron job 'cron.daily' ontest4.wolf.org">U2 AnacronWed Jun 1914:2918/624"Anacron job 'cron.daily' on test4.wolf.org"U3AnacronThu Jun 2013:3618/624"Anacron job 'cron.daily' ontest4.wolf.org"& 1Message1:From [email protected] Jun 18 06:40:09 2013Return-Path: X-Original-To: rootDelivered-To: [email protected]: Anacron To: [email protected]: text/plain;charset="ANSI_X3.4-1968"Subject: Anacron job 'cron.daily' ontest4.wolf.orgDate: Tue, 18 Jun 2013 06:40:09 -0700 (PDT)Status: RO/etc/cron.daily/mlocate.cron:/usr/bin/updatedb: can not open`/etc/updatedb.conf': Permission denied
5 、查看 Linux 系统当前加载的库文件?
lsof
6.Ext4 文件系统如何恢复 rm 命令删除文件
Linux下删除文件并不是真实的删除磁盘分区中的文件,而是将文件的inode节点中的扇区指针清除,同时释放这些数据对应的数据块,当释放的数据块被系统重新分配时,那些被删除的数据就会被覆盖,所以误删除数据后,应马上卸载文件所在的分区。
每个文件有inode和block组成,inode是文件系统组成的最基本单元,它保存着文件的基本属性(大小、权限、属主组等)和存放的位置信息。而 block用来存储数据。类似key-value,inode就是key,block对应value,通过key查找key对应的value。类似 python的字典。
必须先umount要恢复文件的分区或者把分区改为只读模式,命令:mount –o remount,ro 分区(例如:dev/hda1)
或者
mount -n -r -o remount /dba1 最好尽快将所在分区修改为只读方式,防止数据被覆盖使用。
linux下面查看文件系统的方法有:1、mount命令
#mount
/dev/sda1 on / type ext4
表示sda1 的文件系统是ext4 类型的。2、命令df
# df -Th
Filesystem Type Size Used Avail Use% Mounted on/dev/sda1 ext4 13G 7.6G 4.2G 65% /
df 的-T参数就可以显示文件系统的类型,-h参数让其显示的更人性化。3、命令 more /etc/fstab
# more /etc/fstab 通过配置文件查看
软件下载:
wget http://sourceforge.net/projects/extundelete/files/extundelete/0.2.0/extundelete-0.2.0.tar.bz2/download
安装软件:
yum install e2fsprogs-devel libcom_err-devel -y
tar -jxfextundelete-0.2.0.tar.gbz21.cdextundelete-0.2.02../configure3.make4.makeinstall
执行恢复动作:
单个文件的恢复:extundelete /dev/sdaX --restore-file /*/*....*/file
目录恢复:extundelete /dev/sdaX --restore-directory /*/*....*/dir
恢复近期被删的所有东西:extundelete /dev/sdaX --restore-all
7 、使用 tcpdump 监听主机 IP 为 192.168.1.1 , tcp 端口为 80 的数据,同时将结果保存输出到 tcpdump.log ,请写出相应命令。
[root@test4 ~]# tcpdump tcp port 80andhost 192.168.46.128 –w/root/sss
8 、简述 IDS 作用和实现原理。
***检测,设备放在intelnet进来的第一台路由后面。对进入路由的所有的包进行检测,如果有异常就报警。
9 、用 sed 修改 test.txt 的 23 行 test 为 tset ;
sed ‘23s/test/tset/g ’ test.txt
10 、一个 EXT3 的文件分区,当使用 touchtest.file 命令创建一个新文件时报错,报错的信息是提示磁盘已满,但是采用 df -h 命令查看磁盘大约只使用了 60% 的磁盘空间,为什么会出现这个情况,说说你的理由。
1,用户磁盘配额的问题 2,ext3文件系统设计的时候不适合很多小文件和大文件一样的文件格式,很多小文件会导致inode耗尽
11 、当用户在浏览器当中输入一个网站,说说计算机对 dns 解释经过那些流程?(注:本机跟本地 dns 还没有缓存)
a.用户输入网址到浏览器 b.浏览器发出DNS请求信息 c.计算机首先查询本机HOST文件,看是否存在,存在直接返回结果,不存在,继续下一步 d.计算机通过/etc/resolv.conf按照本地DNS的顺序,向合法dns服务器查询IP结果, e.合法dns返回dns结果给本地dns,本地dns并缓存本结果,直到TTL过期,才再次查询此结果 f.返回IP结果给浏览器 g.浏览器根据IP信息,获取页面
12.DNS 服务器有哪三种类型
主 从 缓存
二、简述题(共 10 题,每题 7 分)
1 、 linux 下如何改 IP, 主机名, DNS
[root@test4 ~]#vim/etc/sysconfig/network-scripts/ifcfg-eth0[root@test4 ~]#vim/etc/sysconfig/network[root@test4 ~]# vim/etc/resolv.conf
2 、用 shell 统计 ip 访问情况,要求分析 nginx 访问日志,找出访问页面数量在前10 位的 IP 数。以下是 nginx 的访问日志节选
202.101.129.218- - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1)"
请写 shell 实现输出 top10 的 IP 列表。
[root@test4logs]# awk '{print $1}' access.log |sort|uniq -c |head -n 1031 192.168.46.1
3 、简述 linux 下编译内核的意义与步骤
编译内核的意义在于让硬件设备更稳定的发挥其应有的效能;
新内核可以在http://www.kernel.org下载。先把linux-2.6.18.2.tar.bz2 复制到/usr/src/的下面
tar –jxvf linux-2.6.18.2.tar.bz2
cd linux-2.6.18.2make mrproper把原来编译产生的垃圾删除
配置内核可以根据需要与爱好使用下面命令中的一个:
#make config (基于文本的最为传统的配置界面)
#make menuconfig (基于文本选单的配置界面)
#make xconfig (基于图形窗口模式的配置界面)
#make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)
进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。例如,如果需要内核支持DOS分区的文件系统,则要在文件系统部分选择FAT或DOS系统支持;系统如果配有网卡、PCMCIA卡等,需要在网络配置中选择相应卡的类型。
选择相应的配置时,有三种选择,它们分别代表的含义如下:
“Y”-将该功能编译进内核
“N”-不将该功能编译进内核
“M”-将该功能编译成可以在需要时动态插入到内核中的模块。
将与核心其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响。许多功能都可以这样处理,例如像上面提到的网卡的支持、对FAT等文件系统的支持。
其实现在编译内核最关键的地方就是配置内核。我一般用make menuconfig配置内核。
配置2.6.0内核时如果你的主板是Intel芯片的话,你用默认配制也许就可以得到一个满意的内核哦。做法是make menuconfig后离开时选择保存。
这里的难点是pci,如果你硬盘是IDE的那一定要选择好你主板上南桥芯片。SCSI的话就是要选择上你的SCSI卡型号。
还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci 查找到比如我的是。
[root@leo boot]# lspci00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)00:07.0 ISA bridge: Intel Corp. 82371AB/EB/MB PIIX4 ISA (rev 08)00:07.1 IDE interface: Intel Corp. 82371AB/EB/MB PIIX4 IDE (rev 01)00:07.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB00:07.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 08)00:0f.0 VGA compatible controller: VMware Inc [VMware SVGA II] PCI Display Adapter00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)00:12.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02)
编译配置
在这一部分涉及几个重要模块的配置请,特别注意.一般用"make menuconfig"命令来配置内核.
输入以上命令后出现一个菜单界面,用户可以对需要的模块.下面着重讲几个重要的配置1)文件系统
请务必要选中ext3文件系统,
File systems--->
[*] Ext3 journalling file system support
[*] Ext3 Security Labels
[*] JBD (ext3) debugging support
以上三项一定要选上,而且要内建(即 标*). 这个非常重要,在配置完后一定要检查一下.config文件有没有"CONFIG_EXT3_FS=y"这一项. 如果不 是"CONFIG_EXT3_FS=y"而是"CONFIG_EXT3_FS=m",你在运行内核时就会遇上以下错 误: pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed2)网卡驱动
请务必把自己网卡对应的驱动编译进内核,比较普遍的网卡是realtek 8139,以下就是这种网卡的配置,以供参考
Device Drivers--->
Networking support--->
Ethernet (10 or 100Mbit) ---><*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL)<*> RealTek RTL-8139 PCI Fast Ethernet Adapter support
3)声卡驱动
也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是i810_audio,以下就是这种声卡的配置,以供参考
Device Drivers --->
Sound ---><*> Sound card support
Advanced Linux Sound Architecture ---><*> Advanced Linux Sound Architecture<*> Sequencer support< > Sequencer dummy client<*> OSS Mixer API<*> OSS PCM (digital audio) API[*] OSS Sequencer API<*> RTC Timer support
PCI devices ---><*> Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111
Open Sound System --->< > Open Sound System (DEPRECATED)
以上三项配置关系到新内核能否正常运行,请备加注意.其他的配置如果不是很了解,大可以按默认的选择.
#make dep (确保关键文件在正确的位置) 2.5.*-2.6.0都不需要了。其实2.4.*某些内核也不需要了。
#make clean (确保所有有关文件都处于最新版本状态)
#make zImage (编译压缩形式的内核)
在需要内核支持较多的外设和功能时,内核可能变得很大,此时可以编译大内核:
#make bzImage
编译的时间与机器的硬件条件及内核的配置等因素有关,所获得的内核的位置在/usr/src/linux/arch/i386/boot目录下,当然这里假设用户的CPU是x86型的。
如果选择了可加载模块,编译完内核后,要对选择的模块进行编译:
#make modules (编译选择的模块)
#make module_install (将编译后的模块转移到系统标准位置)
# make install
上面的命令"make install"将:
(1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接;
(2)修改bootloader的配置文件;
(3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:
title Red Hat Linux (2.***)
root(hd0, 1)
kernel /boot/vmlinuz-2.*** ro root=LABEL=/
initrd /boot/initrd-2.***.img
模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行#make modules_install之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模块进行列表。
我一般是make bzImage;make modules;make module_install; make install
运行新内核之前,请检查一下/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 have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18.2)
root (hd0,0)
kernel /vmlinuz-2.6.18.2 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18.2.img
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18-1.2798.fc6.img
现在重启机器,即可测试最新的内核。
4 、简述 Linux 启动过程
计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。1) 最初始阶段: 当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/OutputSystem)读取其中所存储的程序。这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许你从软盘、光盘或者硬盘中选择一个来启动计算机。 下一步,计算机将从你所选择的存储设备中读取起始的512 bytes(比如光盘一开是的512 bytes,如果我们从光盘启动的话)。这512 bytes叫做主引导记录MBR (masterboot record)。MBR会告诉电脑从该设备的某一个分区(partition)来装载引导加载程序(boot loader)。Boot loader储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核(kernel)所在位置等。常用的boot loader有GRUB和LILO。 随后,boot loader会帮助我们加载kernel。kernel实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过kernel传达给硬件。Windows和Linux各自有自己kernel。狭义的操作系统就是指kernel,广义的操作系统包括kernel以及kernel之上的各种应用。 (Linus Torvalds与其说是Linux之父,不如说是Linux kernel之父。他依然负责Linux kernel的开发和维护。至于Ubuntu, Red Hat, 它们都是基于相同的kernel之上,囊括了不同的应用和界面构成的一个更加完整的操作系统版本。) 实际上,我们可以在多个分区安装boot loader,每个boot loader对应不同的操作系统,在读取MBR的时候选择我们想要启动的boot loader。这就是多操作系统的原理。 小结:BIOS -> MBR ->boot loader -> kernel2) kernel 如果我们加载的是Linux kernel,Linux kernel开始工作。kernel会首先预留自己运行所需的内存空间,然后通过驱动程序(driver)检测计算机硬件。这样,操作系统就可以知道自己有哪些硬件可用。随后,kernel会启动一个init进程。它是Linux系统中的1号进程(Linux系统没有0号进程)。到此,kernel就完成了在计算机启动阶段的工作,交接给init来管理。 小结: kernel -> init process3) initprocess (根据boot loader的选项,Linux此时可以进入单用户模式(singleuser mode)。在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在的错误) 随后,init会运行一系列的初始脚本(startup scripts),这些脚本是Linux中常见的shell scripts。这些脚本执行如下功能: 设置计算机名称,时区,检测文件系统,挂载硬盘,清空临时文件,设置网络…… 当这些初始脚本,操作系统已经完全准备好了,只是,还没有人可以登录!!!init会给出登录(login)对话框,或者是图形化的登录界面。 输入用户名(比如说vamei)和密码,DONE! 在此后的过程中,你将以用户(user)vamei的身份操作电脑。此外,根据你创建用户时的设定,Linux还会将你归到某个组(group)中,比如可以是stupid组,或者是vamei组。 所以你将是用户vamei,同时是vamei组的组员。(注意,组vamei和用户vamei只是重名而已,就好想你可以叫Dell, 同时还是Dell公司的老板一样。你完全也可以是用户vamei,同时为stupid组的组员) 总结: BIOS ->MBR -> boot loader -> kernel -> init process -> login 用户,组。
5. 你说下你技术的强项和不足?
6. 如果给你 300 台服务器,你该怎么去管理?
7. 在一个系统架构中,我们为了避免单点故障,会怎么做?
系统集群高可用
8 、 xen 环境下,如何调整虚拟机内存及 vcpu 数 ?
更改虚拟机分配的CPU数量。要更改此设置,既可以利用虚拟机管理器(Virtual Machine Manager)进行,也可以使用xm vcpu-set命令。例如,将domain 1分配的VCPU数改为4个,则:
xm vcpu-set 1 4
9 、简述下一般调整哪些内核参数
linux 内核参数调整说明 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。 2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。 3. /proc/sys/net/ipv4/tcp_timestamps — 时间戳在(请参考RFC 1323)TCP的包头增加12个字节。 4. /proc/sys/net/ipv4/tcp_sack — 有选择的应答。 5. /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64KB), 必须设置该数值为1。 6. rmem_default — 默认的接收窗口大小。 7. rmem_max — 接收窗口的最大大小。 8. wmem_default — 默认的发送窗口大小。 9. wmem_max — 发送窗口的最大大小。 /proc目录下的所有内容都是临时性的, 所以重启动系统后任何修改都会丢失。 建议在系统启动时自动修改TCP/IP参数: 把下面代码增加到/etc/rc.local文件, 然后保存文件, 系统重新引导的时候会自动修改下面的TCP/IP参数: echo 256960 > /proc/sys/net/core/rmem_default echo 256960 > /proc/sys/net/core/rmem_max echo 256960 > /proc/sys/net/core/wmem_default echo 256960 > /proc/sys/net/core/wmem_max echo 0 > /proc/sys/net/ipv4/tcp_timestamps echo 1 > /proc/sys/net/ipv4/tcp_sack echo 1 > /proc/sys/net/ipv4/tcp_window_scaling TCP/IP参数都是自解释的, TCP窗口大小设置为256960, 禁止TCP的时间戳(取消在每个数据包的头中增加12字节), 支持更大的TCP窗口和TCP有选择的应答。 上面数值的设定是根据互连网连接和最大带宽/延迟率来决定。 注: 上面实例中的数值可以实际应用, 但它只包含了一部分参数。 另外一个方法: 使用 /etc/sysctl.conf 在系统启动时把参数配置成您所设置的值: net.core.rmem_default = 256960 net.core.rmem_max = 256960 net.core.wmem_default = 256960 net.core.wmem_max = 256960 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_sack =1 net.ipv4.tcp_window_scaling = 1 设置Linux内核参数 配置 Linux 内核参数(2种方法),修改后不用重启动更新: /sbin/sysctl -p 第一种:打开/etc/sysctl.conf 复制如下内容 kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=262144 net.core.wmem_max=262144 第二种:打开终端 cat >> /etc/sysctl.conf
10 、最大打开文件数如何调整
修改下Linux的配置: 修改 /etc/sysctl.conf,增加fs.file-max = 8061540 修改 /etc/security/limit.conf,增加 * soft 8192 和 * hard 16384 ulimit -n 4096 也就是限制用户的最大文件打开数为4096个 当前设置最大打开文件数可以通过如下命令查看。 ulimit -n 这个数字说明了一个普通用户能够在一个单独会话中所能打开最大的文件数目。注意。如果是root,以下操作不能使ulimit -n的输出增加。因为用户root用户不受这个ulimit限制。只有普通用户才会受这个限制。 为了提高最大打开文件数到默认值1024以上,需要在系统上修改2个地方。在这个案例中,我们将最大打开文件数增加到2048。所有的步骤需要root用户操作。普通用户需要重新登录才能使设置生效。 1. 按照最大打开文件数量的需求设置系统,并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。 # cat /proc/sys/fs/file-max 如果设置值太小,修改文件/etc/sysctl.conf的变量到合适的值。这样会在每次重启之后生效。如果设置值够大,跳过下步。 # echo 2048 > /proc/sys/fs/file-max编辑文件/etc/sysctl.conf,插入下行。 fs.file-max = 2048 2. 在/etc/security/limits.conf文件中设置最大打开文件数,下面是一行提示: #添加如下这行。 * – nofile 2048 这行设置了每个用户的默认打开文件数为2048。注意”nofile”项有两个可能的限制措施。 就是 项下的hard和soft。要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-”字符设定 , 则hard和soft设定会同时被设定。 硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。只有root用户才能够增加hard限制值。 eg: 我在google上搜索过关于ulimit命令的一些用法,其中有 ulimit -n 4096 也就是限制用户的最大文件打开数为4096个 在网上查了关于怎么查看文件打开数的文章大致有两种说法 /proc/sys/fs/file-nr 该文件与 file-max 相关,它有三个值: 已分配文件句柄的数目 已使用文件句柄的数目 文件句柄的最大数目 该文件是只读的,仅用于显示信息。 [root@linux /]# cat /proc/sys/fs/file-max 8061540 [root@linux /]# cat /proc/sys/fs/file-nr 900 0 8061540 查看所有进程的文件打开数 lsof |wc -l 查看某个进程打开的文件数 lsof -p pid |wc -l 查看java进程的PID [root@linux /]# ps -ef |grep java root 1040797800 14:50 pts/100:00:00 grep java kill -9 9780 就能全部杀掉 java进程。 pid 就是9780 。 [root@linux /]# lsof |wc -l 1238 [root@linux /]# lsof -p 9780 |wc -l 18