Where can I find the serial number of the Raspberry Pi I am currently using?
-
2is the serial number printed on the device or is it only available through software? I see there is a sticker on the device but I don't think that it is related to the serial number. It would be nice to know the ID of the device without having to power it on and connect it.– ScoopCommented Oct 4, 2012 at 21:54
-
4@AlexisK It's only available in software.– Alex ChamberlainCommented Oct 8, 2012 at 10:21
-
3Correct, there doesn't seem to be any relation with the sticker and serial number. I've read the sticker of a number of Pi's and tried to decode it. While Raspberry probably has internal lists connecting both, it doesn't seem that there is any way to calculate the serial or MAC from it.– EDPCommented Aug 15, 2015 at 9:24
11 Answers
The serial number can be found in /proc/cpuinfo
; for example,
pi@raspberrypi:~$ cat /proc/cpuinfo
Processor : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 697.95
Features : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7
Hardware : BCM2708
Revision : 1000002
Serial : 000000000000000d
Bash
You can use very basic bash piping
cat /proc/cpuinfo | grep Serial | cut -d ' ' -f 2
Since tabs are used on the left side of the colon, cutting on the space character will reliably catch only the serial number.
Prior versions of this answer cut on the colon, which produced a leading space in the variable. That leading space is not removed during variable assignment as was previously suggested.
Bash/Perl
In Bash, it is very simple to extract... by using Perl. Use
cat /proc/cpuinfo | perl -n -e '/^Serial\s*:\s([0-9a-f]{16})$/ && print "$1\n"'
For example,
$ cat /proc/cpuinfo | perl -n -e '/^Serial\s*:\s([0-9a-f]{16})$/ && print "$1\n"'
000000000000000d
Python
Raspberry Spy provides a very useful Python example.
def getserial():
# Extract serial from cpuinfo file
cpuserial = "0000000000000000"
try:
f = open('/proc/cpuinfo','r')
for line in f:
if line[0:6]=='Serial':
cpuserial = line[10:26]
f.close()
except:
cpuserial = "ERROR000000000"
return cpuserial
References
-
8Perl will accept filenames as arguments. It's not necessary to use
cat
. Commented Oct 4, 2012 at 21:18 -
4the last 6 digits of my serial number are the same as the last 6 digits of my MAC address. Is this true for you?– ScoopCommented Oct 4, 2012 at 21:51
-
7
-
5Is there any way to get this information physically? I mean on the board, so I dont have to boot every pi to get this information.– ZeezerCommented Nov 30, 2016 at 14:46
-
4Is it unique? seems a little short ... in my serial only 4 bytes used, all rest are zeroes Commented Dec 14, 2016 at 23:18
/sys/firmware/devicetree/base/serial-number
seems to be more universal nowadays.
And it doesn't require any additional processing.
# SN=$(cat /sys/firmware/devicetree/base/serial-number)
# echo $SN
0000000061c8eda7
BTW, here is model as well (`/sys/firmware/devicetree/base/model`)
-
This is a really good way that also avoids using pipes and stuff to get the serial number. Tested to work on my Rpi4. Will report if it doesn't work on previous models.– gromainCommented Sep 14, 2020 at 16:19
-
@gromain Tested with 2b/3b/3b+ as well. It should work with any RPi with a DT-enabled kernel.– edo1Commented Sep 14, 2020 at 21:46
Bash/Grep
Using grep
:
grep -Po '^Serial\s*:\s*\K[[:xdigit:]]{16}' /proc/cpuinfo
Bash
Using pure Bash without using any external utilities:
pattern='^Serial.*([[:xdigit:]]{16})$'
while read -r line
do
if [[ $line =~ $pattern ]]
then
echo "${BASH_REMATCH[1]}"
fi
done < /proc/cpuinfo
The output of either of the above is the same.
-
-
This doesn't work: 'P' is an invalid option. At least in pcpAudioCore– theking2Commented Apr 17, 2017 at 16:06
-
1@theking2: I'm afraid I'm unfamiliar with pcpAudioCore. The
-P
(Perl regex) is an option of modern versions of GNUgrep
. Commented Apr 17, 2017 at 17:26
Bash/Awk
Since this turned out to be some kind of "how many ways can you get the serial" here is the awk version
awk '/^Serial\s*:\s/{print $3}' /proc/cpuinfo
NodeJS
For anyone interested here is a way to get the Raspberry Serial Number using NodeJS:
function getserial(){
var fs = require('fs');
var content = fs.readFileSync('/proc/cpuinfo', 'utf8');
var cont_array = content.split("\n");
var serial_line = cont_array[cont_array.length-2];
var serial = serial_line.split(":");
return serial[1].slice(1);
}
-
For whatever reason, content_array.length-2 doesn't always work for me. Sometimes it gives me "Raspberry Pi 4 Model B Rev 1.1" which is the "Model" line right after the "Serial" line. So I changed your function to this (see next comment) to make sure. Commented Oct 5, 2019 at 21:34
-
1function getserial() { var fs = require('fs'); var content = fs.readFileSync('/proc/cpuinfo', 'utf8'); var cont_array = content.split("\n"); var x = 0; var serial_line = ""; while (x < cont_array.length) { serial_line = cont_array[x]; if (serial_line.startsWith("Serial")) { return serial_line.split(":")[1].slice(1); } x++; } } Commented Oct 5, 2019 at 21:34
-
1@fivedogit's edit is a much more appropriate way to parse the output IMO. If you were telling a human how to parse that output, you'd tell them to look for the line beginning with 'Serial', not to look for the second line.– p10benCommented Dec 30, 2020 at 5:45
grep -i serial /proc/cpuinfo | cut -d : -f2
-
2programming golf is not encouraged on the web-site, because it's very difficult to follow your answer for beginners, especially if you don't write any explanation or detailed comment.– lenikCommented May 10, 2014 at 8:03
-
3I'd oppose to call this answer "programming golf" comparing to even more cryptic one like "Bash/Awk". Actually, I intended to uplift this answer for sake of equality, but after running it on my PI and comparing to other version, won't do it because must admit, this answer is not giving precise output by inserting extra leading space. PS: I won't minus it too though– Van JoneCommented Mar 25, 2015 at 23:48
-
It still depends on the 'Serial' line being the second to last in the output. There's no guarantee this will always be the case and may change in future kernels. Far better to search for the 'Serial' header, as per @fivedogit's comment to another answer.– p10benCommented Dec 30, 2020 at 5:46
Using awk
:
cat /proc/cpuinfo | grep Serial | awk ' {print $3}'
-
7
Most-answered question on this SE?... maybe just do this:
$ grep Serial /proc/cpuinfo
And as a bonus:
- Raspberry Pis have "randomly assigned" serial numbers that are written to non-volatile memory. Long discussion here on whether or not these serial numbers are unique, but the bottom line is that the algorithm is proprietary to the chip manufacturer. Which effectively means, "nobody knows if the serial number can be counted on to be truly unique". It's apparently considered "unique enough" to protect a £2.40 MPEG-2 license key though - if that lets you sleep better :)
The shortest and simplest hasn't been provided as an answer yet. This, in sed:
sed -n '/^Serial/{s/.* //;p}' /proc/cpuinfo
meaning:
sed -n
— run the stream editor without printing every line/^Serial/
— match only lines that start with the word “Serial”s/.* //;
— replace everything up until the last space with nothing (sed regexes are greedy, btw)p
— print the result.
sed sometimes gets a bad name for being hard to use and cryptic, but it is available and works the same way (as long as you stick to POSIX conventions) on many types of Linux and Unix.
-
1My one-liner to even remove leading zeros:
sed -n 's/^Serial\s*: 0*//p' /proc/cpuinfo
– thomasCommented May 22, 2018 at 15:28
Yes. Indeed this the way to get it.
It is funny that my Pi0 has the same data (serial) as above example. There is no diferentiator between my PI0 serial and the one posted by Alex Chamberlain
For PI3 yo got 4 procesors
#cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 1
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 2
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 3
model name : ARMv7 Processor rev 4 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
Hardware : BCM2709
Revision : a02082
Serial : 000000003d1d1c36
I had posted my own answer elsewhere but tried one of the Answers on this recently edit Question.
I had previously said this could be found using vcgencmd otp_dump | grep 28:
as the serial number is programmed into the OTP register
NOTE The value in OTP register 28 should be the definitive answer as all other methods are just an alternate method of accessing the value programmed at manufacture.
These are 32 bit values represented in hex.
This DOES NOT agree with the value in /proc/cpuinfo
in my Pi4 as shown by e.g. awk '/Serial/ {print $3}' /proc/cpuinfo
I had some time ago predicted the Foundation would run out of 32 bit numbers, which seems to have happened as it is now a 64 bit number with a leading 1