当李特流民起义发生时,五部大都督刘渊已经在到处招兵买马,积蓄力量,占据了很大的地盘。刘渊的祖上是匈奴人,从汉高祖刘邦开始,汉皇族和匈奴贵族通亲,一些匈奴贵族认为自己是汉皇室刘家的后代,逐渐改姓刘。东汉末年,曹操征服了匈奴,把匈奴分为五大部,每个部设一个部帅,刘渊的父亲刘豹便是其中的一个部帅。公元304年,正是“八王之乱”发生时,刘渊借口说回匈奴借兵帮助司马颖作战,跑回匈奴贵族的聚居地离石(今山西离石),召集匈奴五个部族,被拥为大单于,发兵攻打当时正在与晋军作战的鲜卑族军队。当李雄自号成王的消息传来后,刘渊决定也自封王号。刘渊认为:自己本是汉朝皇家的外甥,和汉皇族是兄弟关系,现在汉朝灭了,自己称王,正好用“汉”的名称,便正式称为汉王。
刘渊称汉王后,很快攻下了上党、太原、河东、平原等几个郡,势力越来越大。一些势力比较小的各族反晋力量也都来归附刘渊。
公元308年,刘渊称汉帝。第二年迁都平阳(今山西临汾西南),集中兵力进攻洛阳。洛阳的老百姓虽然恨透了腐朽的西晋王朝,但是也不愿受匈奴贵族的统治。所以刘渊两次进攻,都遭到洛阳军民的猛烈抵抗,不得不退兵。
那时候,八王中最后的一个王——东海王司马越还在和一批大臣互相仇杀。晋朝仅存的一点兵力也消耗殆尽。
刘渊去世以后,他的儿子刘聪继承了皇位,刘聪继续让大将王弥和刘曜领兵攻晋。这一次,王弥和刘曜并未直接向晋国都城洛阳进军,而是领兵在各地转战,把洛阳以外的地方一一占领,切断晋王朝和地方上的联系。当刘曜、王弥在各地打击晋王朝的军事力量时,晋怀帝让东海王司马越率兵二十万与汉军作战。司马越当时执掌了朝廷的军政大权,非常轻视晋怀帝,晋怀帝也不放心他,想借地方力量来除掉司马越。司马越对晋怀帝抱有戒心,在和汉军作战时,只停留在维持现状,并未积极攻打汉军。
公元311年,即晋怀帝元嘉五年,东海王司马越病死,把兵权交到了太尉王衍手中。王衍是个崇尚空谈、徒具虚名的空头理论家,他想把晋军主力部队撤到郯城去。刚到苦县,就被石勒的骑兵包围。县城被轻而易举地攻破,晋军主力十万多人溃不成军,全部被杀,随军转移的晋朝皇室成员四十八个诸侯王也全都被杀,大批官员丧生。王衍被活捉,石勒指着王衍的鼻子责骂道:“晋国上下,一片混乱,全是你们这些大臣的责任,你身为太尉,怎么会把军队治得如此糟糕!”王衍说:“我从小就不想当官,勉强在朝中任职,一切大事都是皇族亲王主持。如果说晋室灭亡,那也是天意,您今天正可以顺应天意,灭晋建国呢!”石勒讽刺道:“你从少年就在朝为官,现在头发都白了,还当着太尉高官,统领军事,还说什么不想当官,骗得了谁?”王衍被问得满脸羞愧,低首无语。当天夜里,石勒命令士兵把关押王衍等人的房子的墙壁推倒,一班俘虏全部被压死。
王衍所统领的晋主力部队被消灭以后,刘聪又派刘曜、王弥率军攻下了洛阳。汉军拥进皇城,见人就杀,见东西就抢,晋怀帝被俘虏,从王公大臣,到一般老百姓,被杀者二万多人。刘曜让士兵把这些尸体全部运到洛水北岸埋葬,士兵们在城中放火烧毁宫殿和官府衙门,一座气势雄伟的洛阳城几乎化为灰烬,这就是历史上令人震惊的“永嘉之乱”。
晋怀帝司马炽被俘虏以后,由汉军大将呼延晏派人押送到汉国首都平阳。刘聪听说晋怀帝已被押到,就升殿高坐,封呼延晏为镇南大将军,将晋怀帝司马炽和随行人员押上大殿。司马炽见了刘聪,弯腰行礼,自称臣子。刘聪封晋怀帝为平阳公,留在平阳居住。
不久,刘聪设宴,召晋怀帝赴宴。喝了几杯酒以后,刘聪嘲笑地问司马炽:“这么多年来,你们司马家族互相攻战,兄弟之间就像仇敌一样,这是什么道理啊?”司马炽低着头说:“这是上天要灭我们司马氏江山,所以叫我们兄弟之间互相攻战,而您的大汉天下,也就因此建立起来了。”听得刘聪开怀大笑。
晋怀帝司马炽在平阳的俘虏生活过得很快,不知不觉一年时间就过去了。新年这一天,刘聪在光极殿大摆宴席,召集文武大臣出席,为了炫耀自己的威风,刘聪命令晋怀帝司马炽改穿一身青色衣服,打扮成奴仆的模样,站在酒席旁边为参加宴会的人倒酒。司马炽不得不捧着酒壶,低着头,一杯一杯地为客人倒酒,满脸通红。随同晋怀帝一道被俘的几个旧臣偷偷地痛哭流泪,这幕都被刘聪看见了,他大为恼火,把晋怀帝赶出大殿。
几个月以后,刘聪还是不放心,派人用毒酒毒死了司马炽。当怀帝司马炽被杀的消息传到长安以后,秦王司马邺被大臣们立为皇帝,这就是西晋的最后一个皇帝——晋愍帝。
公元316年,刘聪攻下长安。晋愍帝也遭受了怀帝同样的命运,在受尽侮辱后被杀。西晋王朝持续了五十二年,终于灭亡。
西晋灭亡之后,北方的各族人民(主要是匈奴、鲜卑、羯、氐、羌五个少数民族)纷纷起义,他们中间的野心家乘机起兵,像李雄、刘渊一样建立政权,前前后后一共出现了十六个割据政权,历史上称为“十六国”。