公元310年八月,首位入主中原的匈奴人皇帝劉淵病逝。劉淵臨死前召太宰劉歡樂等人來到禁中,接受遺詔輔政。劉淵死後,太子劉和即位。但不久發生內亂,最後劉和被殺,楚王劉聰即位成為漢皇帝。劉聰立妻子呼延氏為皇后,封兒子劉粲為河內王,其他兒子也都封王;讓劉粲負責朝廷內外軍事,任命石勒為幷州刺史,封汲郡公。
雍州流民多數在南陽,晉懷帝下詔書讓他們遣還鄉里。流民因為關中荒蕪殘破,都不願回去。徵南將軍山簡和南中郎將杜蕤便各自派兵遣送流民,催促他們定期出發。京兆人王如暗中聯結壯士,夜裏偷襲並打敗了山簡和杜蕤的兩支軍隊。馮翊人嚴嶷和京兆人侯脱也各自聚眾攻克城鎮,殺害縣令以及地方長官,響應王如。沒多少天,反叛的軍隊就達到四五萬人,嚴嶷和侯脱便自稱大將軍,分別領司、雍二州牧,稱藩於漢。
冬十月,劉聰派漢河內王劉粲和劉曜以及王彌率領四萬大軍再次入侵洛陽。石勒把軍隊的輜重留在重門(今河南輝縣西北),率領二萬騎兵和劉粲在大陽會合。在澠池打敗晉監軍裴邈後,石勒長驅進入洛川。劉粲兵出軒轅,在梁、陳、汝、潁之間大肆掠奪。石勒兵出成皋關,將陳留太守王贊包圍在倉垣(今河南開封西北),但被王贊擊敗,只好退守文石津(在今河南濮陽)。石勒準備北攻晉幽州刺史王浚,恰巧王浚部將王甲始率領遼西鮮卑騎兵一萬多人在津北擊敗漢將趙固,石勒便改變主意,燒了船隻,放棄了軍營,率軍轉向柏門,到重門取了輜重,在石門渡過黃河,接着在繁昌進攻晉襄城太守崔曠,把他殺了。
當時幷州刺史劉琨和匈奴人劉虎率領的另一個部落正在交戰。劉琨不能取勝,便派遣使者帶上厚禮低聲下氣地請求北邊的鮮卑部落酋長拓跋猗盧出兵相助。拓跋猗盧派弟弟拓跋弗的兒子拓跋鬱律率領二萬騎兵幫助劉琨打敗了劉虎。
劉琨很感謝拓跋猗盧,便和他殺白馬為誓結成異姓兄弟。劉琨又上奏推薦拓跋猗盧為大單于,將代郡給他,封他為代公。不等朝廷詔書下來,拓跋猗盧便率軍東進佔據了代地。
那時代郡屬於幽州,王浚聽説後大怒,跟部屬説道:“劉琨是幷州刺史,豈能把我幽州的地盤擅自許給他人?”便派兵攻擊拓跋猗盧。拓跋猗盧將他的軍隊擊敗,於是王浚和劉琨有了矛盾。
拓跋猗盧因為他的封邑代郡離他老家很遠,兩個地方也不相連,便帶領部落一萬多家從雲中進入雁門,向劉琨要求得到陘北的地盤。劉琨不能制約,又想倚靠他幫助自己,便遷徙樓煩、馬邑、陰館、繁畤、崞五縣的百姓到陘南,把他們的地方給了拓跋猗盧。因此拓跋猗盧的勢力日益強盛。
拓跋猗盧願意出兵幫助劉琨,劉琨便派人遊説司馬越,請朝廷出兵和他一道討伐劉聰和石勒。然而司馬越這時和佔據青兗二州的苟晞矛盾已經很深,擔心一旦出兵,苟晞和豫州刺史馮嵩可能會趁機進京,最終成為像董卓那樣的後患,便不答應。劉琨只好謝絕了拓跋猗盧的好意,讓他率軍迴歸藩國。
京師洛陽的饑荒困頓一天比一天嚴重,司馬越派遣使者用羽檄徵召天下的兵馬,要求他們入援京師。晉懷帝召見各位派出的使者,親自告誡道:“諸位愛卿一定要幫朕轉告各個州鎮:現在派兵來還有救,再遲則來不及了!”然而最終還是沒有勤王軍隊到來。
徵南將軍山簡派部將王萬帶兵入援。軍隊抵達涅陽(今河南鎮平)時,被王如率領的雍州流民打敗。王如於是在沔漢一帶大肆掠奪,進逼襄陽,山簡閉城堅守。荊州刺史王澄親自帶兵,也準備入援京師。恰巧王如進犯襄陽,王澄便率軍前往相救。前鋒到達宜城(湖北西北部)時,王澄派使者去見山簡。使者被王如的黨羽嚴嶷抓獲。嚴嶷便派人裝作從襄陽那邊過來,嚴嶷假裝問他道:“王如是否已經攻拔了襄陽?”那人答道:“王將軍昨天早上已經破城,還活捉了山簡。”嚴嶷故意讓王澄的使者在場聽到這一對話。嚴嶷接着假裝對王澄的使者看管不嚴,讓他得到機會逃走。使者逃回王澄那裏,稟告了所見所聞。王澄聽説襄陽陷落,信以為真,便遣散軍隊回荊州去了。後來聽説山簡堅守襄陽無事,自己覺得羞恥,便藉口運糧來不及,委罪給長史蔣俊而把他殺了,於是終竟不能進援洛陽。
朝廷多數大臣的意見是想遷都到倉垣避難。太尉王衍覺得不行,便把自家的牛車給賣了,好讓大家放心。山簡被嚴嶷的軍隊逼迫,不得不從襄陽遷到夏口。山簡招納流亡人士,江漢一帶的人才都來歸附。當時樂府的藝人避難,多數都跑到沔漢一帶。宴會的時候,有的僚佐勸山簡奏樂,山簡説:“社稷傾覆,不能匡救,我是晉的罪人,如何還有心思作樂!”因而流淚慷慨,席上的人們無不感到慚愧。
石勒帶兵渡過黃河,將要前往南陽。王如、侯脱、嚴嶷等人聽説,急忙派遣一萬兵卒駐守在襄城抗拒石勒。石勒舉兵進擊,把他們都俘虜了,接着進駐宛北(今河南南陽)。那時,侯脱佔據宛城,王如佔據穰城(今河南鄧縣)。王如歷來和侯脱不和,便派遣使者用重金賄賂石勒,和他結為兄弟,然後遊説石勒去攻打侯脱。石勒夜裏命令三軍雞鳴時出發,到清晨就以大兵逼壓宛城,馬上發動進攻,十二天後便攻了下來。嚴嶷帶兵來救但太遲了,看到情形不妙,就投降了石勒。石勒殺了侯脱,將嚴嶷關起來送到漢都城平陽,兼併了他的部隊。
石勒於是南侵襄陽,攻拔長江西面的三十多處壁壘。石勒留下部將刁膺守襄陽,親自率領三萬精騎回去進攻王如。但又害怕王如的強盛,便回師前往襄城。王如派弟弟王璃率領二萬五千騎兵,揚言説要犒勞石勒的大軍,其實想襲擊石勒。石勒迎擊王璃,消滅了他,然後再次進駐長江以西地區。
再説司馬越殺了大臣王延等人後,大臣們開始對他大失所望。司馬越又因為胡寇日益強盛,內心很是不安,便身着戎裝晉見晉懷帝,請求出徵石勒,出鎮兗、豫二州並在那裏招募部隊。晉懷帝説:“現在胡虜侵逼京郊,人人都擔心害怕,朝廷社稷,全都倚賴愛卿,愛卿怎麼可以遠出,導致作為根本的京師孤立無援!”司馬越説:“臣出去,如果僥倖破賊,則國威可振。即使不能破賊,也比坐待困窮要好。”十一月,司馬越率領甲士四萬人向許昌進發,留下王妃裴氏和世子司馬毗以及大將李惲和何倫守衞京師,防察宮省;同時任命潘滔為河南尹,總管留守事務。司馬越上奏請內閣行台跟隨自己,用太尉王衍為軍司。朝廷賢明和有名望的大臣,都成為他的佐吏,名將勁卒也都加入他的府上。於是宮省不再有守衞,饑荒日益嚴重,宮殿裏到處都是死人;盜賊公開橫行,府寺營署,都自己挖掘溝塹自守。司馬越東進駐軍在項城,用馮嵩作左司馬,自己接任豫州牧。
何倫在朝廷作威作福。竟陵王司馬楙上奏晉懷帝請派兵襲擊何倫,結果戰敗。晉懷帝委罪給司馬楙,司馬楙逃竄出城,得免一死。
當初,晉懷帝因為王彌和石勒大軍進逼京郊,便下詔讓苟晞率領各個州郡的軍隊討伐他們。苟晞送檄文給各個州郡道:“劉淵在汾陰造逆,石勒於三魏作亂,攻陷鄴都,結壘近郊,震動兗豫,殺害三位刺史,二位都督,郡守官長,被害的有幾十人之多,百姓流離,肝腦塗地。我苟晞以虛薄之身,負荷國家重任。這月二日,我將西往黎陽。現得到滎陽太守丁嶷報告,説李惲和陳午等人前往救助懷城的各路軍隊,與羯賊大戰,但都被打散。懷城已經陷落,河內太守裴整被賊人捉獲。目前宿衞缺乏,天子蒙難,宗廟危如累卵。翼衞皇家,盡力本朝,是我們做臣子的本分,即使赴湯蹈火,也義不容辭。諸位地方要員,都受到朝廷的榮寵,應當竭盡全力,以報國恩。我苟晞雖然不是軍事天才,但願意首開兵戎,秣馬裹糧,等候諸位方鎮兵馬的到來。凡是我的同盟,都應當共同前赴國難。揚名立功的大業,在此一舉。”
這時,王彌部將曹嶷剛攻破琅邪,佔領了山東一帶。曹嶷當初跟隨王彌在東萊起兵,有勇有謀。征戰山東時,他廣行善施,任命郡吏,革新苛政,因此很得青州的人心,兵勢便日益強盛。苟純把齊魯大地都丟失給了他,現在只好閉城獨守青州。苟晞回救青州。曹嶷軍隊非常強大,連營幾十裏。苟晞登上青州城樓望去,面有懼色。然而苟晞軍隊畢竟是晉軍第一精鋭,和曹嶷連續作戰多次,把他打敗。曹嶷退守高密。
公元311年春正月,曹嶷重整人馬,再次進逼青州。苟晞率軍出戰,結果遇上大風,揚起的塵土把他的軍隊給搞亂了,而曹嶷則率軍順風而上,把苟晞打得落花流水。曹嶷於是全部佔領了山東。苟晞帶了少數人馬逃到高平,佔領了儲糧倉庫,又招募到幾千人,勢力又略有恢復。
同時,石勒在消滅了侯脱和嚴嶷後,兼併了他們的隊伍,因此軍勢越來越強盛。石勒又在襄城殺了王如弟弟王璃,再次進駐長江以西,便有雄據江漢的大志。謀臣張賓覺得這不是好策略,勸石勒回到北方。石勒的勢力這時正在強盛之際,便不肯聽從。江漢是琅邪王司馬睿的地盤。他擔心石勒南侵,便派王導帶兵討伐石勒。石勒軍糧接不上,又遇到瘟疫,一半以上士卒都死於瘟疫。石勒後悔不聽張賓的話,便根據張賓的建議,率領精兵渡過沔水(現漢江),入侵併很快攻拔了江夏。晉江夏太守楊岠棄城逃走。二月,石勒繼而北上進攻新蔡,在南頓殺了新蔡王司馬確。於是周圍郡縣全都聞風喪膽。朗陵公何襲、上黨太守羊綜、廣平太守邵肇等都相繼率眾投降石勒。石勒進而攻陷許昌,殺了守將王康。
再説司馬越和苟晞有矛盾,河南尹潘滔和尚書劉望等人又一直在他面前講苟晞的壞話。苟晞聽説後大怒,上奏要求得到潘滔等人的首級,揚言説:“司馬元超作為宰相辦事不公平,導致天下大亂,我苟道將怎麼可能熟視無睹!當年韓信因為小恩小惠而不能痛下決心,結果死在婦人手裏。今天我將誅殺國賊,再尊王室,成為齊桓公和晉文公的日子已經不遠了!”便送檄文給各州,強調自己的功勞,陳列司馬越的罪狀。
晉懷帝也恨司馬越的專權,以及屢次違揹他的詔命。更有甚者,司馬越所任命的留守將領何倫等人,不但抄掠公卿大臣的財產,還威逼侮辱皇室的公主。晉懷帝便秘密賜給苟晞手詔,讓他討伐司馬越。苟晞再次上奏説:“殿中校尉李初來後,臣看到了手詔,心膽俱裂。東海王司馬越仗着自己是宗室大臣,便專執朝政,委任邪佞,寵樹奸黨。潘滔、畢邈、郭象等人操弄天權,刑賞全由自己。大臣何綏、繆播、繆胤、應紹,都是聖詔親自任命的,而潘滔等人居然陷害並最終殺害了他們。臣雖然無比憤懣,但必須堅守東邊。現在臣接受明詔,激勵三軍奮勇,卷甲長驅,進駐倉垣。前幾天承蒙司空王浚的來信,説殿中中郎劉權持詔,命令王浚和臣共同剋期大舉。我即刻派遣前鋒王贊前往項城,讓司馬越稽首歸政,斬送潘滔等人。還希望陛下寬宥宗室大臣,聽任司馬越歸還他的藩國。臣同時還派遣揚烈將軍閻弘帶領步騎五千,鎮衞宗廟。”
那時苟晞已從高平來到成皋,多次和晉懷帝書信往來。司馬越駐軍在項城,懷疑他們經常來往,便派遊騎在成皋到洛陽的路上守候,果然獲得苟晞使者以及晉懷帝的詔書。司馬越便下檄文羅列苟晞的罪狀,同時任命大臣楊瑁為兗州刺史,派他和徐州刺史裴盾一道討伐苟晞。
苟晞派遣一千精騎進京收捕潘滔。潘滔得報,連夜逃遁得免一死。苟晞的人馬只捉住了尚書劉曾和侍中程延,把他們都殺了。司馬越在項城聽説這事,憂憤成疾,又無可奈何,便重病不起,於是將後事交付給太尉王衍。三月,司馬越在項城去世,到此,八王之亂的八位晉室封王都死了,但大亂並未結束,而西晉王朝因此也很快就終結了。