linux启动流程与grub和kickstart应用

简述linux操作系统启动流程

本示例流程以centos6的以MBR结构的linux启动流程为例:


linux操作系统启动流程.png
  • 加电自检: 自检要是检查设备:如CPU、内存、硬盘是否正常、鼠标键盘等外接设备是否存在等。

  • 启动BIOS:BIOS(基本的输入输出系统)装载在硬件芯片CMOS之上,自检时会启动这个程序,并根据CMOS上的配置信息去读取其他的硬件信息,检测正常之后进行硬件设备的初始化。

  • Boot Loader(MBR):引导加载程序,在MBR(主引导记录)中,主要功能是识别,加载操作系统的核心文件,并提交到内存中运行来启动对应的系统,windows的Boot Loader不具备控制权转交功能,因此windows的Boot Loader不能加载linux系统的Boot Loder,相反linux系统的Boot Loader可以加载windows的Boot Loader。

  • 启动Kernel(ramdisk):Kernel会自身初始化,探测可识别的硬件设备,因为Kernel是存在硬盘之中的,但是在内核启动时还没有加载硬盘,为了解决这个问题Kernel内核通过ramdisk(虚拟文件系统)来加载硬件程序,为了防止根文件系统加载时出现bug等问题无法挽回的情况,以只读方式来挂载根文件系统,来完成根文件系统的初始化。

  • rootfs(readonly):启动真正的根文件系统,然后虚拟的根文件系统与真实的根文件系统进行交换。

  • /sbin/init:在内核,硬件及驱动信息加载完毕后,内核会运行用户空间的第一个应用程序:/sbin/init,包括系统的主机名称,网络管理,文件系统格式等其他服务。

