在農民起義風起雲湧的同時,隋朝內部也分崩離析。李淵目睹動蕩不安的天下局勢,從中看到了舉兵起事的時機。
公元617年2月,馬邑人劉武周起兵,殺太守王仁恭,自稱天子,國號定陽。李淵遂以討伐劉武周為名,積極募兵。李淵以維護隋朝統治者的身份出現,遠近的武裝紛紛雲集,不幾天就有近萬人加入李淵直接控製的軍隊。
李淵的行動,引起忠於隋煬帝的副留守王威和高君雅的懷疑。公元617年5月14日的夜裏,李淵命李世民在晉陽宮城外埋下伏兵。第二天早晨,李淵和王威、高君雅議事。晉陽(今山西太原)令劉文靜領開陽府的司馬劉政會到庭中,說有密狀給李淵。李淵便讓他交上來,但劉會政不交,說要告的是副留守,隻有李淵才能看。李淵假裝吃驚地說:“怎麼會有這種事?”李淵看後便對大家說:“王威、高君雅要勾結突厥入侵。”於是命人逮捕了他們二人。第二天,果然有突厥幾萬人圍攻太原,人們都信以為真,李淵趁機將王威和高君雅二人處死。
殺掉王威和高君雅消除了內患之後,李淵便和將士嚴密防守,對付突厥。他命裴寂和劉文靜堅守城防,同時又讓大門洞開。城牆上也不樹旗幟。守城士兵不許張望、喧嘩。這使突厥軍隊不明底細,不敢入城。李淵又在夜裏派兵出城,早晨改道進城,使突厥誤以為是援兵到達。突厥軍隊不敢戀戰,隻好退兵。突厥兵雖然退去了,但難保不再來,為了從根本上解決問題,李淵給突厥送去書信:“若能從我,不侵百姓,征伐所得,子女玉帛,皆可汗有之。”為了穩住突厥,李淵委曲求全地用了臣子的語氣。
公元617年7月,李淵率軍3萬,正式起兵。李淵傳檄諸郡稱“義兵”,以維護隋朝社會安定。
李淵在太原起兵之後,便以進軍關中拿下長安為最終目標。西進的第一個障礙便是西河郡。李建成和李世民兄弟僅用了9天便得勝而歸,使得李淵喜出望外。
然後,李淵建立了自己的軍事機構:設置大將軍府,自稱大將軍。長子李建成為隴西公、左領軍大都督,統領左三軍。李世民為敦煌公、右領軍大都督,統領右三軍。裴寂和劉文靜為長史司馬。
李淵第二戰是決戰霍邑。霍邑的西北有個賈胡堡,是霍邑的門戶,但守衛霍邑的宋老生卻沒有派兵把守,李淵由此斷定宋老生是個無能之輩。
李淵害怕宋老生守城不出,打持久戰對自己不利。於是李淵讓兩個兒子領幾十名騎兵近城觀察,自己將部隊分成十幾隊,從城東南到西南,擺出一副攻城的架勢。宋老生果然中計,以為李淵要攻城,便領兵3萬出戰。李淵領兵假裝後退,讓李建成和李世民領兵搶占了東門和南門,切斷了宋老生的退路。在交戰中李淵又散布宋老生已經戰死的謠言,動搖了軍心。隋軍大敗,全軍覆沒。李淵順利占領了霍邑。
此後,李淵又攻打河東,沒有攻下。李淵便聽從了李世民直接入關中的建議,分兵攻打長安。在招降長安失敗後,李淵下令攻城,占領之後又下令禁止擄掠百姓,受到百姓們夾道歡迎。公元617年11月,李淵擁立隋代王楊侑為帝,即隋恭帝,改元義寧,尊在江都的隋煬帝為太上皇,李淵為大丞相,封唐王,以武德殿為丞相府,李世民為秦王。這實際上是李淵日後稱帝的一個過渡。
到公元618年5月,隋煬帝楊廣的右屯衛將軍宇文化及在江都兵變,勒死了隋煬帝楊廣。然後立秦王楊浩為帝,自己做大丞相。隨後宇文化及領兵10萬北上,但被李密打敗,宇文化及敗走魏縣,毒死楊浩,自己稱帝,建立鄭國。第二年,過了皇帝癮的宇文化及在聊城被竇建德殺死。隋煬帝楊廣一死,李淵便不再需要隋恭帝這個傀儡了。公元618年,李淵逼楊侑禪位,稱帝建立唐朝,改年號為武德,定都長安。