centos6的文件格式
[root@localhost ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# 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:3:initdefault:
  • 执行/etc/inittab,/etc/init/*.conf:centos6的配置文件在/etc/init目录下所有以.conf结尾的文件中。
每行定义一种action以及与之对应的process
    id:runlevels:action:process 
        id:一个任务的标识符;
        runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
        action:在什么条件下启动此任务;
        process:任务;
                            
action:
    wait:等待切换至此任务所在的级别时执行一次;
    respawn:一旦此任务终止,就自动重新启动之;
    initdefault:设定默认运行级别;此时,process省略;
    sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;
                            
例如:
    id:3:initdefault: 
    si::sysinit:/etc/rc.d/rc.sysinit
    l0:0:wait:/etc/rc.d/rc  0
    l1:1:wait:/etc/rc.d/rc  1
    …………
    l6:6:wait:/etc/rc.d/rc  6
  • 设定默认运行级别:根据系统的设定来启动系统要进入的运行级别,默认的运行级别有7种,可以用runlevel命令查看当前的运行级别,init #命令可以切换当前的运行级别,默认运行级别不能设置成0和6级别中的任何一个级别,这7种运行级别分别代表如下:
运行级别:为了系统的运行或维护等目的而设定的机制;
    0-6:7个级别;
        0:关机, shutdown
        1、单用户模式(single user),root用户,无须认证;维护模式;
        2、多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
        3、多用户模式(mutli user),完全功能模式;文本界面;
        4、预留级别:目前无特别使用目的,但习惯以同3级别功能使用;
        5、多用户模式(multi user), 完全功能模式,图形界面;
        6、重启,reboot
[root@localhost ~]# runlevel
N 3        # N:表示 系统启动时就进入3级别   3:目前系统的运行级别
[root@localhost ~]# init 5
[root@localhost ~]# runlevel
3 5        # N:由3级别切换到5级别运行
  • 系统初始化脚本:
    系统初始化脚本:/etc/rc.d/rc.sysinit配置文件中,主要进行如下的操作:
    (1) 设置主机名;
    (2) 设置欢迎信息;
    (3) 激活udev和selinux;
    (4) 挂载/etc/fstab文件中定义的所有文件系统;
    (5) 检测根文件系统,并以读写方式重新挂载根文件系统;
    (6) 设置系统时钟;
    (7) 根据/etc/sysctl.conf文件来设置内核参数;
    (8) 激活lvm及软raid设备;
    (9) 激活swap设备;
    (10) 加载额外设备的驱动程序;
    (11) 清理操作;
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

HOSTNAME=$(/bin/hostname)

set -m

if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi

if [ ! -e /proc/mounts ]; then
        mount -n -t proc /proc /proc
        mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
        modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi

if [ ! -e /proc/mounts ]; then
        mount -n -t proc /proc /proc
        mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
        modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
        mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi

#remount /dev/shm to set attributes from fstab #669700
mount -n -o remount /dev/shm >/dev/null 2>&1
#remount /proc to set attributes from fstab #984003
mount -n -o remount /proc >/dev/null 2>&1

. /etc/init.d/functions
  • 关闭或启动对应级别下的服务:意味着去启动或关闭/etc/rc.d/rc#.d/目录下的服务脚本所控制服务;
    K:要停止的服务;K##,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;
    S:要启动的服务;S##,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;
    同一个服务的K脚本数值小时,S的脚本数值就应该比K的数值大,相反的,如果S数值小,则K的数值要比S的数值要大。
chkconfig命令:管控/etc/init.d/每个脚本在各级别下的启动或关闭状态:
查看该服务在各级别下的开启或关闭状态:chkconfig  --list   [name]
添加该服务在各级别下的开启或关闭状态:chkconfig  --add  name
    能被添加的服务的脚本定义格式之一:
        #!/bin/bash
        #
        # chkconfig: LLL  NN1 NN2
            LL: 运行级别(runlevel)
            NN1:启动优先级
            NN2:关闭优先级       
        # description:  表明此配置文件的作用

删除指定服务在各级别下的开启或关闭状态:chkconfig  --del  name
修改指定的链接类型:
    chkconfig  [--level  LEVELS]  name <on|off|reset>
        --level LEVELS:指定要控制的级别;默认为2345;
[root@localhost ~]# chkconfig --list crond
crond           0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭
[root@localhost ~]# chkconfig --level 23 crond off
[root@localhost ~]# chkconfig --list crond
crond           0:关闭    1:关闭    2:关闭    3:关闭    4:启用    5:启用    6:关闭

注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。

在3级别下的服务有:
[root@localhost ~]# ls /etc/rc.d/rc3.d
K10saslauthd    K89netconsole    S07iscsid     S10network  S13iscsi             S25netfs      S80postfix
K87multipathd   K89rdisc         S08ip6tables  S11auditd   S15mdmonitor         S26udev-post  S90crond
K87restorecond  S02lvm2-monitor  S08iptables   S12rsyslog  S25blk-availability  S55sshd       S99local

  • 启动终端:最后mingetty会调用login程序。

简述grub启动引导程序配置及命令行接口详解

grub是目前最广泛linux启动管理程序,其配置文件为:/boot/grub/grub.conf,此目录其实是/etc/grub.conf的符号链接

[root@localhost ~]# ll /etc | grep grub.conf
lrwxrwxrwx.  1 root root     22 9月   6 01:57 grub.conf -> ../boot/grub/grub.conf

注意:此处grub.conf仅限centos5和centos6版本,而centos7的grub的配置文件在/boot/grub2/grub.cfg中

[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 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/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$E7rO20$rqSROpSM6VCDdjlra727I1
title CentOS 6 (2.6.32-754.el6.i686)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-754.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-754.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.img: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;

grub界面支持命令行接口 ,在界面输入e、b、c等命令可以进入对应的命令编辑,在对应的“title”中输入c进入命令模式


grub界面.png

grub的命令行界面.png

grub的help信息.png

为了防止他人随意进入grub对系统造成破坏(修改root密码等操作)可以在grub配置文件文件中加入密码来防止他人随意进入。

  1. 使用grub-md5-crypt命令来生成加密的密码
[root@localhost ~]# grub-md5-crypt
Password: 
Retype password: 
$1$94MZ20$VEC6jrQzic0nYg3CgFxaD.
  1. 在配置文件中一个或某一个title添加password --md5 ***********格式的密码保护编辑模式
# 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/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img 
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$94MZ20$VEC6jrQzic0nYg3CgFxaD.                  #此处password可以对grub界面加密,使用的就是上面得到的加密的密码
title CentOS 6 (2.6.32-754.el6.i686)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-754.el6.i686.img
        password --md5 $1$94MZ20$VEC6jrQzic0nYg3CgFxaD.          #此处password可以对进入系统之前加密 

加密后回到grub界面提示按p输入密码解锁下一步设置或环境

加密后的grub界面.png

按p后提示输入密码
grub提示输入密码.png

输入密码后按c可以进入编辑模式,在编辑模式下可以进行find来查看grub第一和第二阶段所有的硬盘位置,具体的命令可以通过help来获取帮助:
grub命令界面.png

实现kickstart文件制作与光盘镜像制作

kickstart只能在图形界面下运行并先安装kickstart,命令如下:

定制kickstart文件:
    # yum install  system-config-kickstart
    # system-config-kickstart
kickstart配置界面.png
  1. 制作kickstart文件配置安装方法


    安装方法.png
  2. 配置分区


    分区信息.png
  3. 配置网络


    网络配置.png
  4. 配置防火墙


    防火墙e.png
  5. 配置图形界面


    图形界面配置.png
  6. 配置包组


    软件包选择.png
  7. 保存并检验


    保存.png
[root@localhost ~]# ksvalidator ks.cfg
[root@localhost ~]# 

kickstart文件格式

kickstart配置文件由命令段,程序包段,脚本段等一个分段内容组成

  • 命令段:指定各种安装前配置选项,如键盘类型等
    必备命令
    authconfig:认证方式配置
        authconfig  --enableshadow  --passalgo=sha512
    bootloader:定义bootloader的安装位置及相关配置
        bootloader  --location=mbr  --driveorder=sda  --append="crashkernel=auto rhgb quiet"
    keyboard:设置键盘类型
        keyboard us
    lang:语言类型
        lang  zh_CN.UTF-8
    part:分区布局;
        part  /boot  --fstype=ext4  --size=500
        part  pv.008002  --size=51200        #pv后面的数字是pv的id号
    clearpart:清除分区
        clearpart  --none  --drives=sda:清空磁盘分区;
    volgroup:创建卷组
        volgroup  myvg  --pesize=4096  pv.008002
    logvol:创建逻辑卷
        logvol  /home  --fstype=ext4  --name=lv_home  --vgname=myvg  --size=5120
    rootpw:管理员密码
        rootpw   --iscrypted  $6$4Yh15kMGDWOPtbbW$SGax4DsZwDAz4201.O97WvaqVJfHcISsSQEokZH054juNnoBmO/rmmA7H8ZsD08.fM.Z3Br/67Uffod1ZbE0s.
        生成加密密码的方式:
        ~]# openssl  passwd  -1  -salt `openssl rand -hex 4`
    timezone:时区
        timezone  Asia/Shanghai
    
    可选命令
    install  OR  upgrade:安装或升级;
    text:安装界面类型,text为tui,默认为GUI
    network:配置网络接口
        如:network  --onboot yes  --device eth0  --bootproto dhcp  --noipv6
    firewall:防火墙 
        如:firewall  --disabled
    selinux:SELinux
        如:selinux --disabled
    halt、poweroff或reboot:安装完成之后的行为;
    repo:指明安装时使用的repository;
        如:repo  --name="CentOS"   --baseurl=cdrom:sr0  --cost=100
    url: 指明安装时使用的repository,但为url格式;
        如:url --url=http://...省略
    
  • 程序包段:指明要安装程序包,以及包组,也包括不安装的程序包
%packages            包安装的开始标识符
@group_name          包要安装的包组
package              要安装的单个包
-package             不需要安装的包
%end                 包安装的结束标识符
  • 脚本段:指明要运行的脚本,分为linux安装前的脚本和安装后脚本
%pre:安装前脚本
    运行环境:运行安装介质上的微型Linux系统环境;
%post:安装后脚本
    运行环境:安装完成的系统
  • ks:指明kickstart文件的位置,主要有以下几种格式,其中http,ftp和https三种形式引导kickstart时要保证系统能连接网络
ks=
    DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
    Hard Drive: ks=hd:/DEVICE/PATH/TO/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

以下是系统安装完成之后在/root目录下根据用户选择生成的kickstart的配置文件信息

[root@localhost ~]# cat anaconda-ks.cfg 
# Kickstart file automatically generated by anaconda.

#version=DEVEL
install
cdrom
lang zh_CN.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw  --iscrypted $6$Ka7MzfgRm5CS9N22$cMgIl.79/xGrzOG4jWCfWHnsbl0fuPIfI5zhfCEC.PKlAr18gJR7auJp8smR1MI73i9Hl3XV2Aa5tFMQ4/j9i0
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet"
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
#clearpart --none
#volgroup MYVG --pesize=4096 pv.008002
#logvol / --fstype=ext4 --name=lv_ --vgname=MYVG --size=10240
#logvol /home --fstype=ext4 --name=lv_home --vgname=MYVG --size=5000
#logvol swap --name=lv_swap --vgname=MYVG --size=2000
#logvol /usr --fstype=ext4 --name=lv_usr --vgname=MYVG --size=15000
#logvol /var --fstype=ext4 --name=lv_var --vgname=MYVG --size=10000

#part /boot --fstype=ext4 --size=500
#part pv.008002 --size=60000


repo --name="CentOS"  --baseurl=cdrom:sr0 --cost=100

%packages --nobase
@core
%end

对于修改的kickstart配置文件如果有语法错误可以使用检查语法错误命令: ksvalidator

[root@localhost ~]# ksvalidator anaconda-ks.cfg 
[root@localhost ~]# 
#如果有错误会有提示

引导光盘镜像制作及kickstart文件安装系统

1. 创建目录并复制isolinux目录:
引导光盘仅需要isolinux即可,并把配置好的kickstart文件复制到创建目录中

[root@localhost ~]# mount /dev/cdrom /media
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# mkdir /tmp/myiso
[root@localhost ~]# cp -r /media/isolinux/ /tmp/myiso/
[root@localhost ~]# ls /tmp/myiso/isolinux/
boot.cat  grub.conf   isolinux.bin  memtest     TRANS.TBL     vmlinuz
boot.msg  initrd.img  isolinux.cfg  splash.jpg  vesamenu.c3
[root@localhost ~]# cp ks.cfg /tmp/myiso/isolinux

2. 创建iso文件系统:
使用mkisofs命令来创建,格式如下:
mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myiso/

[root@localhost ~]# cd /tmp
[root@localhost tmp]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 7 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myiso/
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.9 (Linux)
Scanning myiso/
Scanning myiso/isolinux
Excluded by match: myiso/isolinux/boot.cat
Excluded: myiso/isolinux/TRANS.TBL
Writing:   Initial Padblock                        Start Block 0
Done with: Initial Padblock                        Block(s)    16
Writing:   Primary Volume Descriptor               Start Block 16
Done with: Primary Volume Descriptor               Block(s)    1
Writing:   Eltorito Volume Descriptor              Start Block 17
Size of boot image is 4 sectors -> No emulation
Done with: Eltorito Volume Descriptor              Block(s)    1
Writing:   Joliet Volume Descriptor                Start Block 18
Done with: Joliet Volume Descriptor                Block(s)    1
Writing:   End Volume Descriptor                   Start Block 19
Done with: End Volume Descriptor                   Block(s)    1
Writing:   Version block                           Start Block 20
Done with: Version block                           Block(s)    1
Writing:   Path table                              Start Block 21
Done with: Path table                              Block(s)    4
Writing:   Joliet path table                       Start Block 25
Done with: Joliet path table                       Block(s)    4
Writing:   Directory tree                          Start Block 29
Done with: Directory tree                          Block(s)    2
Writing:   Joliet directory tree                   Start Block 31
Done with: Joliet directory tree                   Block(s)    2
Writing:   Directory tree cleanup                  Start Block 33
Done with: Directory tree cleanup                  Block(s)    0
Writing:   Extension record                        Start Block 33
Done with: Extension record                        Block(s)    1
Writing:   The File(s)                             Start Block 34
 21.94% done, estimate finish Tue Oct  9 19:30:39 2018
 43.79% done, estimate finish Tue Oct  9 19:30:39 2018
 65.71% done, estimate finish Tue Oct  9 19:30:39 2018
 87.57% done, estimate finish Tue Oct  9 19:30:39 2018
Total translation table size: 4701
Total rockridge attributes bytes: 1438
Total directory bytes: 2654
Path table size(bytes): 26
Done with: The File(s)                             Block(s)    22659
Writing:   Ending Padblock                         Start Block 22693
Done with: Ending Padblock                         Block(s)    150
Max brk space used 0
22843 extents written (44 MB)
-----------------------------------------------------------------------------------------
[root@localhost ~]# ls
ab               download.cgi  hostname            line      sum       公共的  文档
anaconda-ks.cfg  filename      idsum               linesum   user      模板    下载
boot.iso         foo.sh        install.log         linesum2  useradd   视频    音乐
dead.letter      hadoop        install.log.syslog  menu      wordlist  图片    桌面

3. 使用FTP工具将boot.iso传到主机上:

将boot.iso发送到主机.png

4. 配置虚拟机并启动:
光盘要选择boot.iso这个文件

虚拟机配置.png

5. 开机启动并配置kickstart文件:

启动界面.png

在以上界面按下ESC后进入boot,并输入ks.cfg的路径

boot界面.png

最后敲入命令即可进入自动引导安装了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容